diff --git a/README.md b/README.md
index cf795f6..d6247de 100644
--- a/README.md
+++ b/README.md
@@ -21,6 +21,7 @@ wx-chart是一个跨平台的图形库,可在普通站点,React环境以及
##### 近期计划支持图表
- [x] 增加动画效果
- [x] Canvas中间层优化
+- [x] 增加bar,line点展示
- [ ] 增加Tooltip
- [ ] 雷达图
- [ ] 泡状图
@@ -28,15 +29,16 @@ wx-chart是一个跨平台的图形库,可在普通站点,React环境以及
- [ ] 支持React Native
## 实际效果以及Demo
-微信场景下
+#### PC场景下
+![all](https://user-images.githubusercontent.com/4920540/31314620-66222d5a-ac37-11e7-836f-82b346bae3c2.gif)
-
+#### 微信场景下
+
+
-
+
-PC场景下
-![all](https://user-images.githubusercontent.com/4920540/31167949-56e700b8-a926-11e7-8035-f5b3d10fbe88.gif)
## 快速使用
@@ -121,6 +123,9 @@ https://github.com/xch89820/wx-chart-react
https://www.kancloud.cn/xchhhh/wx-chart
## ChangeLog
+v0.3.3
+增加bar,line点展示
+
v0.3.2
增加动画效果
diff --git a/dist/wx-chart.js b/dist/wx-chart.js
index 141d90f..da0cf0c 100644
--- a/dist/wx-chart.js
+++ b/dist/wx-chart.js
@@ -2244,978 +2244,1188 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
return 0;
};
}, {}], 10: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
+ // TinyColor v1.4.1
+ // https://github.com/bgrins/TinyColor
+ // Brian Grinstead, MIT License
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ (function (Math) {
- var _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ var trimLeft = /^\s+/,
+ trimRight = /\s+$/,
+ tinyCounter = 0,
+ mathRound = Math.round,
+ mathMin = Math.min,
+ mathMax = Math.max,
+ mathRandom = Math.random;
+
+ function tinycolor(color, opts) {
+
+ color = color ? color : '';
+ opts = opts || {};
+
+ // If input is already a tinycolor, return itself
+ if (color instanceof tinycolor) {
+ return color;
+ }
+ // If we are called as a function, call using new instead
+ if (!(this instanceof tinycolor)) {
+ return new tinycolor(color, opts);
}
- }return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
- };
- }();
- var _get = function get(object, property, receiver) {
- if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {
- var parent = Object.getPrototypeOf(object);if (parent === null) {
- return undefined;
- } else {
- return get(parent, property, receiver);
+ var rgb = inputToRGB(color);
+ this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = mathRound(100 * this._a) / 100, this._format = opts.format || rgb.format;
+ this._gradientType = opts.gradientType;
+
+ // Don't let the range of [0,255] come back in [0,1].
+ // Potentially lose a little bit of precision here, but will fix issues where
+ // .5 gets interpreted as half of the total, instead of half of 1
+ // If it was supposed to be 128, this was already taken care of by `inputToRgb`
+ if (this._r < 1) {
+ this._r = mathRound(this._r);
}
- } else if ("value" in desc) {
- return desc.value;
- } else {
- var getter = desc.get;if (getter === undefined) {
- return undefined;
- }return getter.call(receiver);
+ if (this._g < 1) {
+ this._g = mathRound(this._g);
+ }
+ if (this._b < 1) {
+ this._b = mathRound(this._b);
+ }
+
+ this._ok = rgb.ok;
+ this._tc_id = tinyCounter++;
}
- };
- var _es6Mixins = require('es6-mixins');
+ tinycolor.prototype = {
+ isDark: function isDark() {
+ return this.getBrightness() < 128;
+ },
+ isLight: function isLight() {
+ return !this.isDark();
+ },
+ isValid: function isValid() {
+ return this._ok;
+ },
+ getOriginalInput: function getOriginalInput() {
+ return this._originalInput;
+ },
+ getFormat: function getFormat() {
+ return this._format;
+ },
+ getAlpha: function getAlpha() {
+ return this._a;
+ },
+ getBrightness: function getBrightness() {
+ //http://www.w3.org/TR/AERT#color-contrast
+ var rgb = this.toRgb();
+ return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
+ },
+ getLuminance: function getLuminance() {
+ //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
+ var rgb = this.toRgb();
+ var RsRGB, GsRGB, BsRGB, R, G, B;
+ RsRGB = rgb.r / 255;
+ GsRGB = rgb.g / 255;
+ BsRGB = rgb.b / 255;
+
+ if (RsRGB <= 0.03928) {
+ R = RsRGB / 12.92;
+ } else {
+ R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
+ }
+ if (GsRGB <= 0.03928) {
+ G = GsRGB / 12.92;
+ } else {
+ G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
+ }
+ if (BsRGB <= 0.03928) {
+ B = BsRGB / 12.92;
+ } else {
+ B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
+ }
+ return 0.2126 * R + 0.7152 * G + 0.0722 * B;
+ },
+ setAlpha: function setAlpha(value) {
+ this._a = boundAlpha(value);
+ this._roundA = mathRound(100 * this._a) / 100;
+ return this;
+ },
+ toHsv: function toHsv() {
+ var hsv = rgbToHsv(this._r, this._g, this._b);
+ return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
+ },
+ toHsvString: function toHsvString() {
+ var hsv = rgbToHsv(this._r, this._g, this._b);
+ var h = mathRound(hsv.h * 360),
+ s = mathRound(hsv.s * 100),
+ v = mathRound(hsv.v * 100);
+ return this._a == 1 ? "hsv(" + h + ", " + s + "%, " + v + "%)" : "hsva(" + h + ", " + s + "%, " + v + "%, " + this._roundA + ")";
+ },
+ toHsl: function toHsl() {
+ var hsl = rgbToHsl(this._r, this._g, this._b);
+ return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
+ },
+ toHslString: function toHslString() {
+ var hsl = rgbToHsl(this._r, this._g, this._b);
+ var h = mathRound(hsl.h * 360),
+ s = mathRound(hsl.s * 100),
+ l = mathRound(hsl.l * 100);
+ return this._a == 1 ? "hsl(" + h + ", " + s + "%, " + l + "%)" : "hsla(" + h + ", " + s + "%, " + l + "%, " + this._roundA + ")";
+ },
+ toHex: function toHex(allow3Char) {
+ return rgbToHex(this._r, this._g, this._b, allow3Char);
+ },
+ toHexString: function toHexString(allow3Char) {
+ return '#' + this.toHex(allow3Char);
+ },
+ toHex8: function toHex8(allow4Char) {
+ return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
+ },
+ toHex8String: function toHex8String(allow4Char) {
+ return '#' + this.toHex8(allow4Char);
+ },
+ toRgb: function toRgb() {
+ return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };
+ },
+ toRgbString: function toRgbString() {
+ return this._a == 1 ? "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
+ },
+ toPercentageRgb: function toPercentageRgb() {
+ return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a };
+ },
+ toPercentageRgbString: function toPercentageRgbString() {
+ return this._a == 1 ? "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
+ },
+ toName: function toName() {
+ if (this._a === 0) {
+ return "transparent";
+ }
- var _es6Mixins2 = _interopRequireDefault(_es6Mixins);
+ if (this._a < 1) {
+ return false;
+ }
- var _helper = require('../util/helper');
+ return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
+ },
+ toFilter: function toFilter(secondColor) {
+ var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);
+ var secondHex8String = hex8String;
+ var gradientType = this._gradientType ? "GradientType = 1, " : "";
- var _tinycolor = require('../util/tinycolor');
+ if (secondColor) {
+ var s = tinycolor(secondColor);
+ secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);
+ }
- var _tinycolor2 = _interopRequireDefault(_tinycolor);
+ return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")";
+ },
+ toString: function toString(format) {
+ var formatSet = !!format;
+ format = format || this._format;
+
+ var formattedString = false;
+ var hasAlpha = this._a < 1 && this._a >= 0;
+ var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
+
+ if (needsAlphaFormat) {
+ // Special case for "transparent", all other non-alpha formats
+ // will return rgba when there is transparency.
+ if (format === "name" && this._a === 0) {
+ return this.toName();
+ }
+ return this.toRgbString();
+ }
+ if (format === "rgb") {
+ formattedString = this.toRgbString();
+ }
+ if (format === "prgb") {
+ formattedString = this.toPercentageRgbString();
+ }
+ if (format === "hex" || format === "hex6") {
+ formattedString = this.toHexString();
+ }
+ if (format === "hex3") {
+ formattedString = this.toHexString(true);
+ }
+ if (format === "hex4") {
+ formattedString = this.toHex8String(true);
+ }
+ if (format === "hex8") {
+ formattedString = this.toHex8String();
+ }
+ if (format === "name") {
+ formattedString = this.toName();
+ }
+ if (format === "hsl") {
+ formattedString = this.toHslString();
+ }
+ if (format === "hsv") {
+ formattedString = this.toHsvString();
+ }
- var _randomColor = require('../util/randomColor');
+ return formattedString || this.toHexString();
+ },
+ clone: function clone() {
+ return tinycolor(this.toString());
+ },
- var _randomColor2 = _interopRequireDefault(_randomColor);
+ _applyModification: function _applyModification(fn, args) {
+ var color = fn.apply(null, [this].concat([].slice.call(args)));
+ this._r = color._r;
+ this._g = color._g;
+ this._b = color._b;
+ this.setAlpha(color._a);
+ return this;
+ },
+ lighten: function lighten() {
+ return this._applyModification(_lighten, arguments);
+ },
+ brighten: function brighten() {
+ return this._applyModification(_brighten, arguments);
+ },
+ darken: function darken() {
+ return this._applyModification(_darken, arguments);
+ },
+ desaturate: function desaturate() {
+ return this._applyModification(_desaturate, arguments);
+ },
+ saturate: function saturate() {
+ return this._applyModification(_saturate, arguments);
+ },
+ greyscale: function greyscale() {
+ return this._applyModification(_greyscale, arguments);
+ },
+ spin: function spin() {
+ return this._applyModification(_spin, arguments);
+ },
- var _wxCanvas = require('../util/wxCanvas');
+ _applyCombination: function _applyCombination(fn, args) {
+ return fn.apply(null, [this].concat([].slice.call(args)));
+ },
+ analogous: function analogous() {
+ return this._applyCombination(_analogous, arguments);
+ },
+ complement: function complement() {
+ return this._applyCombination(_complement, arguments);
+ },
+ monochromatic: function monochromatic() {
+ return this._applyCombination(_monochromatic, arguments);
+ },
+ splitcomplement: function splitcomplement() {
+ return this._applyCombination(_splitcomplement, arguments);
+ },
+ triad: function triad() {
+ return this._applyCombination(_triad, arguments);
+ },
+ tetrad: function tetrad() {
+ return this._applyCombination(_tetrad, arguments);
+ }
+ };
- var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
+ // If input is an object, force 1 into "1.0" to handle ratios properly
+ // String input requires "1.0" as input, so 1 will be treated as 1
+ tinycolor.fromRatio = function (color, opts) {
+ if ((typeof color === "undefined" ? "undefined" : _typeof2(color)) == "object") {
+ var newColor = {};
+ for (var i in color) {
+ if (color.hasOwnProperty(i)) {
+ if (i === "a") {
+ newColor[i] = color[i];
+ } else {
+ newColor[i] = convertToPercentage(color[i]);
+ }
+ }
+ }
+ color = newColor;
+ }
- var _wxChart = require('./wxChart');
+ return tinycolor(color, opts);
+ };
- var _wxChart2 = _interopRequireDefault(_wxChart);
+ // Given a string or object, convert that input to RGB
+ // Possible string inputs:
+ //
+ // "red"
+ // "#f00" or "f00"
+ // "#ff0000" or "ff0000"
+ // "#ff000000" or "ff000000"
+ // "rgb 255 0 0" or "rgb (255, 0, 0)"
+ // "rgb 1.0 0 0" or "rgb (1, 0, 0)"
+ // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
+ // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
+ // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
+ // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
+ // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
+ //
+ function inputToRGB(color) {
+
+ var rgb = { r: 0, g: 0, b: 0 };
+ var a = 1;
+ var s = null;
+ var v = null;
+ var l = null;
+ var ok = false;
+ var format = false;
+
+ if (typeof color == "string") {
+ color = stringInputToObject(color);
+ }
+
+ if ((typeof color === "undefined" ? "undefined" : _typeof2(color)) == "object") {
+ if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
+ rgb = rgbToRgb(color.r, color.g, color.b);
+ ok = true;
+ format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
+ } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
+ s = convertToPercentage(color.s);
+ v = convertToPercentage(color.v);
+ rgb = hsvToRgb(color.h, s, v);
+ ok = true;
+ format = "hsv";
+ } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
+ s = convertToPercentage(color.s);
+ l = convertToPercentage(color.l);
+ rgb = hslToRgb(color.h, s, l);
+ ok = true;
+ format = "hsl";
+ }
+
+ if (color.hasOwnProperty("a")) {
+ a = color.a;
+ }
+ }
+
+ a = boundAlpha(a);
- var _title = require('../core/title');
+ return {
+ ok: ok,
+ format: color.format || format,
+ r: mathMin(255, mathMax(rgb.r, 0)),
+ g: mathMin(255, mathMax(rgb.g, 0)),
+ b: mathMin(255, mathMax(rgb.b, 0)),
+ a: a
+ };
+ }
- var _title2 = _interopRequireDefault(_title);
+ // Conversion Functions
+ // --------------------
- var _scale = require('../core/scale');
+ // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
+ //
- var _scale2 = _interopRequireDefault(_scale);
+ // `rgbToRgb`
+ // Handle bounds / percentage checking to conform to CSS color spec
+ //
+ // *Assumes:* r, g, b in [0, 255] or [0, 1]
+ // *Returns:* { r, g, b } in [0, 255]
+ function rgbToRgb(r, g, b) {
+ return {
+ r: bound01(r, 255) * 255,
+ g: bound01(g, 255) * 255,
+ b: bound01(b, 255) * 255
+ };
+ }
- var _scale3 = require('../scale/scale.liner');
+ // `rgbToHsl`
+ // Converts an RGB color value to HSL.
+ // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
+ // *Returns:* { h, s, l } in [0,1]
+ function rgbToHsl(r, g, b) {
- var _scale4 = _interopRequireDefault(_scale3);
+ r = bound01(r, 255);
+ g = bound01(g, 255);
+ b = bound01(b, 255);
- var _scale5 = require('../scale/scale.crosshelp');
+ var max = mathMax(r, g, b),
+ min = mathMin(r, g, b);
+ var h,
+ s,
+ l = (max + min) / 2;
- var _scale6 = _interopRequireDefault(_scale5);
+ if (max == min) {
+ h = s = 0; // achromatic
+ } else {
+ var d = max - min;
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+ switch (max) {
+ case r:
+ h = (g - b) / d + (g < b ? 6 : 0);break;
+ case g:
+ h = (b - r) / d + 2;break;
+ case b:
+ h = (r - g) / d + 4;break;
+ }
- var _scale7 = require('../scale/scale.stackhelp');
+ h /= 6;
+ }
- var _scale8 = _interopRequireDefault(_scale7);
+ return { h: h, s: s, l: l };
+ }
- var _scale9 = require('../scale/scale.category');
+ // `hslToRgb`
+ // Converts an HSL color value to RGB.
+ // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
+ // *Returns:* { r, g, b } in the set [0, 255]
+ function hslToRgb(h, s, l) {
+ var r, g, b;
- var _scale10 = _interopRequireDefault(_scale9);
+ h = bound01(h, 360);
+ s = bound01(s, 100);
+ l = bound01(l, 100);
- var _legend = require('../core/legend');
+ function hue2rgb(p, q, t) {
+ if (t < 0) t += 1;
+ if (t > 1) t -= 1;
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
+ if (t < 1 / 2) return q;
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
+ return p;
+ }
- var _legend2 = _interopRequireDefault(_legend);
+ if (s === 0) {
+ r = g = b = l; // achromatic
+ } else {
+ var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+ var p = 2 * l - q;
+ r = hue2rgb(p, q, h + 1 / 3);
+ g = hue2rgb(p, q, h);
+ b = hue2rgb(p, q, h - 1 / 3);
+ }
- var _layout = require('../core/layout');
+ return { r: r * 255, g: g * 255, b: b * 255 };
+ }
- var _layout2 = _interopRequireDefault(_layout);
+ // `rgbToHsv`
+ // Converts an RGB color value to HSV
+ // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
+ // *Returns:* { h, s, v } in [0,1]
+ function rgbToHsv(r, g, b) {
- var _animation = require('../core/animation');
+ r = bound01(r, 255);
+ g = bound01(g, 255);
+ b = bound01(b, 255);
- var _animation2 = _interopRequireDefault(_animation);
+ var max = mathMax(r, g, b),
+ min = mathMin(r, g, b);
+ var h,
+ s,
+ v = max;
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : { default: obj };
- }
+ var d = max - min;
+ s = max === 0 ? 0 : d / max;
- function _toConsumableArray(arr) {
- if (Array.isArray(arr)) {
- for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
- arr2[i] = arr[i];
- }return arr2;
- } else {
- return Array.from(arr);
+ if (max == min) {
+ h = 0; // achromatic
+ } else {
+ switch (max) {
+ case r:
+ h = (g - b) / d + (g < b ? 6 : 0);break;
+ case g:
+ h = (b - r) / d + 2;break;
+ case b:
+ h = (r - g) / d + 4;break;
+ }
+ h /= 6;
+ }
+ return { h: h, s: s, v: v };
}
- }
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
+ // `hsvToRgb`
+ // Converts an HSV color value to RGB.
+ // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
+ // *Returns:* { r, g, b } in the set [0, 255]
+ function hsvToRgb(h, s, v) {
+
+ h = bound01(h, 360) * 6;
+ s = bound01(s, 100);
+ v = bound01(v, 100);
+
+ var i = Math.floor(h),
+ f = h - i,
+ p = v * (1 - s),
+ q = v * (1 - f * s),
+ t = v * (1 - (1 - f) * s),
+ mod = i % 6,
+ r = [v, q, p, p, t, v][mod],
+ g = [t, v, v, q, p, p][mod],
+ b = [p, p, t, v, v, q][mod];
+
+ return { r: r * 255, g: g * 255, b: b * 255 };
}
- }
- function _possibleConstructorReturn(self, call) {
- if (!self) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }return call && ((typeof call === "undefined" ? "undefined" : _typeof2(call)) === "object" || typeof call === "function") ? call : self;
- }
+ // `rgbToHex`
+ // Converts an RGB color to hex
+ // Assumes r, g, and b are contained in the set [0, 255]
+ // Returns a 3 or 6 character hex
+ function rgbToHex(r, g, b, allow3Char) {
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof2(superClass)));
- }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
- }
+ var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];
- // Bar legend's default config
- var WX_BAR_LEGEND_DEFAULT_CONFIG = {
- borderWidth: 1,
- fillArea: true,
- fillAlpha: 0.5,
- display: true,
- // barWidth: 'auto' //Set each bar's width. If not set, the bars are sized automatically.
- barPercentage: 0.8 // Percent (0-1) of the available width each bar should be within the data point space,like the flexible layout~
- // fillStyle
- // strokeStyle
- };
- // Bar default config
- var WX_BAR_DEFAULT_CONFIG = {
- minBetweenPixel: 5, // The minisize space between each bar.
- pointPercentage: 0.8, // Percent (0-1) of the space for each data point
- stacked: false, // If true, bars are stacked on the x-axis
- zeroLine: false,
- // barPercentage: 0.8 // If stacked is true, global "barPercentage" setting will be effective. Otherwise, legend's setting priorities.
- // Scale options
- xScaleOptions: {
- position: 'bottom'
- },
- xScaleItemOptions: undefined,
- yScaleOptions: {
- position: 'left'
- },
- yScaleItemOptions: undefined,
- crossScaleOptions: {
- xMargin: function xMargin(xBox, yBox, area, xScale, yScale, xScaleDatasets) {
- return xScale.calculateTickWidth(xScaleDatasets, xBox);
- },
- xFirstPointSpace: 0
- },
- // The title text or a title config object
- title: undefined,
+ // Return a 3 character hex if possible
+ if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
+ return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
+ }
- // The legend of line chart
- legends: [], // borderWidth, fillArea, fillAlpha can be set in here
- legendOptions: {
- 'position': 'bottom'
- },
+ return hex.join("");
+ }
- point: {},
+ // `rgbaToHex`
+ // Converts an RGBA color plus alpha transparency to hex
+ // Assumes r, g, b are contained in the set [0, 255] and
+ // a in [0, 1]. Returns a 4 or 8 character rgba hex
+ function rgbaToHex(r, g, b, a, allow4Char) {
- // The randomColor scheme
- // See https://github.com/davidmerfield/randomColor
- color: {
- hue: 'red',
- luminosity: 'light'
- },
+ var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)), pad2(convertDecimalToHex(a))];
- // The dataset's default key
- defaultKey: 'value',
+ // Return a 4 character hex if possible
+ if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
+ return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
+ }
- // Animation
- animate: true,
- animateOptions: {
- start: 1,
- end: 1001,
- duration: 1000
+ return hex.join("");
}
- };
- var WX_BAR_ITEM_DEFAULT_CONFIG = {
- //borderWidth: 1,
- //fillArea: true,
- //fillAlpha: 0.5,
- //strokeStyle: '#ffffff',
- display: true
- };
+ // `rgbaToArgbHex`
+ // Converts an RGBA color to an ARGB Hex8 string
+ // Rarely used, but required for "toFilter()"
+ function rgbaToArgbHex(r, g, b, a) {
- var WxBar = function (_WxChart) {
- _inherits(WxBar, _WxChart);
+ var hex = [pad2(convertDecimalToHex(a)), pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];
- /**
- * WxBar chart
- * @constructor
- * @param {string} id - The canvas element's id
- * @param {Object} config
- * @param {number} [config.width=300] - The width of canvas.
- * @param {number} [config.height=200] - The height of canvas.
- * @param {number} [config.padding=] - The padding of canvas.
- * @param {string} [config.display=block] - The display style of chart.
- *
- * @param {Object} config.legendOptions=[] - The legend & label options.You should set 'key' to bind the attribute in datasets which is the value of the point.
- * @param {(string|Object)} [config.title=] - The title text or title options of chart.
- * @example
- *datasets:[{
- * valueA: 30,
- * valueB: 40,
- * label: '一月'
- * }, {
- * valueA: 20,
- * valueB: 50,
- * pointRadius: 2,
- * label: '二月'
- *},...]
- *
- * legends: [{
- * 'text': 'valueA Text',
- * 'key': 'valueA',
- * 'strokeStyle': '#3385ff',
- * 'barPercentage': 0.8
- * }, {
- * text: 'valueB Text',
- * key: 'valueB'
- * }]
- */
- function WxBar(id, config) {
- _classCallCheck(this, WxBar);
-
- var _this = _possibleConstructorReturn(this, (WxBar.__proto__ || Object.getPrototypeOf(WxBar)).call(this, id, config));
+ return hex.join("");
+ }
- _this.__drawBar = function (point, percent, legend, stacked, hasNeg) {
- var ctx = _this.ctx;
- var display = legend.display,
- borderWidth = legend.borderWidth,
- fillStyle = legend.fillStyle,
- strokeStyle = legend.strokeStyle,
- fillArea = legend.fillArea,
- fillAlpha = legend.fillAlpha;
+ // `equals`
+ // Can be called with any tinycolor input
+ tinycolor.equals = function (color1, color2) {
+ if (!color1 || !color2) {
+ return false;
+ }
+ return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
+ };
- var px = void 0,
- py = void 0,
- width = void 0,
- height = void 0;
- if (!point) {
- return { px: px, py: py, width: width, height: height };
- }
+ tinycolor.random = function () {
+ return tinycolor.fromRatio({
+ r: mathRandom(),
+ g: mathRandom(),
+ b: mathRandom()
+ });
+ };
- if (stacked && hasNeg) {
- width = point.barWidth;
- height = point.barHeight * percent;
- px = point.x;
- py = point.y + point.barHeight / 2 - height / 2;
- } else {
- px = point.x;
- width = point.barWidth;
- height = point.barHeight * percent;
- py = point.y + point.barHeight * (1 - percent);
- }
+ // Modification Functions
+ // ----------------------
+ // Thanks to less.js for some of the basics here
+ //
- ctx.save();
+ function _desaturate(color, amount) {
+ amount = amount === 0 ? 0 : amount || 10;
+ var hsl = tinycolor(color).toHsl();
+ hsl.s -= amount / 100;
+ hsl.s = clamp01(hsl.s);
+ return tinycolor(hsl);
+ }
- ctx.fillStyle = fillStyle;
- ctx.strokeStyle = strokeStyle;
- ctx.lineWidth = borderWidth;
- // First, fill
- if (fillArea) {
- ctx.beginPath();
- ctx.globalAlpha = fillAlpha;
- ctx.rect(px, py, width, height);
- ctx.fill();
- ctx.globalAlpha = 1;
- }
- // Next, stroke
- if (borderWidth) {
- ctx.beginPath();
- if (stacked && hasNeg) {
- ctx.rect(px, py, width, height);
- } else {
- ctx.moveTo(px, py + height);
- ctx.lineTo(px, py);
- ctx.lineTo(px + width, py);
- ctx.lineTo(px + width, py + height);
- }
- ctx.stroke();
- }
+ function _saturate(color, amount) {
+ amount = amount === 0 ? 0 : amount || 10;
+ var hsl = tinycolor(color).toHsl();
+ hsl.s += amount / 100;
+ hsl.s = clamp01(hsl.s);
+ return tinycolor(hsl);
+ }
- ctx.draw();
- ctx.restore();
+ function _greyscale(color) {
+ return tinycolor(color).desaturate(100);
+ }
- return { px: px, py: py, width: width, height: height };
- };
+ function _lighten(color, amount) {
+ amount = amount === 0 ? 0 : amount || 10;
+ var hsl = tinycolor(color).toHsl();
+ hsl.l += amount / 100;
+ hsl.l = clamp01(hsl.l);
+ return tinycolor(hsl);
+ }
- (0, _es6Mixins2.default)([_scale8.default], _this, {
- // Mixins will create a new method to nested call all duplicate method
- mergeDuplicates: false
- });
+ function _brighten(color, amount) {
+ amount = amount === 0 ? 0 : amount || 10;
+ var rgb = tinycolor(color).toRgb();
+ rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * -(amount / 100))));
+ rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * -(amount / 100))));
+ rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * -(amount / 100))));
+ return tinycolor(rgb);
+ }
- var me = _this;
- me.chartConfig = (0, _helper.extend)({}, WX_BAR_DEFAULT_CONFIG, config);
+ function _darken(color, amount) {
+ amount = amount === 0 ? 0 : amount || 10;
+ var hsl = tinycolor(color).toHsl();
+ hsl.l -= amount / 100;
+ hsl.l = clamp01(hsl.l);
+ return tinycolor(hsl);
+ }
- me.title = null;
- // Initialize title and legend
- if (me.chartConfig.title) {
- me.title = new _title2.default(me, _helper.is.PureObject(me.chartConfig.title) ? me.chartConfig.title : null);
- me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;
- }
+ // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
+ // Values outside of this range will be wrapped into this range.
+ function _spin(color, amount) {
+ var hsl = tinycolor(color).toHsl();
+ var hue = (hsl.h + amount) % 360;
+ hsl.h = hue < 0 ? 360 + hue : hue;
+ return tinycolor(hsl);
+ }
- // Initialize legend
- me.legend = new _legend2.default(me, me.chartConfig.legendOptions);
+ // Combination Functions
+ // ---------------------
+ // Thanks to jQuery xColor for some of the ideas behind these
+ //
- // Initialize x,y Scale
- me.yAxis = new _scale4.default(me, me.chartConfig.yScaleOptions);
- me.xAxis = new _scale10.default(me, me.chartConfig.xScaleOptions);
- me.wxCrossScale = new _scale6.default(me.xAxis, me.yAxis, me.chartConfig.crossScaleOptions);
- me.wxLayout = new _layout2.default(me);
+ function _complement(color) {
+ var hsl = tinycolor(color).toHsl();
+ hsl.h = (hsl.h + 180) % 360;
+ return tinycolor(hsl);
+ }
- // Initialize wxAnimation
- if (me.chartConfig.animate) me.wxAnimation = new _animation2.default(me.chartConfig.animateOptions);
+ function _triad(color) {
+ var hsl = tinycolor(color).toHsl();
+ var h = hsl.h;
+ return [tinycolor(color), tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })];
+ }
- me.emit('init', {
- options: me.chartConfig
- });
- return _this;
+ function _tetrad(color) {
+ var hsl = tinycolor(color).toHsl();
+ var h = hsl.h;
+ return [tinycolor(color), tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })];
}
- // Get/Set labels
+ function _splitcomplement(color) {
+ var hsl = tinycolor(color).toHsl();
+ var h = hsl.h;
+ return [tinycolor(color), tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l })];
+ }
+ function _analogous(color, results, slices) {
+ results = results || 6;
+ slices = slices || 30;
- _createClass(WxBar, [{
- key: '_getLegendConfig',
+ var hsl = tinycolor(color).toHsl();
+ var part = 360 / slices;
+ var ret = [tinycolor(color)];
- /**
- * Build legends config
- * @private
- */
- value: function _getLegendConfig() {
- var me = this,
- defaultKey = me.chartConfig.defaultKey || 'value',
- legendsConfig = me.chartConfig.legends;
- if (!legendsConfig) {
- if (me.labels && me.labels.length) {
- legendsConfig = me.labels.map(function (label) {
- return { 'text': label, 'key': defaultKey };
- });
- } else {
- throw new Error('Can not get legend config!');
- }
- } else {
- legendsConfig = legendsConfig.map(function (legend) {
- return (0, _helper.extend)(true, {
- 'key': defaultKey
- }, legend);
- });
- }
- return legendsConfig;
+ for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {
+ hsl.h = (hsl.h + part) % 360;
+ ret.push(tinycolor(hsl));
}
- /**
- * Update a datesets of chart and reDraw
- * @param {Object} datasets - data sets
- * @param {string} [datasets[].display] - Disaply the bar or not
- * @param {string} [datasets[].borderWidth=1] - Bar's border width
- * @param {string} [datasets[].strokeStyle] - Bar's border color
- * @param {number} [datasets[].fillArea=true] - Fill color or not
- * @param {number} [datasets[].fillAlpha=0.6] - Fill color Alpha
- * @param {number} [datasets[].fillStyle] - Fill color. The default color will randomly assigned by 'color' option.
- * @returns {*}
- */
+ return ret;
+ }
- }, {
- key: 'update',
- value: function update(datasets) {
- var me = this;
- me._labels = null;
- me._legends = null;
- _get(WxBar.prototype.__proto__ || Object.getPrototypeOf(WxBar.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_BAR_ITEM_DEFAULT_CONFIG, me.chartConfig.point));
- me.wxLayout.removeAllBox();
- if (me.wxAnimation) me.wxAnimation.reset();
- return me.draw();
+ function _monochromatic(color, results) {
+ results = results || 6;
+ var hsv = tinycolor(color).toHsv();
+ var h = hsv.h,
+ s = hsv.s,
+ v = hsv.v;
+ var ret = [];
+ var modification = 1 / results;
+
+ while (results--) {
+ ret.push(tinycolor({ h: h, s: s, v: v }));
+ v = (v + modification) % 1;
}
- /**
- * Draw chart
- */
- }, {
- key: 'draw',
- value: function draw() {
- var box = void 0,
- me = this,
- ctx = me.ctx,
- animate = me.chartConfig.animate,
- wxLayout = me.wxLayout;
- var _me$chartConfig = me.chartConfig,
- pointPercentage = _me$chartConfig.pointPercentage,
- minBetweenPixel = _me$chartConfig.minBetweenPixel,
- stacked = _me$chartConfig.stacked,
- color = _me$chartConfig.color,
- zeroLine = _me$chartConfig.zeroLine;
+ return ret;
+ }
- me.emit('beforeDraw', {
- options: me.chartConfig
- });
+ // Utility Functions
+ // ---------------------
- // First, we draw title
- box = wxLayout.adjustBox();
- if (me.title) {
- me.title.update(me.titleText, box);
- wxLayout.addBox(me.title.box);
- }
+ tinycolor.mix = function (color1, color2, amount) {
+ amount = amount === 0 ? 0 : amount || 50;
- // Second, random color and get legend datasets
- box = wxLayout.adjustBox();
- var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.legends.length }));
+ var rgb1 = tinycolor(color1).toRgb();
+ var rgb2 = tinycolor(color2).toRgb();
- me.legends = me.legends.map(function (legend, index) {
- if (!legend.strokeStyle) {
- legend.strokeStyle = legend.borderColor || (0, _tinycolor2.default)(rColors[index]).darken(10).toString();
- }
+ var p = amount / 100;
- return (0, _helper.extend)(true, {
- fillStyle: rColors[index]
- }, WX_BAR_LEGEND_DEFAULT_CONFIG, legend);
- });
- me.legend.update(me.legends, box);
- wxLayout.addBox(me.legend.box);
+ var rgba = {
+ r: (rgb2.r - rgb1.r) * p + rgb1.r,
+ g: (rgb2.g - rgb1.g) * p + rgb1.g,
+ b: (rgb2.b - rgb1.b) * p + rgb1.b,
+ a: (rgb2.a - rgb1.a) * p + rgb1.a
+ };
- // Thirdly, draw scale
- me._drawScale();
+ return tinycolor(rgba);
+ };
- // Calculate bar ruler
- me.barRuler = me.calculateBarRuler();
- // Finally, draw bar
- var hasNeg = false;
- var barConfigs = me.legends.map(function (legend, legendIndex) {
- var config = {
- legend: legend
- };
- var key = legend.key;
- config.dataset = me.visDatasets.map(function (data, index) {
- hasNeg = hasNeg || data[key] < 0;
- return {
- value: data[key],
- data: data,
- point: me.calculateBarRect(index, legendIndex)
- };
- });
- return config;
- });
+ // Readability Functions
+ // ---------------------
+ // false
+ // tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
+ tinycolor.isReadable = function (color1, color2, wcag2) {
+ var readability = tinycolor.readability(color1, color2);
+ var wcag2Parms, out;
+
+ out = false;
+
+ wcag2Parms = validateWCAG2Parms(wcag2);
+ switch (wcag2Parms.level + wcag2Parms.size) {
+ case "AAsmall":
+ case "AAAlarge":
+ out = readability >= 4.5;
+ break;
+ case "AAlarge":
+ out = readability >= 3;
+ break;
+ case "AAAsmall":
+ out = readability >= 7;
+ break;
}
+ return out;
+ };
- /**
- * Draw zero line
- * @private
- */
-
- }, {
- key: '_darwZeroLine',
- value: function _darwZeroLine() {
- var me = this,
- ctx = me.ctx;
- // zero line
- ctx.save();
- ctx.fillStyle = me.xAxis.config.color;
- ctx.lineWidth = me.xAxis.config.lineWidth;
-
- var baseY = me.yAxis.getPoint(0).y;
- ctx.beginPath();
- ctx.moveTo(me.xAxis.getPoint(-1).x, baseY);
- ctx.lineTo(me.xAxis.box.ex, baseY);
- ctx.stroke();
- ctx.restore();
+ // `mostReadable`
+ // Given a base color and a list of possible foreground or background
+ // colors for that base, returns the most readable color.
+ // Optionally returns Black or White if the most readable color is unreadable.
+ // *Example*
+ // tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
+ // tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff"
+ // tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
+ // tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
+ tinycolor.mostReadable = function (baseColor, colorList, args) {
+ var bestColor = null;
+ var bestScore = 0;
+ var readability;
+ var includeFallbackColors, level, size;
+ args = args || {};
+ includeFallbackColors = args.includeFallbackColors;
+ level = args.level;
+ size = args.size;
+
+ for (var i = 0; i < colorList.length; i++) {
+ readability = tinycolor.readability(baseColor, colorList[i]);
+ if (readability > bestScore) {
+ bestScore = readability;
+ bestColor = tinycolor(colorList[i]);
+ }
+ }
+
+ if (tinycolor.isReadable(baseColor, bestColor, { "level": level, "size": size }) || !includeFallbackColors) {
+ return bestColor;
+ } else {
+ args.includeFallbackColors = false;
+ return tinycolor.mostReadable(baseColor, ["#fff", "#000"], args);
}
- }, {
- key: '_getAnimationDrawBar',
-
- /**
- * Return a animate tick func
- * @param barData
- * @param hasNeg
- * @return {function(*, *, *)|null}
- * @private
- */
- value: function _getAnimationDrawBar(barData, hasNeg) {
- var me = this,
- backgroundColor = me.config.backgroundColor,
- stacked = me.chartConfig.stacked,
- animate = me.chartConfig.animate,
- animateOpt = me.chartConfig.animateOptions,
- ctx = me.ctx;
+ };
- var legend = barData.legend,
- dataset = barData.dataset;
- var display = legend.display,
- borderWidth = legend.borderWidth,
- fillStyle = legend.fillStyle,
- strokeStyle = legend.strokeStyle,
- fillArea = legend.fillArea,
- fillAlpha = legend.fillAlpha;
+ // Big List of Colors
+ // ------------------
+ //
+ var names = tinycolor.names = {
+ aliceblue: "f0f8ff",
+ antiquewhite: "faebd7",
+ aqua: "0ff",
+ aquamarine: "7fffd4",
+ azure: "f0ffff",
+ beige: "f5f5dc",
+ bisque: "ffe4c4",
+ black: "000",
+ blanchedalmond: "ffebcd",
+ blue: "00f",
+ blueviolet: "8a2be2",
+ brown: "a52a2a",
+ burlywood: "deb887",
+ burntsienna: "ea7e5d",
+ cadetblue: "5f9ea0",
+ chartreuse: "7fff00",
+ chocolate: "d2691e",
+ coral: "ff7f50",
+ cornflowerblue: "6495ed",
+ cornsilk: "fff8dc",
+ crimson: "dc143c",
+ cyan: "0ff",
+ darkblue: "00008b",
+ darkcyan: "008b8b",
+ darkgoldenrod: "b8860b",
+ darkgray: "a9a9a9",
+ darkgreen: "006400",
+ darkgrey: "a9a9a9",
+ darkkhaki: "bdb76b",
+ darkmagenta: "8b008b",
+ darkolivegreen: "556b2f",
+ darkorange: "ff8c00",
+ darkorchid: "9932cc",
+ darkred: "8b0000",
+ darksalmon: "e9967a",
+ darkseagreen: "8fbc8f",
+ darkslateblue: "483d8b",
+ darkslategray: "2f4f4f",
+ darkslategrey: "2f4f4f",
+ darkturquoise: "00ced1",
+ darkviolet: "9400d3",
+ deeppink: "ff1493",
+ deepskyblue: "00bfff",
+ dimgray: "696969",
+ dimgrey: "696969",
+ dodgerblue: "1e90ff",
+ firebrick: "b22222",
+ floralwhite: "fffaf0",
+ forestgreen: "228b22",
+ fuchsia: "f0f",
+ gainsboro: "dcdcdc",
+ ghostwhite: "f8f8ff",
+ gold: "ffd700",
+ goldenrod: "daa520",
+ gray: "808080",
+ green: "008000",
+ greenyellow: "adff2f",
+ grey: "808080",
+ honeydew: "f0fff0",
+ hotpink: "ff69b4",
+ indianred: "cd5c5c",
+ indigo: "4b0082",
+ ivory: "fffff0",
+ khaki: "f0e68c",
+ lavender: "e6e6fa",
+ lavenderblush: "fff0f5",
+ lawngreen: "7cfc00",
+ lemonchiffon: "fffacd",
+ lightblue: "add8e6",
+ lightcoral: "f08080",
+ lightcyan: "e0ffff",
+ lightgoldenrodyellow: "fafad2",
+ lightgray: "d3d3d3",
+ lightgreen: "90ee90",
+ lightgrey: "d3d3d3",
+ lightpink: "ffb6c1",
+ lightsalmon: "ffa07a",
+ lightseagreen: "20b2aa",
+ lightskyblue: "87cefa",
+ lightslategray: "789",
+ lightslategrey: "789",
+ lightsteelblue: "b0c4de",
+ lightyellow: "ffffe0",
+ lime: "0f0",
+ limegreen: "32cd32",
+ linen: "faf0e6",
+ magenta: "f0f",
+ maroon: "800000",
+ mediumaquamarine: "66cdaa",
+ mediumblue: "0000cd",
+ mediumorchid: "ba55d3",
+ mediumpurple: "9370db",
+ mediumseagreen: "3cb371",
+ mediumslateblue: "7b68ee",
+ mediumspringgreen: "00fa9a",
+ mediumturquoise: "48d1cc",
+ mediumvioletred: "c71585",
+ midnightblue: "191970",
+ mintcream: "f5fffa",
+ mistyrose: "ffe4e1",
+ moccasin: "ffe4b5",
+ navajowhite: "ffdead",
+ navy: "000080",
+ oldlace: "fdf5e6",
+ olive: "808000",
+ olivedrab: "6b8e23",
+ orange: "ffa500",
+ orangered: "ff4500",
+ orchid: "da70d6",
+ palegoldenrod: "eee8aa",
+ palegreen: "98fb98",
+ paleturquoise: "afeeee",
+ palevioletred: "db7093",
+ papayawhip: "ffefd5",
+ peachpuff: "ffdab9",
+ peru: "cd853f",
+ pink: "ffc0cb",
+ plum: "dda0dd",
+ powderblue: "b0e0e6",
+ purple: "800080",
+ rebeccapurple: "663399",
+ red: "f00",
+ rosybrown: "bc8f8f",
+ royalblue: "4169e1",
+ saddlebrown: "8b4513",
+ salmon: "fa8072",
+ sandybrown: "f4a460",
+ seagreen: "2e8b57",
+ seashell: "fff5ee",
+ sienna: "a0522d",
+ silver: "c0c0c0",
+ skyblue: "87ceeb",
+ slateblue: "6a5acd",
+ slategray: "708090",
+ slategrey: "708090",
+ snow: "fffafa",
+ springgreen: "00ff7f",
+ steelblue: "4682b4",
+ tan: "d2b48c",
+ teal: "008080",
+ thistle: "d8bfd8",
+ tomato: "ff6347",
+ turquoise: "40e0d0",
+ violet: "ee82ee",
+ wheat: "f5deb3",
+ white: "fff",
+ whitesmoke: "f5f5f5",
+ yellow: "ff0",
+ yellowgreen: "9acd32"
+ };
- // Animation dynamic options
+ // Make it easy to access colors via `hexNames[hex]`
+ var hexNames = tinycolor.hexNames = flip(names);
- var dataLen = dataset.length,
- categoryTicks = (animateOpt.end - animateOpt.start) / dataLen;
+ // Utilities
+ // ---------
- if (!display) {
- return;
+ // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
+ function flip(o) {
+ var flipped = {};
+ for (var i in o) {
+ if (o.hasOwnProperty(i)) {
+ flipped[o[i]] = i;
}
+ }
+ return flipped;
+ }
- return function (t, lastData, toNext) {
- var dataIndex = Math.floor(t / categoryTicks);
-
- var _ref = dataIndex < dataLen ? dataset[dataIndex] : dataset[dataLen - 1],
- point = _ref.point;
+ // Return a valid alpha value [0,1] with all invalid values being set to 1
+ function boundAlpha(a) {
+ a = parseFloat(a);
- var percent = t % categoryTicks / categoryTicks;
+ if (isNaN(a) || a < 0 || a > 1) {
+ a = 1;
+ }
- if (lastData) {
- var lastDataIndex = lastData.dataIndex,
- lastPercent = lastData.percent,
- lastt = lastData.t,
- lastx = lastData.x,
- lasty = lastData.y,
- lastWidth = lastData.width,
- lastHeight = lastData.height;
+ return a;
+ }
- if (lastDataIndex < dataLen && lastx) {
- ctx.save();
- ctx.beginPath();
- // TODO: optimize clear check!!
- ctx.lineWidth = borderWidth;
- ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';
- ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';
- ctx.fillRect(lastx, lasty, lastWidth, lastHeight);
- if (borderWidth) {
- ctx.beginPath();
- if (stacked && hasNeg && borderWidth) {
- ctx.rect(lastx, lasty, lastWidth, lastHeight);
- } else {
- ctx.moveTo(lastx, lasty + lastHeight);
- ctx.lineTo(lastx, lasty);
- ctx.lineTo(lastx + lastWidth, lasty);
- ctx.lineTo(lastx + lastWidth, lasty + lastHeight);
- }
- ctx.stroke();
- }
+ // Take input from [0, n] and return it as [0, 1]
+ function bound01(n, max) {
+ if (isOnePointZero(n)) {
+ n = "100%";
+ }
- ctx.draw();
- ctx.restore();
- }
+ var processPercent = isPercentage(n);
+ n = mathMin(max, mathMax(0, parseFloat(n)));
- if (lastDataIndex !== dataIndex && !!lastPercent) {
- // End the lasted bar
- var _ref2 = lastDataIndex < dataLen ? dataset[lastDataIndex] : dataset[dataLen - 1],
- lastPoint = _ref2.point;
+ // Automatically convert percentage into number
+ if (processPercent) {
+ n = parseInt(n * max, 10) / 100;
+ }
- me.__drawBar(lastPoint, 1, legend, stacked, hasNeg);
- }
- }
+ // Handle floating point rounding errors
+ if (Math.abs(n - max) < 0.000001) {
+ return 1;
+ }
- var px = void 0,
- py = void 0,
- width = void 0,
- height = void 0;
- if (dataIndex < dataLen && (!!percent || !point)) {
- var _me$__drawBar = me.__drawBar(point, percent, legend, stacked, hasNeg);
+ // Convert into [0, 1] range if it isn't already
+ return n % max / parseFloat(max);
+ }
- px = _me$__drawBar.px;
- py = _me$__drawBar.py;
- width = _me$__drawBar.width;
- height = _me$__drawBar.height;
- }
+ // Force a number between 0 and 1
+ function clamp01(val) {
+ return mathMin(1, mathMax(0, val));
+ }
- return {
- dataIndex: dataIndex,
- percent: percent,
- t: t,
- x: px,
- y: py,
- width: width,
- height: height
- };
- };
- }
- }, {
- key: '_drawBar',
- value: function _drawBar(barData, hasNeg) {
- var me = this,
- stacked = me.chartConfig.stacked,
- ctx = me.ctx;
- var legend = barData.legend,
- dataset = barData.dataset;
- var display = legend.display,
- borderWidth = legend.borderWidth,
- fillStyle = legend.fillStyle,
- strokeStyle = legend.strokeStyle,
- fillArea = legend.fillArea,
- fillAlpha = legend.fillAlpha;
+ // Parse a base-16 hex value into a base-10 integer
+ function parseIntFromHex(val) {
+ return parseInt(val, 16);
+ }
- if (!display) {
- return;
- }
+ // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
+ //
+ function isOnePointZero(n) {
+ return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
+ }
- dataset.forEach(function (d) {
- var value = d.value,
- data = d.data,
- point = d.point;
+ // Check to see if string passed in is a percentage
+ function isPercentage(n) {
+ return typeof n === "string" && n.indexOf('%') != -1;
+ }
- if (!point) {
- return;
- }
+ // Force a hex value to have 2 characters
+ function pad2(c) {
+ return c.length == 1 ? '0' + c : '' + c;
+ }
- me.__drawBar(point, 1, legend, stacked, hasNeg);
- // if (stacked && hasNeg) {
- // ctx.beginPath();
- // ctx.rect(point.x ,point.y ,point.barWidth, point.barHeight);
- // if (borderWidth) {
- // ctx.stroke();
- // }
- // if (fillArea) {
- // ctx.globalAlpha = fillAlpha;
- // ctx.fill();
- // ctx.globalAlpha = 1;
- // }
- // } else {
- // // | 1 2 |
- // // | 0 3 |
- // let points = [
- // [point.x, point.y + point.barHeight],
- // [point.x, point.y],
- // [point.x + point.barWidth, point.y],
- // [point.x + point.barWidth, point.y + point.barHeight]
- // ];
- //
- // ctx.moveTo(...points[0]);
- // ctx.lineTo(...points[1]);
- // ctx.lineTo(...points[2]);
- // ctx.lineTo(...points[3]);
- //
- // if (borderWidth) {
- // ctx.stroke();
- // }
- // if (fillArea) {
- // ctx.globalAlpha = fillAlpha;
- // ctx.fill();
- // ctx.globalAlpha = 1;
- // }
- // }
- });
+ // Replace a decimal with it's percentage value
+ function convertToPercentage(n) {
+ if (n <= 1) {
+ n = n * 100 + "%";
}
- /**
- * Draw one line
- * @param {Object} barData - Line dataset
- * @param {Object} barData.legend - Legend's config
- * @param {Object[]} barData[].value - Data of each line point
- * @param {Object[]} barData[].data - The data object
- * @param {Object[]} barData[].point - The point for rending.
- * @parma {boolean} hasNeg - Has negative value or not
- * @private
- */
+ return n;
+ }
- }, {
- key: 'drawBar',
- value: function drawBar(barData, hasNeg) {
- var me = this,
- animate = me.chartConfig.animate;
+ // Converts a decimal to a hex value
+ function convertDecimalToHex(d) {
+ return Math.round(parseFloat(d) * 255).toString(16);
+ }
+ // Converts a hex value to a decimal
+ function convertHexToDecimal(h) {
+ return parseIntFromHex(h) / 255;
+ }
- if (animate) {
- var actionAnimation = me._getAnimationDrawBar(barData, hasNeg);
- me.wxAnimation.pushActions(actionAnimation);
- // me.wxAnimation.on('done', () => {
- // me._drawBar(barData, hasNeg);
- // })
- } else {
- me._drawBar(barData, hasNeg);
- }
- }
+ var matchers = function () {
- /**
- * Bar's render ruler
- * @typedef {Object} BarRuler
- * @property {number} tickWidth - The width of one ticket.
- * @property {number} pointPercentage - Percent (0-1) of the space for each data point
- * @property {number} pointWidth - The width of each data point
- * @property {number} pointIntervalWidth - The remaining width of the space for each data point
- * @property {number} barIntervalWidth - The remaining width of each bar
- * @property {Object[]} legends - legends's setting
- * @property {number} legends.barPercentage - Percent (0-1) of the available width each bar should be within the data point space
- * @property {number} legends._standardPercentage - The real percent of the available with at each point scope
- * @property {number} legends.barWidth - The width of bar
- */
+ //
+ var CSS_INTEGER = "[-\\+]?\\d+%?";
- /**
- * Calculate the bar's base ruler
- * @param {WxScale} [scale=this.xAxis] - Bar's scale
- * @return {BarRuler} Bar ruler
- */
+ //
+ var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
- }, {
- key: 'calculateBarRuler',
- value: function calculateBarRuler() {
- var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.xAxis;
+ // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
+ var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
- var me = this;
- var globalBarWidth = void 0,
- globalBarPercentage = me.chartConfig.barPercentage,
- pointPercentage = me.chartConfig.pointPercentage,
- stacked = me.chartConfig.stacked,
- legends = me.legends;
- var legendLen = legends.length;
+ // Actual matching.
+ // Parentheses and commas are optional, but not required.
+ // Whitespace can take the place of commas or opening paren
+ var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
+ var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
- var tickWidth = scale.calculateTickWidth();
- // One scale's point space
- var pointWidth = tickWidth * pointPercentage;
- var pointIntervalWidth = (tickWidth - pointWidth) / 2;
+ return {
+ CSS_UNIT: new RegExp(CSS_UNIT),
+ rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
+ rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
+ hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
+ hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
+ hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
+ hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
+ hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
+ hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
+ hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
+ hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
+ };
+ }();
- // Standardization every bar's percentage
- var totalStandardPercentage = 0;
- if (!globalBarPercentage) {
- globalBarPercentage = stacked ? Math.max.apply(Math, _toConsumableArray(legends.map(function (x) {
- return x.barPercentage || 0.8;
- }))) || 0.8 : 0.8;
- }
- globalBarWidth = Math.max.apply(Math, _toConsumableArray([globalBarPercentage * pointWidth].concat(legends.map(function (x) {
- return _helper.is.Number(x.barWidth) ? x.barWidth : 0;
- }))));
+ // `isValidCSSUnit`
+ // Take in a single string / number and check to see if it looks like a CSS unit
+ // (see `matchers` above for definition).
+ function isValidCSSUnit(color) {
+ return !!matchers.CSS_UNIT.exec(color);
+ }
- legends.forEach(function (legend) {
- if (stacked) {
- legend.barWidth = globalBarWidth;
- legend.barPercentage = globalBarPercentage;
- legend._standardPercentage = globalBarPercentage / legendLen;
- } else {
- var standardPercentage = void 0;
- var barPercentage = legend.barPercentage ? legend.barPercentage > 1 ? 1.0 : legend.barPercentage : globalBarPercentage;
+ // `stringInputToObject`
+ // Permissive string parsing. Take in a number of formats, and output an object
+ // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
+ function stringInputToObject(color) {
- if (legend.barWidth) {
- // Bar fixed width...
- standardPercentage = legend.barWidth / tickWidth;
- } else {
- standardPercentage = barPercentage / legendLen;
- legend.barWidth = pointWidth * standardPercentage;
- }
- totalStandardPercentage += standardPercentage;
- legend._standardPercentage = standardPercentage;
- }
- });
-
- // Check total percentage
- if (totalStandardPercentage > 1) {
- throw Error('Bar\'s width too large!');
- } else if (stacked) {
- totalStandardPercentage = globalBarPercentage;
- }
-
- var barIntervalWidth = legendLen > 1 ? pointWidth * (1 - totalStandardPercentage) / (legendLen - 1) : pointWidth * (1 - totalStandardPercentage);
-
- return { tickWidth: tickWidth, pointPercentage: pointPercentage, pointWidth: pointWidth, pointIntervalWidth: pointIntervalWidth, legends: legends, barIntervalWidth: barIntervalWidth };
+ color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();
+ var named = false;
+ if (names[color]) {
+ color = names[color];
+ named = true;
+ } else if (color == 'transparent') {
+ return { r: 0, g: 0, b: 0, a: 0, format: "name" };
}
- /**
- * Calculate the box of one "rect"
- * @param {number} index - The index of item
- * @param {number} legendIndex - The index of legend
- * @param {WxScale} [xScale=this.xAxis] - Bar's x-axis
- * @param {WxScale} [yScale=this.yAxis] - Bar's x-axis
- */
-
- }, {
- key: 'calculateBarRect',
- value: function calculateBarRect(index, legendIndex) {
- var xScale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.xAxis;
- var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;
-
- var me = this,
- stacked = me.chartConfig.stacked,
- barRuler = me.barRuler || me.calculateBarRuler(xScale);
-
- var legendOpt = me.legends[legendIndex];
- if (!legendOpt) {
- return;
- }
- // Calculate the bar's width in front of this legend
- var frontBarWidth = me.legends.slice(0, legendIndex).reduce(function (acc, cur) {
- return acc + cur.barWidth;
- }, 0);
- var data = me.visDatasets[index];
- var value = legendOpt.key && typeof data[legendOpt.key] !== 'undefined' ? data[legendOpt.key] : null;
- if (_helper.is.Null(value) || _helper.is.Undefined(value)) {
- return;
- }
-
- var xPoint = void 0,
- yPoint = void 0,
- barWidth = void 0,
- barHeight = void 0;
- var xPointInstance = xScale.getPoint(index);
- if (stacked) {
- xPoint = xPointInstance.x - barRuler.pointWidth / 2 + barRuler.barIntervalWidth / 2;
- yPoint = me._getStackPoint(index, legendIndex).y;
- barWidth = legendOpt.barWidth;
-
- // TODO: Find another way to replace this variable :__sumNeg __sumPos
- var baseY = yScale.getPoint(0).y;
- barHeight = value < 0 ? value / data.__sumNeg * (yScale.getPoint(data.__sumNeg).y - baseY) : value / data.__sumPos * (baseY - yScale.getPoint(data.__sumPos).y);
-
- yPoint = value < 0 ? yPoint - barHeight : yPoint;
- } else {
- xPoint = xPointInstance.x - barRuler.pointWidth / 2 + frontBarWidth + barRuler.barIntervalWidth / 2 * (legendIndex + 1);
- yPoint = yScale.getPoint(value).y;
- barWidth = legendOpt.barWidth;
- barHeight = xPointInstance.y - yPoint;
- }
-
- return { x: xPoint, y: yPoint, barWidth: barWidth, barHeight: barHeight };
+ // Try to match string input using regular expressions.
+ // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
+ // Just return an object and let the conversion functions handle that.
+ // This way the result will be the same whether the tinycolor is initialized with string or object.
+ var match;
+ if (match = matchers.rgb.exec(color)) {
+ return { r: match[1], g: match[2], b: match[3] };
}
-
- /**
- * Draw the scale of chart
- *
- * @private
- */
-
- }, {
- key: '_drawScale',
- value: function _drawScale() {
- var box = void 0,
- me = this,
- wxLayout = me.wxLayout;
-
- box = wxLayout.adjustBox();
- var xDatasets = me.xScaleAxisDatas(),
- yDatasets = me.yScaleAxisDatas(box);
-
- var _me$wxCrossScale$draw = me.wxCrossScale.draw(box, xDatasets, yDatasets),
- xBox = _me$wxCrossScale$draw.xBox,
- yBox = _me$wxCrossScale$draw.yBox;
-
- wxLayout.addBox(xBox);
- wxLayout.addBox(yBox);
+ if (match = matchers.rgba.exec(color)) {
+ return { r: match[1], g: match[2], b: match[3], a: match[4] };
}
-
- /**
- * Build the yAxis datasets
- * @param {BoxInstance} area - The area of chart
- */
-
- }, {
- key: 'yScaleAxisDatas',
- value: function yScaleAxisDatas(area) {
- var me = this,
- stacked = me.chartConfig.stacked,
- ctx = me.ctx;
- var yScaleItemOptions = me.chartConfig.yScaleItemOptions;
- var tickLimits = me.yAxis.calculateTickLimit(area, ctx);
-
- if (stacked) {
- //let {max, min} = me.stackYScaleAxisLimit();
- var _me$stackYScaleAxisLi = me.stackYScaleAxisLimit(),
- max = _me$stackYScaleAxisLi.max,
- min = _me$stackYScaleAxisLi.min;
-
- return me.yAxis.buildDatasets(max, min, tickLimits, undefined, yScaleItemOptions);
- } else {
- // First, get all available values and calculate the max/min value
- var _visDatasets$reduce = this.visDatasets.reduce(function (pre, cur) {
- var max = pre.max,
- min = pre.min;
-
- if (cur.display) {
- var curValue = me.legends.map(function (legend) {
- if (legend.key) {
- return cur[legend.key] || 0;
- }
- }).concat(max, min);
- max = Math.max.apply(Math, curValue);
- min = Math.min.apply(Math, curValue);
- }
- return { max: max, min: min };
- }, {
- max: 0,
- min: 0
- }),
- _max = _visDatasets$reduce.max,
- _min = _visDatasets$reduce.min;
-
- return me.yAxis.buildDatasets(_max, _min, tickLimits, undefined, yScaleItemOptions);
- }
+ if (match = matchers.hsl.exec(color)) {
+ return { h: match[1], s: match[2], l: match[3] };
+ }
+ if (match = matchers.hsla.exec(color)) {
+ return { h: match[1], s: match[2], l: match[3], a: match[4] };
+ }
+ if (match = matchers.hsv.exec(color)) {
+ return { h: match[1], s: match[2], v: match[3] };
+ }
+ if (match = matchers.hsva.exec(color)) {
+ return { h: match[1], s: match[2], v: match[3], a: match[4] };
+ }
+ if (match = matchers.hex8.exec(color)) {
+ return {
+ r: parseIntFromHex(match[1]),
+ g: parseIntFromHex(match[2]),
+ b: parseIntFromHex(match[3]),
+ a: convertHexToDecimal(match[4]),
+ format: named ? "name" : "hex8"
+ };
+ }
+ if (match = matchers.hex6.exec(color)) {
+ return {
+ r: parseIntFromHex(match[1]),
+ g: parseIntFromHex(match[2]),
+ b: parseIntFromHex(match[3]),
+ format: named ? "name" : "hex"
+ };
+ }
+ if (match = matchers.hex4.exec(color)) {
+ return {
+ r: parseIntFromHex(match[1] + '' + match[1]),
+ g: parseIntFromHex(match[2] + '' + match[2]),
+ b: parseIntFromHex(match[3] + '' + match[3]),
+ a: convertHexToDecimal(match[4] + '' + match[4]),
+ format: named ? "name" : "hex8"
+ };
+ }
+ if (match = matchers.hex3.exec(color)) {
+ return {
+ r: parseIntFromHex(match[1] + '' + match[1]),
+ g: parseIntFromHex(match[2] + '' + match[2]),
+ b: parseIntFromHex(match[3] + '' + match[3]),
+ format: named ? "name" : "hex"
+ };
}
- /**
- * Build the xAxis datasets
- */
-
- }, {
- key: 'xScaleAxisDatas',
- value: function xScaleAxisDatas() {
- var me = this;
- var xScaleItemOptions = me.chartConfig.xScaleItemOptions;
- var xScaleConfig = me.labels.map(function (label) {
- var item = {
- 'text': label
- };
- if (typeof xScaleItemOptions !== 'undefined') {
- item = (0, _helper.extend)(item, xScaleItemOptions);
- }
- return item;
- });
+ return false;
+ }
- return me.xAxis.buildDatasets(xScaleConfig);
+ function validateWCAG2Parms(parms) {
+ // return valid WCAG2 parms for isReadable.
+ // If input parms are invalid, return {"level":"AA", "size":"small"}
+ var level, size;
+ parms = parms || { "level": "AA", "size": "small" };
+ level = (parms.level || "AA").toUpperCase();
+ size = (parms.size || "small").toLowerCase();
+ if (level !== "AA" && level !== "AAA") {
+ level = "AA";
}
- }, {
- key: 'labels',
- get: function get() {
- var me = this,
- tmp = void 0;
- if (me._labels) {
- return me._labels;
- } else if (tmp = me.chartConfig.labels) {
- if (_helper.is.Array(tmp)) {
- return tmp;
- }
- }
- me._labels = me.visDatasets.map(function (dataset) {
- return dataset.label;
+ if (size !== "small" && size !== "large") {
+ size = "small";
+ }
+ return { "level": level, "size": size };
+ }
+
+ // Node: Export function
+ if (typeof module !== "undefined" && module.exports) {
+ module.exports = tinycolor;
+ }
+ // AMD/requirejs: Define the module
+ else if (typeof define === 'function' && define.amd) {
+ define(function () {
+ return tinycolor;
});
- return me._labels;
}
- }, {
- key: 'legends',
- get: function get() {
- var me = this;
- if (!me._legends) {
- me._legends = me._getLegendConfig();
+ // Browser: Expose to window
+ else {
+ window.tinycolor = tinycolor;
}
- return me._legends;
- },
- set: function set(value) {
- this._legends = value;
- }
- }]);
-
- return WxBar;
- }(_wxChart2.default);
-
- exports.default = WxBar;
- }, { "../core/animation": 14, "../core/layout": 16, "../core/legend": 17, "../core/scale": 18, "../core/title": 19, "../scale/scale.category": 20, "../scale/scale.crosshelp": 21, "../scale/scale.liner": 22, "../scale/scale.stackhelp": 23, "../util/helper": 24, "../util/randomColor": 26, "../util/tinycolor": 27, "../util/wxCanvas": 29, "./wxChart": 13, "es6-mixins": 5 }], 11: [function (require, module, exports) {
+ })(Math);
+ }, {}], 11: [function (require, module, exports) {
/* global module, wx, window: false, document: false */
'use strict';
@@ -3249,6 +3459,16 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}
};
+ var _es6Mixins = require('es6-mixins');
+
+ var _es6Mixins2 = _interopRequireDefault(_es6Mixins);
+
+ var _helper = require('../util/helper');
+
+ var _randomColor = require('../util/randomColor');
+
+ var _randomColor2 = _interopRequireDefault(_randomColor);
+
var _wxCanvas = require('../util/wxCanvas');
var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
@@ -3261,19 +3481,33 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
var _title2 = _interopRequireDefault(_title);
- var _layout = require('../core/layout');
+ var _scale = require('../core/scale');
- var _layout2 = _interopRequireDefault(_layout);
+ var _scale2 = _interopRequireDefault(_scale);
+
+ var _scale3 = require('../scale/scale.liner');
+
+ var _scale4 = _interopRequireDefault(_scale3);
+
+ var _scale5 = require('../scale/scale.crosshelp');
+
+ var _scale6 = _interopRequireDefault(_scale5);
+
+ var _scale7 = require('../scale/scale.stackhelp');
+
+ var _scale8 = _interopRequireDefault(_scale7);
+
+ var _scale9 = require('../scale/scale.category');
+
+ var _scale10 = _interopRequireDefault(_scale9);
var _legend = require('../core/legend');
var _legend2 = _interopRequireDefault(_legend);
- var _randomColor = require('../util/randomColor');
-
- var _randomColor2 = _interopRequireDefault(_randomColor);
+ var _layout = require('../core/layout');
- var _helper = require('../util/helper');
+ var _layout2 = _interopRequireDefault(_layout);
var _animation = require('../core/animation');
@@ -3283,12 +3517,22 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
return obj && obj.__esModule ? obj : { default: obj };
}
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
-
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
+ arr2[i] = arr[i];
+ }return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
@@ -3301,16 +3545,50 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
- // Doughnut default config
- var WX_DOUGHNUT_DEFAULT_CONFIG = {
+ var tinycolor = require("tinycolor2");
+ // Bar legend's default config
+ var WX_BAR_LEGEND_DEFAULT_CONFIG = {
+ borderWidth: 1,
+ fillArea: true,
+ fillAlpha: 0.5,
+ display: true,
+ // barWidth: 'auto' //Set each bar's width. If not set, the bars are sized automatically.
+ barPercentage: 0.8 // Percent (0-1) of the available width each bar should be within the data point space,like the flexible layout~
+ // fillStyle
+ // strokeStyle
+ };
+ // Bar default config
+ var WX_BAR_DEFAULT_CONFIG = {
+ minBetweenPixel: 5, // The minisize space between each bar.
+ pointPercentage: 0.8, // Percent (0-1) of the space for each data point
+ stacked: false, // If true, bars are stacked on the x-axis
+ zeroLine: false,
+ // barPercentage: 0.8 // If stacked is true, global "barPercentage" setting will be effective. Otherwise, legend's setting priorities.
+ // Scale options
+ xScaleOptions: {
+ position: 'bottom'
+ },
+ xScaleItemOptions: undefined,
+ yScaleOptions: {
+ position: 'left'
+ },
+ yScaleItemOptions: undefined,
+ crossScaleOptions: {
+ xMargin: function xMargin(xBox, yBox, area, xScale, yScale, xScaleDatasets) {
+ return xScale.calculateTickWidth(xScaleDatasets, xBox);
+ },
+ xFirstPointSpace: 0
+ },
+ // The title text or a title config object
+ title: undefined,
+
+ // The legend of line chart
+ legends: [], // borderWidth, fillArea, fillAlpha can be set in here
legendOptions: {
'position': 'bottom'
},
- // The percentage of the chart that we cut out of the middle.
- cutoutPercentage: 50,
- // The rotation of the chart, where the first data arc begins.
- rotation: Math.PI * -0.5,
+ point: {},
// The randomColor scheme
// See https://github.com/davidmerfield/randomColor
@@ -3319,68 +3597,178 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
luminosity: 'light'
},
- point: {},
-
- // The title text or a title config object
- title: undefined,
-
- // The borderWidth
- borderWidth: 2,
-
- // Chart padding, default auto set
- padding: undefined,
+ // The dataset's default key
+ defaultKey: 'value',
- labelDistancePercentage: 0.15,
// Animation
animate: true,
animateOptions: {
start: 1,
- end: 501,
+ end: 1001,
duration: 1000
}
};
- /**
- * Doughnut item config
- *
- * value: The value of chart
- * label: The legend text
- * color: The color of item ,by default we use the randomColour scheme to create color
- * radius: The percentage of radius, default is '100'
- * legend: [Object] legend options
- */
- var WX_DOUGHNUT_ITEM_DEFAULT_CONFIG = {
- display: true,
- fontSize: 11,
- percentage: 100
+ var WX_BAR_ITEM_DEFAULT_CONFIG = {
+ showItem: true,
+ // format: // title format function
+ //borderWidth: 1,
+ //fillArea: true,
+ //fillAlpha: 0.5,
+ //strokeStyle: '#ffffff',
+ display: true
};
- var WxDoughnut = function (_WxChart) {
- _inherits(WxDoughnut, _WxChart);
+ var WxBar = function (_WxChart) {
+ _inherits(WxBar, _WxChart);
/**
- * WxDoughnut chart
- * @constructor
- * @param {string} id - The canvas element's id
- * @param {Object} config
- * @param {number} [config.width=300] - The width of canvas.
- * @param {number} [config.height=200] - The height of canvas.
- * @param {number} [config.padding=] - The padding of canvas.
- * @param {string} [config.display=block] - The display style of chart.
- *
- * @param {number} [config.cutoutPercentage=50] - The percentage of the chart that we cut out of the middle.
- * @param {number} [config.rotation=Math.PI * -0.5] - The rotation of the chart, where the first data arc begins.
- * @param {Object} [config.color=red] - The randomColor options.
- * @param {(string|Object)} [config.title=] - The title text or title options of chart.
- * @param {Object} [config.legendOptions=] - The legend options of chart.
- */
- function WxDoughnut(id, config) {
- _classCallCheck(this, WxDoughnut);
+ * WxBar chart
+ * @constructor
+ * @param {string} id - The canvas element's id
+ * @param {Object} config
+ * @param {number} [config.width=300] - The width of canvas.
+ * @param {number} [config.height=200] - The height of canvas.
+ * @param {number} [config.padding=] - The padding of canvas.
+ * @param {string} [config.display=block] - The display style of chart.
+ *
+ * @param {Object} config.legendOptions=[] - The legend & label options.You should set 'key' to bind the attribute in datasets which is the value of the point.
+ * @param {(string|Object)} [config.title=] - The title text or title options of chart.
+ * @example
+ *datasets:[{
+ * valueA: 30,
+ * valueB: 40,
+ * label: '一月'
+ * }, {
+ * valueA: 20,
+ * valueB: 50,
+ * pointRadius: 2,
+ * label: '二月'
+ *},...]
+ *
+ * legends: [{
+ * 'text': 'valueA Text',
+ * 'key': 'valueA',
+ * 'strokeStyle': '#3385ff',
+ * 'barPercentage': 0.8
+ * }, {
+ * text: 'valueB Text',
+ * key: 'valueB'
+ * }]
+ */
+ function WxBar(id, config) {
+ _classCallCheck(this, WxBar);
- var _this = _possibleConstructorReturn(this, (WxDoughnut.__proto__ || Object.getPrototypeOf(WxDoughnut)).call(this, id, config));
+ var _this = _possibleConstructorReturn(this, (WxBar.__proto__ || Object.getPrototypeOf(WxBar)).call(this, id, config));
+
+ _this.__drawBar = function (p, percent, box, legend, stacked, hasNeg, setBarItem) {
+ var ctx = _this.ctx;
+ var px = void 0,
+ py = void 0,
+ width = void 0,
+ height = void 0;
+
+ var value = p.value,
+ data = p.data,
+ point = p.point,
+ index = p.index;
+ var borderWidth = legend.borderWidth,
+ fillStyle = legend.fillStyle,
+ strokeStyle = legend.strokeStyle,
+ fillArea = legend.fillArea,
+ fillAlpha = legend.fillAlpha;
+ var showItem = data.showItem,
+ format = data.format,
+ label = data.label;
+
+ if (!p || !p.point) {
+ return { px: px, py: py, width: width, height: height };
+ }
+
+ var _p$point = p.point,
+ pointX = _p$point.x,
+ pointY = _p$point.y,
+ barWidth = _p$point.barWidth,
+ barHeight = _p$point.barHeight;
+
+ if (stacked && hasNeg) {
+ width = barWidth;
+ height = barHeight * percent;
+ px = pointX;
+ py = pointY + barHeight / 2 - height / 2;
+ } else {
+ px = pointX;
+ width = barWidth;
+ height = barHeight * percent;
+ py = pointY + barHeight * (1 - percent);
+ }
+
+ ctx.save();
+
+ ctx.fillStyle = fillStyle;
+ ctx.strokeStyle = strokeStyle;
+ ctx.lineWidth = borderWidth;
+ // First, fill
+ if (fillArea) {
+ ctx.beginPath();
+ ctx.globalAlpha = fillAlpha;
+ ctx.rect(px, py, width, height);
+ ctx.fill();
+ ctx.globalAlpha = 1;
+ }
+ // Next, stroke
+ if (borderWidth) {
+ ctx.beginPath();
+ if (stacked && hasNeg) {
+ ctx.rect(px, py, width, height);
+ } else {
+ ctx.moveTo(px, py + height);
+ ctx.lineTo(px, py);
+ ctx.lineTo(px + width, py);
+ ctx.lineTo(px + width, py + height);
+ }
+ ctx.stroke();
+ }
+
+ // Show bar item
+ if (!!setBarItem && !!showItem && !stacked) {
+ var curFillStyle = ctx.fillStyle;
+ ctx.textBaseline = "bottom";
+ ctx.fillStyle = tinycolor(curFillStyle).darken(15).toString();
+ ctx.fillStyle = curFillStyle;
+
+ var barItem = _helper.is.Function(format) ? format.call(_this, label, value, index) : p.value + '';
+
+ var boxX = box.x,
+ boxY = box.y;
+
+ var itemX = px + barWidth / 2 - ctx.measureText(barItem).width / 2,
+ itemY = py - ctx.fontSize / 4;
+
+ // Check box's X,Y
+ if (itemX < box.x) {
+ itemX = box.x;
+ }
+ if (itemY < box.y) {
+ itemY = box.y;
+ }
+
+ ctx.fillText(barItem, itemX, itemY);
+ }
+
+ ctx.draw();
+ ctx.restore();
+
+ return { px: px, py: py, width: width, height: height };
+ };
+
+ (0, _es6Mixins2.default)([_scale8.default], _this, {
+ // Mixins will create a new method to nested call all duplicate method
+ mergeDuplicates: false
+ });
var me = _this;
- me.chartConfig = (0, _helper.extend)({}, WX_DOUGHNUT_DEFAULT_CONFIG, config);
+ me.chartConfig = (0, _helper.extend)({}, WX_BAR_DEFAULT_CONFIG, config);
me.title = null;
// Initialize title and legend
@@ -3389,7 +3777,13 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;
}
+ // Initialize legend
me.legend = new _legend2.default(me, me.chartConfig.legendOptions);
+
+ // Initialize x,y Scale
+ me.yAxis = new _scale4.default(me, me.chartConfig.yScaleOptions);
+ me.xAxis = new _scale10.default(me, me.chartConfig.xScaleOptions);
+ me.wxCrossScale = new _scale6.default(me.xAxis, me.yAxis, me.chartConfig.crossScaleOptions);
me.wxLayout = new _layout2.default(me);
// Initialize wxAnimation
@@ -3401,523 +3795,705 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
return _this;
}
- /**
- * Update a datesets of chart and reDraw
- * @param {Object[]} datasets
- * @param {string} [datasets[].hidden=false] - Display or not.
- * @param {string} datasets[].label - The label text of an dataset.
- * @param {function} datasets[].format - The label text format function.
- * @param {number} datasets[].value - The value of an dataset.
- * @param {string} [datasets[].color] - The color of an dataset.
- * @param {string} [datasets[].borderColor]- The border color of an dataset.
- * @param {string} [datasets[].percentage=100] - The percentage of radius, default is '100'
- * @param {string} [datasets[].legend] - The legend option of an dataset. We will set legend text as same as label text.
- *
- */
+ // Get/Set labels
- _createClass(WxDoughnut, [{
- key: 'update',
- value: function update(datasets) {
- var me = this;
- _get(WxDoughnut.prototype.__proto__ || Object.getPrototypeOf(WxDoughnut.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_DOUGHNUT_ITEM_DEFAULT_CONFIG, me.chartConfig.point));
- me.wxLayout.removeAllBox();
- if (me.wxAnimation) me.wxAnimation.reset();
- return me.draw();
- }
+
+ _createClass(WxBar, [{
+ key: '_getLegendConfig',
/**
- * Draw chart
+ * Build legends config
+ * @private
*/
-
+ value: function _getLegendConfig() {
+ var me = this,
+ defaultKey = me.chartConfig.defaultKey || 'value',
+ legendsConfig = me.chartConfig.legends;
+ if (!legendsConfig) {
+ if (me.labels && me.labels.length) {
+ legendsConfig = me.labels.map(function (label) {
+ return { 'text': label, 'key': defaultKey };
+ });
+ } else {
+ throw new Error('Can not get legend config!');
+ }
+ } else {
+ legendsConfig = legendsConfig.map(function (legend) {
+ return (0, _helper.extend)(true, {
+ 'key': defaultKey
+ }, legend);
+ });
+ }
+ return legendsConfig;
+ }
+ /**
+ * Update a datesets of chart and reDraw
+ * @param {Object} datasets - data sets
+ * @param {string} [datasets[].display] - Disaply the bar or not
+ * @param {string} [datasets[].borderWidth=1] - Bar's border width
+ * @param {string} [datasets[].strokeStyle] - Bar's border color
+ * @param {number} [datasets[].fillArea=true] - Fill color or not
+ * @param {number} [datasets[].fillAlpha=0.6] - Fill color Alpha
+ * @param {number} [datasets[].fillStyle] - Fill color. The default color will randomly assigned by 'color' option.
+ * @returns {*}
+ */
+
+ }, {
+ key: 'update',
+ value: function update(datasets) {
+ var me = this;
+ me._labels = null;
+ me._legends = null;
+ _get(WxBar.prototype.__proto__ || Object.getPrototypeOf(WxBar.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_BAR_ITEM_DEFAULT_CONFIG, me.chartConfig.point));
+ me.wxLayout.removeAllBox();
+ if (me.wxAnimation) me.wxAnimation.reset();
+ return me.draw();
+ }
+ /**
+ * Draw chart
+ */
+
}, {
key: 'draw',
value: function draw() {
var box = void 0,
me = this,
+ ctx = me.ctx,
animate = me.chartConfig.animate,
- labelDistancePercentage = me.chartConfig.labelDistancePercentage,
wxLayout = me.wxLayout;
var _me$chartConfig = me.chartConfig,
- cutoutPercentage = _me$chartConfig.cutoutPercentage,
- rotation = _me$chartConfig.rotation,
+ pointPercentage = _me$chartConfig.pointPercentage,
+ minBetweenPixel = _me$chartConfig.minBetweenPixel,
+ stacked = _me$chartConfig.stacked,
color = _me$chartConfig.color,
- title = _me$chartConfig.title,
- borderWidth = _me$chartConfig.borderWidth,
- padding = _me$chartConfig.padding;
+ zeroLine = _me$chartConfig.zeroLine;
me.emit('beforeDraw', {
options: me.chartConfig
});
- box = wxLayout.adjustBox();
// First, we draw title
+ box = wxLayout.adjustBox();
if (me.title) {
me.title.update(me.titleText, box);
wxLayout.addBox(me.title.box);
}
- box = wxLayout.adjustBox();
// Second, random color and get legend datasets
- var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.visDatasets.length }));
- var rBorderColor = (0, _randomColor2.default)({
- hue: color.hue || 'black',
- luminosity: 'dark',
- count: 1
- });
- var legendDatasets = [];
- me.visDatasets.forEach(function (dataset, index) {
- if (!dataset.color) {
- dataset.color = rColors[index];
- }
- if (!dataset.borderColor) {
- dataset.borderColor = me.config.backgroundColor || "#ffffff";
- }
+ box = wxLayout.adjustBox();
+ var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.legends.length }));
- var legend = dataset.legend;
- if (!legend || _helper.is.String(legend)) {
- legendDatasets.push({
- hidden: dataset.hidden || false,
- text: _helper.is.String(legend) ? legend : dataset.label,
- fillStyle: dataset.color,
- strokeStyle: rBorderColor[0]
- });
- } else if (_helper.is.PureObject(legend)) {
- legendDatasets.push((0, _helper.extend)({
- hidden: dataset.hidden
- }, legend));
+ me.legends = me.legends.map(function (legend, index) {
+ if (!legend.strokeStyle) {
+ legend.strokeStyle = legend.borderColor || tinycolor(rColors[index]).darken(10).toString();
}
+
+ return (0, _helper.extend)(true, {
+ fillStyle: rColors[index]
+ }, WX_BAR_LEGEND_DEFAULT_CONFIG, legend);
});
- me.legend.update(legendDatasets, box);
+ me.legend.update(me.legends, box);
wxLayout.addBox(me.legend.box);
- box = wxLayout.adjustBox();
- padding = padding || box.width * 0.1;
- box.width -= padding;
- box.height -= padding;
- me.box = box;
-
- var _box = box,
- x = _box.x,
- y = _box.y,
- width = _box.width,
- height = _box.height,
- outerWidth = _box.outerWidth,
- outerHeight = _box.outerHeight;
-
- var minSize = Math.min(width, height);
- var outerRadius = Math.max((minSize - borderWidth * 2) / 2, 0) - 10;
- var totalValue = me.calculateTotal(),
- longestLabelWidth = me._longestLabel(totalValue),
- maximalFontSize = me._maximalLabelFontSize(),
- shouldSpace = longestLabelWidth + maximalFontSize + outerRadius * labelDistancePercentage;
-
- // Calculate the space between pie's border and margin of chart
- var widthSpace = (width - (outerRadius + borderWidth) * 2) / 2;
- if (widthSpace < shouldSpace) {
- outerRadius -= shouldSpace - widthSpace;
- }
+ // Thirdly, draw scale
+ me._drawScale(wxLayout);
- var innerRadius = cutoutPercentage ? outerRadius / 100 * cutoutPercentage : 0,
- innerRadiusColor = me.config.backgroundColor || "#ffffff";
- var pointX = x + outerWidth / 2,
- pointY = y + outerHeight / 2;
+ box = wxLayout.adjustBox();
+ // Calculate bar ruler
+ me.barRuler = me.calculateBarRuler();
+ // Finally, draw bar
+ var hasNeg = false;
+ var barConfigs = me.legends.map(function (legend, legendIndex) {
+ var config = {
+ box: box,
+ legend: legend
+ };
+ var key = legend.key;
+ config.dataset = me.visDatasets.map(function (data, index) {
+ hasNeg = hasNeg || data[key] < 0;
+ return {
+ value: data[key],
+ data: data,
+ point: me.calculateBarRect(index, legendIndex),
+ index: index
+ };
+ });
+ return config;
+ });
- var opt = {
- pointX: pointX,
- pointY: pointY,
- innerRadius: innerRadius,
- outerRadius: outerRadius,
- totalValue: totalValue,
- borderWidth: borderWidth,
- rotation: rotation,
- totalAngle: Math.PI * 2.0
- };
+ barConfigs.forEach(function (bar) {
+ return me.drawBar(bar, hasNeg);
+ });
- me.drawDoughnut(me.visDatasets, opt);
if (animate) {
me.emit('animate', { animation: me.wxAnimation });
me.wxAnimation.run(true);
me.wxAnimation.on('done', function () {
+ if (zeroLine) me._darwZeroLine();
me.emit('draw', {
- options: opt
+ options: barConfigs
});
});
} else {
+ if (zeroLine) me._darwZeroLine();
me.emit('draw', {
- options: opt
+ options: barConfigs
});
}
- wxLayout.addBox(me.box);
}
+
+ /**
+ * Draw zero line
+ * @private
+ */
+
}, {
- key: 'drawData',
- value: function drawData(dataset, options) {
+ key: '_darwZeroLine',
+ value: function _darwZeroLine() {
var me = this,
ctx = me.ctx;
- var pointX = options.pointX,
- pointY = options.pointY,
- startAngle = options.startAngle,
- endAngle = options.endAngle,
- outerRadius = options.outerRadius,
- innerRadius = options.innerRadius,
- totalValue = options.totalValue,
- borderWidth = options.borderWidth;
- var label = dataset.label,
- value = dataset.value,
- color = dataset.color,
- borderColor = dataset.borderColor,
- percentage = dataset.percentage,
- hidden = dataset.hidden;
-
- if (!!hidden) {
- return endAngle;
- }
-
- var centerAngle = startAngle + (endAngle - startAngle) / 2;
- var currentRadius = outerRadius / 100 * percentage;
+ // zero line
+ ctx.save();
+ ctx.fillStyle = me.xAxis.config.color;
+ ctx.lineWidth = me.xAxis.config.lineWidth;
+ var baseY = me.yAxis.getPoint(0).y;
ctx.beginPath();
-
- ctx.arc(pointX, pointY, currentRadius, startAngle, endAngle);
- ctx.arc(pointX, pointY, innerRadius, endAngle, startAngle, true);
-
- ctx.closePath();
- ctx.strokeStyle = borderColor;
- ctx.lineWidth = borderWidth || 0;
- ctx.fillStyle = color;
-
- ctx.fill();
- ctx.lineJoin = 'bevel';
-
- if (borderWidth) {
- ctx.stroke();
- }
- ctx.draw();
- return endAngle;
+ ctx.moveTo(me.xAxis.getPoint(-1).x, baseY);
+ ctx.lineTo(me.xAxis.box.ex, baseY);
+ ctx.stroke();
+ ctx.restore();
}
}, {
- key: 'drawLabel',
- value: function drawLabel(dataset, options) {
+ key: '_getAnimationDrawBar',
+
+ /**
+ * Return a animate tick func
+ * @param barData
+ * @param hasNeg
+ * @return {function(*, *, *)|null}
+ * @private
+ */
+ value: function _getAnimationDrawBar(barData, hasNeg) {
var me = this,
+ backgroundColor = me.config.backgroundColor,
+ stacked = me.chartConfig.stacked,
+ animate = me.chartConfig.animate,
+ animateOpt = me.chartConfig.animateOptions,
ctx = me.ctx;
- var labelDistancePercentage = me.chartConfig.labelDistancePercentage || 0.2;
- var pointX = options.pointX,
- pointY = options.pointY,
- startAngle = options.startAngle,
- endAngle = options.endAngle,
- outerRadius = options.outerRadius,
- innerRadius = options.innerRadius,
- totalValue = options.totalValue,
- borderWidth = options.borderWidth;
- var label = dataset.label,
- value = dataset.value,
- color = dataset.color,
- borderColor = dataset.borderColor,
- fontSize = dataset.fontSize,
- percentage = dataset.percentage,
- format = dataset.format,
- hidden = dataset.hidden;
- if (!!hidden) {
- return;
- }
+ var box = barData.box,
+ legend = barData.legend,
+ dataset = barData.dataset;
+ var display = legend.display,
+ borderWidth = legend.borderWidth,
+ fillStyle = legend.fillStyle,
+ strokeStyle = legend.strokeStyle,
+ fillArea = legend.fillArea,
+ fillAlpha = legend.fillAlpha;
- var centerAngle = startAngle + (endAngle - startAngle) / 2;
- var currentRadius = outerRadius / 100 * percentage;
- label = _helper.is.Function(format) ? format.call(me, label, value, totalValue, currentRadius, dataset, options) : label;
+ // Animation dynamic options
- // Line start point
- var startX = Math.cos(centerAngle) * currentRadius + pointX;
- var startY = Math.sin(centerAngle) * currentRadius + pointY;
+ var dataLen = dataset.length,
+ categoryTicks = (animateOpt.end - animateOpt.start) / dataLen;
- // Line turn around point
- var offsetRadius = currentRadius * labelDistancePercentage,
- turnRadius = currentRadius + offsetRadius;
- var turnX = Math.cos(centerAngle) * turnRadius + pointX;
- var turnY = Math.sin(centerAngle) * turnRadius + pointY;
+ if (!display) {
+ return;
+ }
- // Avoid Collision
- var adjustPoint = me.avoidCollision({
- x: turnX,
- y: turnY
- }, {
- x: pointX,
- y: pointY
- });
- turnX = adjustPoint.x;
- turnY = adjustPoint.y;
+ return function (t, lastData, toNext) {
+ var dataIndex = Math.floor(t / categoryTicks);
+ var currData = dataIndex < dataLen ? dataset[dataIndex] : dataset[dataLen - 1];
+ var point = currData.point;
- var textLen = ctx.measureText(label).width;
- var endX = turnX + (turnX - pointX > 0 ? offsetRadius : -offsetRadius),
- endY = turnY;
- var textX = turnX - pointX > 0 ? endX + 4 : endX - 4 - textLen,
- textY = endY + ctx.fontSize / 2;
+ var percent = t % categoryTicks / categoryTicks;
- ctx.beginPath();
- ctx.lineWidth = 1;
- ctx.strokeStyle = color;
- ctx.fillStyle = color;
- ctx.fontSize = fontSize;
- ctx.moveTo(startX, startY);
- ctx.lineTo(turnX, turnY);
- ctx.lineTo(endX, endY);
- ctx.stroke();
- ctx.fillText(label, textX, textY);
- ctx.draw();
- }
- }, {
- key: 'drawDoughnut',
+ if (lastData) {
+ var lastDataIndex = lastData.dataIndex,
+ lastPercent = lastData.percent,
+ lastt = lastData.t,
+ lastx = lastData.x,
+ lasty = lastData.y,
+ lastWidth = lastData.width,
+ lastHeight = lastData.height;
- /**
- * Draw Doughnut
- * @param {Object} dateset - Doughnut data
- * @param {Object} opt - Draw options
- */
- value: function drawDoughnut(dataset, opt) {
- var me = this,
- animate = me.chartConfig.animate,
- animateOpt = me.chartConfig.animateOptions;
+ if (lastDataIndex < dataLen && lastx) {
+ ctx.save();
+ // TODO: optimize clear check!!
+ if (backgroundColor) {
+ ctx.beginPath();
+ ctx.lineWidth = borderWidth;
+ ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';
+ ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';
+ ctx.fillRect(lastx, lasty, lastWidth, lastHeight);
+ } else {
+ ctx.clearRect(lastx, lasty, lastWidth, lastHeight);
+ }
+ if (borderWidth) {
+ ctx.beginPath();
+ ctx.lineWidth = borderWidth + 0.5;
+ ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';
+ ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';
+ if (stacked && hasNeg) {
+ ctx.rect(lastx, lasty, lastWidth, lastHeight);
+ } else {
+ ctx.moveTo(lastx, lasty + lastHeight);
+ ctx.lineTo(lastx, lasty);
+ ctx.lineTo(lastx + lastWidth, lasty);
+ ctx.lineTo(lastx + lastWidth, lasty + lastHeight);
+ }
+ ctx.stroke();
+ }
+ ctx.draw();
+ ctx.restore();
+ }
- if (animate) {
- var actionAnimation = me._getAnimationDrawDoughnut(dataset, opt);
- if (!actionAnimation) {
- return;
+ if (lastDataIndex !== dataIndex && !!lastPercent) {
+ // End the lasted bar
+ var _lastData = lastDataIndex < dataLen ? dataset[lastDataIndex] : dataset[dataLen - 1];
+ me.__drawBar(_lastData, 1, box, legend, stacked, hasNeg, true);
+ }
}
- me.wxAnimation.pushActions(actionAnimation);
- } else {
- me._drawDoughnut(dataset, opt);
- }
- }
- }, {
- key: '_getAnimationDrawDoughnut',
- value: function _getAnimationDrawDoughnut(dataset, opt) {
- var me = this,
- ctx = me.ctx,
- animateOpt = me.chartConfig.animateOptions,
- backgroundColor = me.config.backgroundColor;
- var pointX = opt.pointX,
- pointY = opt.pointY,
- totalValue = opt.totalValue,
- rotation = opt.rotation,
- outerRadius = opt.outerRadius,
- borderWidth = opt.borderWidth,
- totalAngle = opt.totalAngle;
-
- var aniTotal = animateOpt.end - animateOpt.start;
- return function (t, lastt, toNext) {
- var percent = t / aniTotal;
- var currTotalAngle = totalAngle * percent;
+ var px = void 0,
+ py = void 0,
+ width = void 0,
+ height = void 0;
+ if (dataIndex < dataLen && (!!percent || !point)) {
+ var _me$__drawBar = me.__drawBar(currData, percent, box, legend, stacked, hasNeg);
- // Clear
- ctx.save();
- ctx.beginPath();
- ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';
- ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';
- ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);
- ctx.fill();
- if (borderWidth) {
- ctx.beginPath();
- ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);
- ctx.lineJoin = 'bevel';
- ctx.lineWidth = borderWidth;
- ctx.stroke();
+ px = _me$__drawBar.px;
+ py = _me$__drawBar.py;
+ width = _me$__drawBar.width;
+ height = _me$__drawBar.height;
}
- ctx.draw();
- if (animateOpt.end === t) {
- me._drawDoughnut(dataset, opt);
- } else {
- (function () {
- var drawAngle = rotation;
- dataset.forEach(function (data) {
- var startAngle = drawAngle,
- endAngle = startAngle + currTotalAngle * (data.value / totalValue);
- var o = (0, _helper.extend)({ startAngle: startAngle, endAngle: endAngle }, opt);
- me.drawData(data, o);
- drawAngle = endAngle;
- });
- })();
- }
- ctx.restore();
- return t;
+ return {
+ dataIndex: dataIndex,
+ percent: percent,
+ t: t,
+ x: px,
+ y: py,
+ width: width,
+ height: height
+ };
};
}
}, {
- key: '_drawDoughnut',
- value: function _drawDoughnut(dataset, opt) {
- var me = this;
- var totalValue = opt.totalValue,
- rotation = opt.rotation,
- totalAngle = opt.totalAngle;
+ key: '_drawBar',
+ value: function _drawBar(barData, hasNeg) {
+ var me = this,
+ stacked = me.chartConfig.stacked,
+ ctx = me.ctx;
+ var box = barData.box,
+ legend = barData.legend,
+ dataset = barData.dataset;
+ var display = legend.display,
+ borderWidth = legend.borderWidth,
+ fillStyle = legend.fillStyle,
+ strokeStyle = legend.strokeStyle,
+ fillArea = legend.fillArea,
+ fillAlpha = legend.fillAlpha;
- var drawAngle = rotation;
- me.initAvoidCollision();
- dataset.forEach(function (data) {
- var startAngle = drawAngle,
- endAngle = startAngle + totalAngle * (data.value / totalValue);
- var o = (0, _helper.extend)({ startAngle: startAngle, endAngle: endAngle }, opt);
- me.drawData(data, o);
- me.drawLabel(data, o);
- drawAngle = endAngle;
+ if (!display) {
+ return;
+ }
+
+ dataset.forEach(function (d) {
+ me.__drawBar(d, 1, box, legend, stacked, hasNeg, true);
+ // if (stacked && hasNeg) {
+ // ctx.beginPath();
+ // ctx.rect(point.x ,point.y ,point.barWidth, point.barHeight);
+ // if (borderWidth) {
+ // ctx.stroke();
+ // }
+ // if (fillArea) {
+ // ctx.globalAlpha = fillAlpha;
+ // ctx.fill();
+ // ctx.globalAlpha = 1;
+ // }
+ // } else {
+ // // | 1 2 |
+ // // | 0 3 |
+ // let points = [
+ // [point.x, point.y + point.barHeight],
+ // [point.x, point.y],
+ // [point.x + point.barWidth, point.y],
+ // [point.x + point.barWidth, point.y + point.barHeight]
+ // ];
+ //
+ // ctx.moveTo(...points[0]);
+ // ctx.lineTo(...points[1]);
+ // ctx.lineTo(...points[2]);
+ // ctx.lineTo(...points[3]);
+ //
+ // if (borderWidth) {
+ // ctx.stroke();
+ // }
+ // if (fillArea) {
+ // ctx.globalAlpha = fillAlpha;
+ // ctx.fill();
+ // ctx.globalAlpha = 1;
+ // }
+ // }
});
}
- // Get longest label
+ /**
+ * Draw one line
+ * @param {Object} barData - Line dataset
+ * @param {Object} barData.legend - Legend's config
+ * @param {Object[]} barData[].value - Data of each line point
+ * @param {Object[]} barData[].data - The data object
+ * @param {Object[]} barData[].point - The point for rending.
+ * @parma {boolean} hasNeg - Has negative value or not
+ * @private
+ */
}, {
- key: '_longestLabel',
- value: function _longestLabel(totalValue) {
+ key: 'drawBar',
+ value: function drawBar(barData, hasNeg) {
var me = this,
- visDatasets = me.visDatasets,
- ctx = me.ctx;
- var maxLabelWidth = 0;
- visDatasets.forEach(function (dataset) {
- var label = dataset.label,
- value = dataset.value,
- format = dataset.format;
+ animate = me.chartConfig.animate;
- label = _helper.is.Function(format) ? format.call(me, label, value, totalValue, 0, dataset) : label;
- var textLen = ctx.measureText(label).width;
-
- maxLabelWidth = textLen > maxLabelWidth ? textLen : maxLabelWidth;
- });
- return maxLabelWidth;
+ if (animate) {
+ var actionAnimation = me._getAnimationDrawBar(barData, hasNeg);
+ me.wxAnimation.pushActions(actionAnimation);
+ // me.wxAnimation.on('done', () => {
+ // me._drawBar(barData, hasNeg);
+ // })
+ } else {
+ me._drawBar(barData, hasNeg);
+ }
}
- // Get maximal font size of label
- }, {
- key: '_maximalLabelFontSize',
- value: function _maximalLabelFontSize() {
- var me = this,
- visDatasets = me.visDatasets;
- var max = 0;
- visDatasets.forEach(function (dataset) {
- var fontSize = dataset.fontSize;
+ /**
+ * Bar's render ruler
+ * @typedef {Object} BarRuler
+ * @property {number} tickWidth - The width of one ticket.
+ * @property {number} pointPercentage - Percent (0-1) of the space for each data point
+ * @property {number} pointWidth - The width of each data point
+ * @property {number} pointIntervalWidth - The remaining width of the space for each data point
+ * @property {number} barIntervalWidth - The remaining width of each bar
+ * @property {Object[]} legends - legends's setting
+ * @property {number} legends.barPercentage - Percent (0-1) of the available width each bar should be within the data point space
+ * @property {number} legends._standardPercentage - The real percent of the available with at each point scope
+ * @property {number} legends.barWidth - The width of bar
+ */
- max = fontSize > max ? fontSize : max;
- });
- return max;
- }
- // Avoid Collision
+ /**
+ * Calculate the bar's base ruler
+ * @param {WxScale} [scale=this.xAxis] - Bar's scale
+ * @return {BarRuler} Bar ruler
+ */
}, {
- key: 'initAvoidCollision',
- value: function initAvoidCollision() {
- this._lastPoint = null;
- }
- }, {
- key: 'avoidCollision',
- value: function avoidCollision(newPoint, centerPoint) {
- var avoidUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.ctx.fontSize + 4;
+ key: 'calculateBarRuler',
+ value: function calculateBarRuler() {
+ var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.xAxis;
- var me = this,
- box = me.box;
- var cpx = centerPoint.x,
- cpy = centerPoint.y;
- if (me._lastPoint) {
- var lpx = me._lastPoint.x,
- lpy = me._lastPoint.y;
- var npx = newPoint.x,
- npy = newPoint.y;
- if ((npx - cpx) * (lpx - cpx) > 0 && Math.abs(lpy - npy) < avoidUnit) {
- var ny = npx - cpx > 0 ? lpy + avoidUnit : lpy - avoidUnit;
- newPoint.y = ny;
- }
+ var me = this;
+ var globalBarWidth = void 0,
+ globalBarPercentage = me.chartConfig.barPercentage,
+ pointPercentage = me.chartConfig.pointPercentage,
+ stacked = me.chartConfig.stacked,
+ legends = me.legends;
+ var legendLen = legends.length;
+
+ var tickWidth = scale.calculateTickWidth();
+ // One scale's point space
+ var pointWidth = tickWidth * pointPercentage;
+ var pointIntervalWidth = (tickWidth - pointWidth) / 2;
+
+ // Standardization every bar's percentage
+ var totalStandardPercentage = 0;
+ if (!globalBarPercentage) {
+ globalBarPercentage = stacked ? Math.max.apply(Math, _toConsumableArray(legends.map(function (x) {
+ return x.barPercentage || 0.8;
+ }))) || 0.8 : 0.8;
}
- this._lastPoint = newPoint;
- return newPoint;
- }
- }]);
+ globalBarWidth = Math.max.apply(Math, _toConsumableArray([globalBarPercentage * pointWidth].concat(legends.map(function (x) {
+ return _helper.is.Number(x.barWidth) ? x.barWidth : 0;
+ }))));
- return WxDoughnut;
- }(_wxChart2.default);
+ legends.forEach(function (legend) {
+ if (stacked) {
+ legend.barWidth = globalBarWidth;
+ legend.barPercentage = globalBarPercentage;
+ legend._standardPercentage = globalBarPercentage / legendLen;
+ } else {
+ var standardPercentage = void 0;
+ var barPercentage = legend.barPercentage ? legend.barPercentage > 1 ? 1.0 : legend.barPercentage : globalBarPercentage;
- exports.default = WxDoughnut;
- }, { "../core/animation": 14, "../core/layout": 16, "../core/legend": 17, "../core/title": 19, "../util/helper": 24, "../util/randomColor": 26, "../util/wxCanvas": 29, "./wxChart": 13 }], 12: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
+ if (legend.barWidth) {
+ // Bar fixed width...
+ standardPercentage = legend.barWidth / tickWidth;
+ } else {
+ standardPercentage = barPercentage / legendLen;
+ legend.barWidth = pointWidth * standardPercentage;
+ }
+ totalStandardPercentage += standardPercentage;
+ legend._standardPercentage = standardPercentage;
+ }
+ });
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ // Check total percentage
+ if (totalStandardPercentage > 1) {
+ throw Error('Bar\'s width too large!');
+ } else if (stacked) {
+ totalStandardPercentage = globalBarPercentage;
+ }
- var _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
- }
- }return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
- };
- }();
+ var barIntervalWidth = legendLen > 1 ? pointWidth * (1 - totalStandardPercentage) / (legendLen - 1) : pointWidth * (1 - totalStandardPercentage);
- var _get = function get(object, property, receiver) {
- if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {
- var parent = Object.getPrototypeOf(object);if (parent === null) {
- return undefined;
- } else {
- return get(parent, property, receiver);
+ return { tickWidth: tickWidth, pointPercentage: pointPercentage, pointWidth: pointWidth, pointIntervalWidth: pointIntervalWidth, legends: legends, barIntervalWidth: barIntervalWidth };
}
- } else if ("value" in desc) {
- return desc.value;
- } else {
- var getter = desc.get;if (getter === undefined) {
- return undefined;
- }return getter.call(receiver);
- }
- };
-
- var _es6Mixins = require('es6-mixins');
- var _es6Mixins2 = _interopRequireDefault(_es6Mixins);
+ /**
+ * Calculate the box of one "rect"
+ * @param {number} index - The index of item
+ * @param {number} legendIndex - The index of legend
+ * @param {WxScale} [xScale=this.xAxis] - Bar's x-axis
+ * @param {WxScale} [yScale=this.yAxis] - Bar's x-axis
+ */
- var _helper = require('../util/helper');
+ }, {
+ key: 'calculateBarRect',
+ value: function calculateBarRect(index, legendIndex) {
+ var xScale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.xAxis;
+ var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;
- var _randomColor = require('../util/randomColor');
+ var me = this,
+ stacked = me.chartConfig.stacked,
+ barRuler = me.barRuler || me.calculateBarRuler(xScale);
- var _randomColor2 = _interopRequireDefault(_randomColor);
+ var legendOpt = me.legends[legendIndex];
+ if (!legendOpt) {
+ return;
+ }
+ // Calculate the bar's width in front of this legend
+ var frontBarWidth = me.legends.slice(0, legendIndex).reduce(function (acc, cur) {
+ return acc + cur.barWidth;
+ }, 0);
+ var data = me.visDatasets[index];
+ var value = legendOpt.key && typeof data[legendOpt.key] !== 'undefined' ? data[legendOpt.key] : null;
+ if (_helper.is.Null(value) || _helper.is.Undefined(value)) {
+ return;
+ }
- var _wxCanvas = require('../util/wxCanvas');
+ var xPoint = void 0,
+ yPoint = void 0,
+ barWidth = void 0,
+ barHeight = void 0;
+ var xPointInstance = xScale.getPoint(index);
+ if (stacked) {
+ xPoint = xPointInstance.x - barRuler.pointWidth / 2 + barRuler.barIntervalWidth / 2;
+ yPoint = me._getStackPoint(index, legendIndex).y;
+ barWidth = legendOpt.barWidth;
- var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
+ // TODO: Find another way to replace this variable :__sumNeg __sumPos
+ var baseY = yScale.getPoint(0).y;
+ barHeight = value < 0 ? value / data.__sumNeg * (yScale.getPoint(data.__sumNeg).y - baseY) : value / data.__sumPos * (baseY - yScale.getPoint(data.__sumPos).y);
- var _wxChart = require('./wxChart');
+ yPoint = value < 0 ? yPoint - barHeight : yPoint;
+ } else {
+ xPoint = xPointInstance.x - barRuler.pointWidth / 2 + frontBarWidth + barRuler.barIntervalWidth / 2 * (legendIndex + 1);
+ yPoint = yScale.getPoint(value).y;
+ barWidth = legendOpt.barWidth;
+ barHeight = xPointInstance.y - yPoint;
+ }
- var _wxChart2 = _interopRequireDefault(_wxChart);
+ return { x: xPoint, y: yPoint, barWidth: barWidth, barHeight: barHeight };
+ }
- var _title = require('../core/title');
+ /**
+ * Draw the scale of chart
+ *
+ * @private
+ */
- var _title2 = _interopRequireDefault(_title);
+ }, {
+ key: '_drawScale',
+ value: function _drawScale(wxLayout) {
+ var box = void 0,
+ me = this;
- var _scale = require('../core/scale');
+ box = wxLayout.adjustBox();
+ var xDatasets = me.xScaleAxisDatas(),
+ yDatasets = me.yScaleAxisDatas(box);
- var _scale2 = _interopRequireDefault(_scale);
+ var _me$wxCrossScale$draw = me.wxCrossScale.draw(box, xDatasets, yDatasets),
+ xBox = _me$wxCrossScale$draw.xBox,
+ yBox = _me$wxCrossScale$draw.yBox;
- var _scale3 = require('../scale/scale.liner');
+ wxLayout.addBox(xBox);
+ wxLayout.addBox(yBox);
+ }
- var _scale4 = _interopRequireDefault(_scale3);
+ /**
+ * Build the yAxis datasets
+ * @param {BoxInstance} area - The area of chart
+ */
- var _scale5 = require('../scale/scale.crosshelp');
+ }, {
+ key: 'yScaleAxisDatas',
+ value: function yScaleAxisDatas(area) {
+ var me = this,
+ stacked = me.chartConfig.stacked,
+ ctx = me.ctx;
+ var yScaleItemOptions = me.chartConfig.yScaleItemOptions;
+ var tickLimits = me.yAxis.calculateTickLimit(area, ctx);
- var _scale6 = _interopRequireDefault(_scale5);
+ if (stacked) {
+ //let {max, min} = me.stackYScaleAxisLimit();
+ var _me$stackYScaleAxisLi = me.stackYScaleAxisLimit(),
+ max = _me$stackYScaleAxisLi.max,
+ min = _me$stackYScaleAxisLi.min;
- var _scale7 = require('../scale/scale.stackhelp');
+ return me.yAxis.buildDatasets(max, min, tickLimits, undefined, yScaleItemOptions);
+ } else {
+ // First, get all available values and calculate the max/min value
+ var _visDatasets$reduce = this.visDatasets.reduce(function (pre, cur) {
+ var max = pre.max,
+ min = pre.min;
- var _scale8 = _interopRequireDefault(_scale7);
+ if (cur.display) {
+ var curValue = me.legends.map(function (legend) {
+ if (legend.key) {
+ return cur[legend.key] || 0;
+ }
+ }).concat(max, min);
+ max = Math.max.apply(Math, curValue);
+ min = Math.min.apply(Math, curValue);
+ }
+ return { max: max, min: min };
+ }, {
+ max: 0,
+ min: 0
+ }),
+ _max = _visDatasets$reduce.max,
+ _min = _visDatasets$reduce.min;
- var _scale9 = require('../scale/scale.category');
+ return me.yAxis.buildDatasets(_max, _min, tickLimits, undefined, yScaleItemOptions);
+ }
+ }
- var _scale10 = _interopRequireDefault(_scale9);
+ /**
+ * Build the xAxis datasets
+ */
- var _legend = require('../core/legend');
+ }, {
+ key: 'xScaleAxisDatas',
+ value: function xScaleAxisDatas() {
+ var me = this;
+ var xScaleItemOptions = me.chartConfig.xScaleItemOptions;
+ var xScaleConfig = me.labels.map(function (label) {
+ var item = {
+ 'text': label
+ };
+ if (typeof xScaleItemOptions !== 'undefined') {
+ item = (0, _helper.extend)(item, xScaleItemOptions);
+ }
+ return item;
+ });
- var _legend2 = _interopRequireDefault(_legend);
+ return me.xAxis.buildDatasets(xScaleConfig);
+ }
+ }, {
+ key: 'labels',
+ get: function get() {
+ var me = this,
+ tmp = void 0;
+ if (me._labels) {
+ return me._labels;
+ } else if (tmp = me.chartConfig.labels) {
+ if (_helper.is.Array(tmp)) {
+ return tmp;
+ }
+ }
+ me._labels = me.visDatasets.map(function (dataset) {
+ return dataset.label;
+ });
+ return me._labels;
+ }
+ }, {
+ key: 'legends',
+ get: function get() {
+ var me = this;
+ if (!me._legends) {
+ me._legends = me._getLegendConfig();
+ }
+ return me._legends;
+ },
+ set: function set(value) {
+ this._legends = value;
+ }
+ }]);
+
+ return WxBar;
+ }(_wxChart2.default);
+
+ exports.default = WxBar;
+ }, { "../core/animation": 15, "../core/layout": 17, "../core/legend": 18, "../core/scale": 19, "../core/title": 20, "../scale/scale.category": 21, "../scale/scale.crosshelp": 22, "../scale/scale.liner": 23, "../scale/scale.stackhelp": 24, "../util/helper": 25, "../util/randomColor": 27, "../util/wxCanvas": 29, "./wxChart": 14, "es6-mixins": 5, "tinycolor2": 10 }], 12: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
+
+ var _get = function get(object, property, receiver) {
+ if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {
+ var parent = Object.getPrototypeOf(object);if (parent === null) {
+ return undefined;
+ } else {
+ return get(parent, property, receiver);
+ }
+ } else if ("value" in desc) {
+ return desc.value;
+ } else {
+ var getter = desc.get;if (getter === undefined) {
+ return undefined;
+ }return getter.call(receiver);
+ }
+ };
+
+ var _wxCanvas = require('../util/wxCanvas');
+
+ var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
+
+ var _wxChart = require('./wxChart');
+
+ var _wxChart2 = _interopRequireDefault(_wxChart);
+
+ var _title = require('../core/title');
+
+ var _title2 = _interopRequireDefault(_title);
var _layout = require('../core/layout');
var _layout2 = _interopRequireDefault(_layout);
+ var _legend = require('../core/legend');
+
+ var _legend2 = _interopRequireDefault(_legend);
+
+ var _randomColor = require('../util/randomColor');
+
+ var _randomColor2 = _interopRequireDefault(_randomColor);
+
+ var _helper = require('../util/helper');
+
var _animation = require('../core/animation');
var _animation2 = _interopRequireDefault(_animation);
@@ -3944,45 +4520,16 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
- var Bezier = require('bezier-js');
-
- // Line legend's default config
- var WX_LINE_LEGEND_DEFAULT_CONFIG = {
- lineWidth: 1,
- // 'capStyle': 'butt', //Default line cap is cap,
- lineJoin: 'miter',
- fillArea: false,
- fillAlpha: 0.5,
- display: true,
- spanGaps: false, // If set true, will draw line between the null point
- tension: 0.4 // Default bezier curve tension. Set to 0 for no bezier curves.
- };
- // Line default config
- var WX_LINER_DEFAULT_CONFIG = {
- // Scale options
- xScaleOptions: {
- position: 'bottom'
- },
- xScaleItemOptions: undefined,
- yScaleOptions: {
- position: 'left'
- },
- yScaleItemOptions: undefined,
- crossScaleOptions: {},
- // The title text or a title config object
- title: undefined,
-
- stacked: false, // If true, line are stacked on the x-axis
- discardNeg: false,
-
- // The legend of line chart
- legends: [], // lineWidth, lineJoin, fillStyle, strokeStyle, fillArea can be set in here
+ // Doughnut default config
+ var WX_DOUGHNUT_DEFAULT_CONFIG = {
legendOptions: {
'position': 'bottom'
},
+ // The percentage of the chart that we cut out of the middle.
+ cutoutPercentage: 50,
- // Point global options
- point: {},
+ // The rotation of the chart, where the first data arc begins.
+ rotation: Math.PI * -0.5,
// The randomColor scheme
// See https://github.com/davidmerfield/randomColor
@@ -3991,31 +4538,49 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
luminosity: 'light'
},
- // The dataset's default key
- defaultKey: 'value',
+ point: {},
+
+ // The title text or a title config object
+ title: undefined,
+
+ // The borderWidth
+ borderWidth: 2,
+ // Chart padding, default auto set
+ padding: undefined,
+
+ labelDistancePercentage: 0.15,
// Animation
animate: true,
animateOptions: {
start: 1,
- end: 1001,
+ end: 501,
duration: 1000
}
};
- var WX_LINER_ITEM_DEFAULT_CONFIG = {
- pointRadius: 2,
- pointStyle: 'circle', // Support triangle, rect and Image object
- pointBorderWidth: 1,
- pointBorderColor: '#ffffff',
- display: true
+ /**
+ * Doughnut item config
+ *
+ * value: The value of chart
+ * label: The legend text
+ * color: The color of item ,by default we use the randomColour scheme to create color
+ * radius: The percentage of radius, default is '100'
+ * legend: [Object] legend options
+ */
+ var WX_DOUGHNUT_ITEM_DEFAULT_CONFIG = {
+ showItem: true,
+ // format: // title format function
+ display: true,
+ fontSize: 11,
+ percentage: 100
};
- var WxLiner = function (_WxChart) {
- _inherits(WxLiner, _WxChart);
+ var WxDoughnut = function (_WxChart) {
+ _inherits(WxDoughnut, _WxChart);
/**
- * WxLiner chart
+ * WxDoughnut chart
* @constructor
* @param {string} id - The canvas element's id
* @param {Object} config
@@ -4024,43 +4589,19 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
* @param {number} [config.padding=] - The padding of canvas.
* @param {string} [config.display=block] - The display style of chart.
*
- * @param {Object} config.legendOptions=[] - The legend & label options.You should set 'key' to bind the attribute in datasets which is the value of the point.
+ * @param {number} [config.cutoutPercentage=50] - The percentage of the chart that we cut out of the middle.
+ * @param {number} [config.rotation=Math.PI * -0.5] - The rotation of the chart, where the first data arc begins.
+ * @param {Object} [config.color=red] - The randomColor options.
* @param {(string|Object)} [config.title=] - The title text or title options of chart.
- * @example
- * datasets:[{
- * valueA: 30,
- * valueB: 40,
- * label: '一月'
- * }, {
- * valueA: 20,
- * valueB: 50,
- * pointRadius: 2,
- * label: '二月'
- * },...]
- *
- * legends: [{
- * 'text': 'valueA Text',
- * 'key': 'valueA',
- * 'strokeStyle': '#3385ff'
- * }, {
- * text: 'valueB Text',
- * key: 'valueB'
- * }]
+ * @param {Object} [config.legendOptions=] - The legend options of chart.
*/
- function WxLiner(id, config) {
- _classCallCheck(this, WxLiner);
+ function WxDoughnut(id, config) {
+ _classCallCheck(this, WxDoughnut);
- var _this = _possibleConstructorReturn(this, (WxLiner.__proto__ || Object.getPrototypeOf(WxLiner)).call(this, id, config));
+ var _this = _possibleConstructorReturn(this, (WxDoughnut.__proto__ || Object.getPrototypeOf(WxDoughnut)).call(this, id, config));
- _initialiseProps.call(_this);
-
- (0, _es6Mixins2.default)([_scale8.default], _this, {
- // Mixins will create a new method to nested call all duplicate method
- mergeDuplicates: false
- });
-
- var me = _this;
- me.chartConfig = (0, _helper.extend)({}, WX_LINER_DEFAULT_CONFIG, config);
+ var me = _this;
+ me.chartConfig = (0, _helper.extend)({}, WX_DOUGHNUT_DEFAULT_CONFIG, config);
me.title = null;
// Initialize title and legend
@@ -4069,13 +4610,7 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;
}
- // Initialize legend
me.legend = new _legend2.default(me, me.chartConfig.legendOptions);
-
- // Initialize x,y Scale
- me.yAxis = new _scale4.default(me, me.chartConfig.yScaleOptions);
- me.xAxis = new _scale10.default(me, me.chartConfig.xScaleOptions);
- me.wxCrossScale = new _scale6.default(me.xAxis, me.yAxis, me.chartConfig.crossScaleOptions);
me.wxLayout = new _layout2.default(me);
// Initialize wxAnimation
@@ -4087,59 +4622,25 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
return _this;
}
- // Get/Set labels
-
-
- _createClass(WxLiner, [{
- key: '_getLegendConfig',
-
- /**
- * Build legends config
- * @private
- */
- value: function _getLegendConfig() {
- var me = this,
- defaultKey = me.chartConfig.defaultKey || 'value',
- legendsConfig = me.chartConfig.legends;
- if (!legendsConfig) {
- if (me.labels && me.labels.length) {
- legendsConfig = me.labels.map(function (label) {
- return { 'text': label, 'key': defaultKey };
- });
- } else {
- throw new Error('Can not get legend config!');
- }
- } else {
- legendsConfig = legendsConfig.map(function (legend) {
- return (0, _helper.extend)(true, {
- 'key': defaultKey
- }, legend);
- });
- }
- return legendsConfig;
- }
-
- /**
- * Update a datesets of chart and reDraw
- * @param {Object} datasets - data sets
- * @param {string} [datasets[].display] - Disaply the bar or not
- * @param {number} [datasets[].fillStyle] - Point fill color. The default color will randomly assigned by 'color' option.
- * @param {string} [datasets[].strokeStyle='#ffffff'] - Point's border color
- * @param {string} [datasets[].pointStyle='circle'] - Point style, support triangle, rect and Image object
- * @param {number} [datasets[].pointRadius=3] - Point radius if style is circle
- * @param {number} [datasets[].pointBorderWidth=1.5] - Point border width
- * @param {string} [datasets[].pointBorderColor='auto'] - Point border color. If not set, will same as lineColor(luminosity+50%)
- * @param {number} [datasets[].display=true] - display the point or not
- * @returns {*}
- */
+ /**
+ * Update a datesets of chart and reDraw
+ * @param {Object[]} datasets
+ * @param {string} [datasets[].display=true] - Display or not.
+ * @param {string} datasets[].label - The label text of an dataset.
+ * @param {function} datasets[].format - The label text format function.
+ * @param {number} datasets[].value - The value of an dataset.
+ * @param {string} [datasets[].color] - The color of an dataset.
+ * @param {string} [datasets[].borderColor]- The border color of an dataset.
+ * @param {string} [datasets[].percentage=100] - The percentage of radius, default is '100'
+ * @param {string} [datasets[].legend] - The legend option of an dataset. We will set legend text as same as label text.
+ *
+ */
- }, {
+ _createClass(WxDoughnut, [{
key: 'update',
value: function update(datasets) {
var me = this;
- me._labels = null;
- me._legends = null;
- _get(WxLiner.prototype.__proto__ || Object.getPrototypeOf(WxLiner.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_LINER_ITEM_DEFAULT_CONFIG, me.chartConfig.point));
+ _get(WxDoughnut.prototype.__proto__ || Object.getPrototypeOf(WxDoughnut.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_DOUGHNUT_ITEM_DEFAULT_CONFIG, me.chartConfig.point));
me.wxLayout.removeAllBox();
if (me.wxAnimation) me.wxAnimation.reset();
return me.draw();
@@ -4155,13 +4656,13 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
var box = void 0,
me = this,
animate = me.chartConfig.animate,
- stacked = me.chartConfig.stacked,
- discardNeg = me.chartConfig.discardNeg,
+ labelDistancePercentage = me.chartConfig.labelDistancePercentage,
wxLayout = me.wxLayout;
var _me$chartConfig = me.chartConfig,
cutoutPercentage = _me$chartConfig.cutoutPercentage,
rotation = _me$chartConfig.rotation,
color = _me$chartConfig.color,
+ title = _me$chartConfig.title,
borderWidth = _me$chartConfig.borderWidth,
padding = _me$chartConfig.padding;
@@ -4169,720 +4670,489 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
options: me.chartConfig
});
- // First, we draw title
box = wxLayout.adjustBox();
+ // First, we draw title
if (me.title) {
me.title.update(me.titleText, box);
wxLayout.addBox(me.title.box);
}
- // Second, random color and get legend datasets
box = wxLayout.adjustBox();
- var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.legends.length }));
-
- me.legends = me.legends.map(function (legend, index) {
- if (!legend.strokeStyle) {
- legend.strokeStyle = me.chartConfig.backgroundColor || legend.borderColor || rColors[index];
+ // Second, random color and get legend datasets
+ var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.visDatasets.length }));
+ var rBorderColor = (0, _randomColor2.default)({
+ hue: color.hue || 'black',
+ luminosity: 'dark',
+ count: 1
+ });
+ var legendDatasets = [];
+ me.visDatasets.forEach(function (dataset, index) {
+ if (!dataset.color) {
+ dataset.color = rColors[index];
+ }
+ if (!dataset.borderColor) {
+ dataset.borderColor = me.config.backgroundColor || "#ffffff";
}
- return (0, _helper.extend)(true, {
- fillStyle: rColors[index]
- }, WX_LINE_LEGEND_DEFAULT_CONFIG, legend);
+ var legend = dataset.legend;
+ if (!legend || _helper.is.String(legend)) {
+ legendDatasets.push({
+ display: dataset.display,
+ text: _helper.is.String(legend) ? legend : dataset.label,
+ fillStyle: dataset.color,
+ strokeStyle: rBorderColor[0]
+ });
+ } else if (_helper.is.PureObject(legend)) {
+ legendDatasets.push((0, _helper.extend)({
+ display: dataset.display
+ }, legend));
+ }
});
- me.legend.update(me.legends, box);
+ me.legend.update(legendDatasets, box);
wxLayout.addBox(me.legend.box);
- // Thirdly, draw scale
- me._drawScale();
-
- // Finally, draw line
- var lineConfigs = me.legends.map(function (legend, legendIndex) {
- var config = {
- legend: legend
- };
- var key = legend.key;
- // config.dataset = me.visDatasets.map(data => {return {value: data[key], data: data}});
- config.dataset = me.visDatasets.map(function (data, index) {
- var value = data[key],
- point = void 0;
+ box = wxLayout.adjustBox();
+ padding = padding || box.width * 0.1;
+ box.width -= padding;
+ box.height -= padding;
+ me.box = box;
- if (value) {
- var yAxisPoint = void 0,
- xAxisPoint = me.xAxis.getPoint(index);
- if (stacked) {
- if (discardNeg) {
- var _me$_getStackValue = me._getStackValue(index, legendIndex),
- sumPos = _me$_getStackValue.sumPos;
+ var _box = box,
+ x = _box.x,
+ y = _box.y,
+ width = _box.width,
+ height = _box.height,
+ outerWidth = _box.outerWidth,
+ outerHeight = _box.outerHeight;
- yAxisPoint = value < 0 ? me.yAxis.getPoint(sumPos) : me.yAxis.getPoint(sumPos + value);
- } else {
- yAxisPoint = me._getStackPoint(index, legendIndex);
- }
- } else {
- yAxisPoint = me.yAxis.getPoint(value);
- }
+ var minSize = Math.min(width, height);
+ var outerRadius = Math.max((minSize - borderWidth * 2) / 2, 0) - 10;
+ var totalValue = me.calculateTotal(),
+ longestLabelWidth = me._longestLabel(totalValue),
+ maximalFontSize = me._maximalLabelFontSize(),
+ shouldSpace = longestLabelWidth + maximalFontSize + outerRadius * labelDistancePercentage;
- point = {
- x: xAxisPoint.x,
- y: yAxisPoint.y
- };
- }
+ // Calculate the space between pie's border and margin of chart
+ var widthSpace = (width - (outerRadius + borderWidth) * 2) / 2;
+ if (widthSpace < shouldSpace) {
+ outerRadius -= shouldSpace - widthSpace;
+ }
- return { value: value, point: point, data: data, index: index };
- });
- return config;
- });
+ var innerRadius = cutoutPercentage ? outerRadius / 100 * cutoutPercentage : 0,
+ innerRadiusColor = me.config.backgroundColor || "#ffffff";
+ var pointX = x + outerWidth / 2,
+ pointY = y + outerHeight / 2;
- lineConfigs.reduce(function (pre, curr) {
- me.drawLine(curr, pre, lineConfigs);
- return curr;
- }, null);
+ var opt = {
+ box: box,
+ pointX: pointX,
+ pointY: pointY,
+ innerRadius: innerRadius,
+ outerRadius: outerRadius,
+ totalValue: totalValue,
+ borderWidth: borderWidth,
+ rotation: rotation,
+ totalAngle: Math.PI * 2.0
+ };
+ me.drawDoughnut(me.visDatasets, opt);
if (animate) {
me.emit('animate', { animation: me.wxAnimation });
me.wxAnimation.run(true);
me.wxAnimation.on('done', function () {
me.emit('draw', {
- options: lineConfigs
+ options: opt
});
});
} else {
me.emit('draw', {
- options: lineConfigs
+ options: opt
});
}
- // lineConfigs.forEach(line => me._drawLine(line));
+ wxLayout.addBox(me.box);
}
-
- /**
- * Draw the scale of chart
- *
- * @private
- */
-
}, {
- key: '_drawScale',
- value: function _drawScale() {
- var box = void 0,
- me = this,
- wxLayout = me.wxLayout;
+ key: 'drawData',
+ value: function drawData(dataset, options) {
+ var me = this,
+ ctx = me.ctx;
+ var pointX = options.pointX,
+ pointY = options.pointY,
+ startAngle = options.startAngle,
+ endAngle = options.endAngle,
+ outerRadius = options.outerRadius,
+ innerRadius = options.innerRadius,
+ totalValue = options.totalValue,
+ borderWidth = options.borderWidth;
+ var label = dataset.label,
+ value = dataset.value,
+ color = dataset.color,
+ borderColor = dataset.borderColor,
+ percentage = dataset.percentage,
+ display = dataset.display;
- box = wxLayout.adjustBox();
- var xDatasets = me.xScaleAxisDatas(),
- yDatasets = me.yScaleAxisDatas(box);
+ if (!display) {
+ return endAngle;
+ }
- var _me$wxCrossScale$draw = me.wxCrossScale.draw(box, xDatasets, yDatasets),
- xBox = _me$wxCrossScale$draw.xBox,
- yBox = _me$wxCrossScale$draw.yBox;
+ var centerAngle = startAngle + (endAngle - startAngle) / 2;
+ var currentRadius = outerRadius / 100 * percentage;
- wxLayout.addBox(xBox);
- wxLayout.addBox(yBox);
- }
+ ctx.beginPath();
- /**
- *
- * @param {number} n - The total tick
- * @param {number} ln - The space between category x-axis
- * @param {number} sp - If has an gap, total gap space space
- * @param {number} bp - If has an gap, the gap space before the current point
- * @return {number}
- * @private
- */
+ ctx.arc(pointX, pointY, currentRadius, startAngle, endAngle);
+ ctx.arc(pointX, pointY, innerRadius, endAngle, startAngle, true);
- /**
- * Draw a line
- * @param pre
- * @param p
- * @param next
- * @param tension
- * @private
- */
-
- /**
- * Draw a animate line
- * @param pre
- * @param p
- * @param next
- * @param pert
- * @param curt
- * @param tension
- * @return {*}
- * @private
- */
+ ctx.closePath();
+ ctx.strokeStyle = borderColor;
+ ctx.lineWidth = borderWidth || 0;
+ ctx.fillStyle = color;
- /**
- * Return a animate tick func
- * @param lineData
- * @param preData
- * @return {function(*, *, *)|null}
- * @private
- */
+ ctx.fill();
+ ctx.lineJoin = 'bevel';
+ if (borderWidth) {
+ ctx.stroke();
+ }
+ ctx.draw();
+ return endAngle;
+ }
}, {
- key: '_drawLine',
-
- /**
- * Draw one line
- * @param {Object} lineData - Line dataset
- * @param {Object} lineData.legend - Legend's config
- * @param {Object[]} lineData[].value - Data of each line point
- * @param {Object[]} lineData[].data - The data object
- * @param {Object[]} lineData[].point - The point for rending.
- * @param {Object} preData - Previous line dataset
- * @param {Object} total - All datasets
- * @private
- *
- */
- value: function _drawLine(lineData, preData, total) {
- var _this2 = this;
-
+ key: 'drawLabel',
+ value: function drawLabel(dataset, options) {
var me = this,
ctx = me.ctx;
- var legend = lineData.legend,
- dataset = lineData.dataset;
- var display = legend.display,
- spanGaps = legend.spanGaps,
- tension = legend.tension,
- lineWidth = legend.lineWidth,
- lineJoin = legend.lineJoin,
- fillStyle = legend.fillStyle,
- strokeStyle = legend.strokeStyle,
- fillArea = legend.fillArea,
- fillAlpha = legend.fillAlpha;
+ var labelDistancePercentage = me.chartConfig.labelDistancePercentage || 0.2;
+ var pointX = options.pointX,
+ pointY = options.pointY,
+ startAngle = options.startAngle,
+ endAngle = options.endAngle,
+ outerRadius = options.outerRadius,
+ innerRadius = options.innerRadius,
+ totalValue = options.totalValue,
+ borderWidth = options.borderWidth;
+ var label = dataset.label,
+ value = dataset.value,
+ color = dataset.color,
+ borderColor = dataset.borderColor,
+ fontSize = dataset.fontSize,
+ percentage = dataset.percentage,
+ format = dataset.format,
+ showItem = dataset.showItem,
+ display = dataset.display;
- var xAxisY = me.xAxis.getPoint(0).y - me.xAxis.config.lineWidth / 2;
- if (!display) {
+ if (!display || !showItem) {
return;
}
- ctx.save();
-
- ctx.lineWidth = lineWidth;
- ctx.lineJoin = lineJoin;
- ctx.strokeStyle = strokeStyle;
- ctx.fillStyle = fillStyle;
- // Draw fill area
- if (fillArea) {
- (function () {
- ctx.beginPath();
-
- var firstPoint = void 0,
- currPoint = void 0;
- dataset.forEach(function (d, index) {
- var point = d.point;
-
- if (!!currPoint) {
- if (point) {
- _this2._lineToPoint(currPoint, point, me._getNextPoint(dataset, index, spanGaps), tension);
- } else if (!spanGaps) {
- // Not spanGap, close path and fill
- _this2.__fillInHere(firstPoint, currPoint, xAxisY, fillAlpha);
- // First point reset
- firstPoint = undefined;
- } else {
- // SpanGap, not record this point.
- return;
- }
- } else {
- if (point) {
- //ctx.moveTo(point.x, point.y);
- _this2._lineToPoint(currPoint, point, me._getNextPoint(dataset, index, spanGaps), tension);
- firstPoint = point;
- }
- }
- currPoint = point;
- });
- if (currPoint && firstPoint) {
- _this2.__fillInHere(firstPoint, currPoint, xAxisY, tension, fillAlpha);
- }
- })();
- }
-
- ctx.beginPath();
+ var centerAngle = startAngle + (endAngle - startAngle) / 2;
+ var currentRadius = outerRadius / 100 * percentage;
+ label = _helper.is.Function(format) ? format.call(me, label, value, totalValue, currentRadius, dataset, options) : label;
- // Draw line
- var prePoint = void 0,
- pointStack = [];
- dataset.forEach(function (d, index) {
- var value = d.value,
- point = d.point,
- data = d.data;
- var pointBorderColor = data.pointBorderColor,
- pointBorderWidth = data.pointBorderWidth,
- pointRadius = data.pointRadius,
- pointStyle = data.pointStyle,
- label = data.label;
+ // Line start point
+ var startX = Math.cos(centerAngle) * currentRadius + pointX;
+ var startY = Math.sin(centerAngle) * currentRadius + pointY;
- pointStack.push({ point: point, pointBorderColor: pointBorderColor, pointBorderWidth: pointBorderWidth, pointRadius: pointRadius, pointStyle: pointStyle });
+ // Line turn around point
+ var offsetRadius = currentRadius * labelDistancePercentage,
+ turnRadius = currentRadius + offsetRadius;
+ var turnX = Math.cos(centerAngle) * turnRadius + pointX;
+ var turnY = Math.sin(centerAngle) * turnRadius + pointY;
- if (point) {
- _this2._lineToPoint(prePoint, point, me._getNextPoint(dataset, index, spanGaps), tension);
- //!!currPoint ? ctx.lineTo(point.x, point.y): ctx.moveTo(point.x, point.y);
- // !!currPoint ?
- // lineToPoint(currPoint, point, getNextPoint(dataset, index, spanGaps)):
- // ctx.moveTo(point.x, point.y);
- } else if (spanGaps) {
- // SpanGap, not record this point.
- return;
- }
- prePoint = point;
+ // Avoid Collision
+ var adjustPoint = me.avoidCollision({
+ x: turnX,
+ y: turnY
+ }, {
+ x: pointX,
+ y: pointY
});
- ctx.stroke();
-
- // Draw Point
- pointStack.forEach(function (p) {
- var point = p.point,
- pointBorderColor = p.pointBorderColor,
- pointBorderWidth = p.pointBorderWidth,
- pointRadius = p.pointRadius,
- pointStyle = p.pointStyle;
-
- if (!point) {
- return;
- }
-
- ctx.beginPath();
- // TODO: pointStyle NOT IMPLEMENT, Only can render line
- if (pointRadius) {
- ctx.arc(point.x, point.y, pointRadius, 0, 2 * Math.PI);
- ctx.fill();
- }
+ turnX = adjustPoint.x;
+ turnY = adjustPoint.y;
- if (pointBorderWidth) {
- ctx.lineWidth = pointBorderWidth;
- ctx.strokeStyle = pointBorderColor || legend.strokeStyle;
- ctx.stroke();
- }
- });
+ var textLen = ctx.measureText(label).width;
+ var endX = turnX + (turnX - pointX > 0 ? offsetRadius : -offsetRadius),
+ endY = turnY;
+ var textX = turnX - pointX > 0 ? endX + 4 : endX - 4 - textLen,
+ textY = endY + ctx.fontSize / 2;
+ ctx.beginPath();
+ ctx.lineWidth = 1;
+ ctx.strokeStyle = color;
+ ctx.fillStyle = color;
+ ctx.fontSize = fontSize;
+ ctx.moveTo(startX, startY);
+ ctx.lineTo(turnX, turnY);
+ ctx.lineTo(endX, endY);
+ ctx.stroke();
+ ctx.fillText(label, textX, textY);
ctx.draw();
- ctx.restore();
-
- return;
}
+ }, {
+ key: 'drawDoughnut',
/**
- * Draw one line
- * @param {Object} lineData - Line dataset
- * @param {Object} lineData.legend - Legend's config
- * @param {Object[]} lineData[].value - Data of each line point
- * @param {Object[]} lineData[].data - The data object
- * @param {Object[]} lineData[].point - The point for rending.
- * @param {Object} preData - Previous line dataset
- * @param {Object} total - All datasets
- * @private
- *
+ * Draw Doughnut
+ * @param {Object} dateset - Doughnut data
+ * @param {Object} opt - Draw options
*/
-
- }, {
- key: 'drawLine',
- value: function drawLine(lineData, preData, total) {
+ value: function drawDoughnut(dataset, opt) {
var me = this,
animate = me.chartConfig.animate,
animateOpt = me.chartConfig.animateOptions;
if (animate) {
- var actionAnimation = me._getAnimationDrawLine(lineData, preData);
+ var actionAnimation = me._getAnimationDrawDoughnut(dataset, opt);
if (!actionAnimation) {
return;
}
me.wxAnimation.pushActions(actionAnimation);
- me.wxAnimation.pushActions(function (t) {
- if (animateOpt.end === t) {
- me._drawLine(lineData, preData, total);
- }
- });
} else {
- me._drawLine(lineData, preData, total);
+ me._drawDoughnut(dataset, opt);
}
}
- /**
- * Build the yAxis datasets
- * @param {BoxInstance} area - The area of chart
- */
-
}, {
- key: 'yScaleAxisDatas',
- value: function yScaleAxisDatas(area) {
+ key: '_getAnimationDrawDoughnut',
+ value: function _getAnimationDrawDoughnut(dataset, opt) {
var me = this,
- stacked = me.chartConfig.stacked,
- discardNeg = me.chartConfig.discardNeg,
- ctx = me.ctx;
- var yScaleItemOptions = me.chartConfig.yScaleItemOptions;
- var tickLimits = me.yAxis.calculateTickLimit(area, ctx);
+ ctx = me.ctx,
+ animateOpt = me.chartConfig.animateOptions,
+ backgroundColor = me.config.backgroundColor;
+ var box = opt.box,
+ pointX = opt.pointX,
+ pointY = opt.pointY,
+ totalValue = opt.totalValue,
+ rotation = opt.rotation,
+ outerRadius = opt.outerRadius,
+ borderWidth = opt.borderWidth,
+ totalAngle = opt.totalAngle;
- if (stacked) {
- var _me$stackYScaleAxisLi = me.stackYScaleAxisLimit(),
- max = _me$stackYScaleAxisLi.max,
- min = _me$stackYScaleAxisLi.min;
+ var aniTotal = animateOpt.end - animateOpt.start;
- return me.yAxis.buildDatasets(max, min < 0 && discardNeg ? 0 : min, tickLimits, undefined, yScaleItemOptions);
- } else {
- // First, get all available values and calculate the max/min value
- var _visDatasets$reduce = this.visDatasets.reduce(function (pre, cur) {
- var max = pre.max,
- min = pre.min;
+ return function (t, lastt, toNext) {
+ var percent = t / aniTotal;
+ var currTotalAngle = totalAngle * percent;
- if (cur.display) {
- var curValue = me.legends.map(function (legend) {
- if (legend.key) {
- return cur[legend.key] || 0;
- }
- }).concat(max, min);
- max = Math.max.apply(Math, curValue);
- min = Math.min.apply(Math, curValue);
- }
- return { max: max, min: min };
- }, {
- max: 0,
- min: 0
- }),
- _max = _visDatasets$reduce.max,
- _min = _visDatasets$reduce.min;
+ // Clear
+ ctx.save();
+ ctx.beginPath();
- return me.yAxis.buildDatasets(_max, _min, tickLimits, undefined, yScaleItemOptions);
- }
- }
+ var bdWidth = borderWidth || 0;
+ if (backgroundColor) {
+ ctx.fillStyle = backgroundColor;
+ ctx.strokeStyle = backgroundColor;
+ ctx.fillRect(box.x, box.y, box.outerWidth, box.outerHeight);
+ } else {
+ ctx.clearRect(box.x, box.y, box.outerWidth, box.outerHeight);
+ }
- /**
- * Build the xAxis datasets
- */
+ // ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);
+ // ctx.fill();
+ // if (borderWidth) {
+ // ctx.beginPath();
+ // ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);
+ // ctx.lineJoin = 'bevel';
+ // ctx.lineWidth = borderWidth;
+ // ctx.stroke();
+ // }
+ ctx.draw();
+ if (animateOpt.end === t) {
+ me._drawDoughnut(dataset, opt);
+ } else {
+ (function () {
+ var drawAngle = rotation;
+ dataset.forEach(function (data) {
+ var startAngle = drawAngle,
+ endAngle = startAngle + currTotalAngle * (data.value / totalValue);
+ var o = (0, _helper.extend)({ startAngle: startAngle, endAngle: endAngle }, opt);
+ me.drawData(data, o);
+ drawAngle = endAngle;
+ });
+ })();
+ }
+ ctx.restore();
+ return t;
+ };
+ }
}, {
- key: 'xScaleAxisDatas',
- value: function xScaleAxisDatas() {
+ key: '_drawDoughnut',
+ value: function _drawDoughnut(dataset, opt) {
var me = this;
- var xScaleItemOptions = me.chartConfig.xScaleItemOptions;
- var xScaleConfig = me.labels.map(function (label) {
- var item = {
- 'text': label
- };
- if (typeof xScaleItemOptions !== 'undefined') {
- item = (0, _helper.extend)(item, xScaleItemOptions);
- }
- return item;
+ var totalValue = opt.totalValue,
+ rotation = opt.rotation,
+ totalAngle = opt.totalAngle;
+
+ var drawAngle = rotation;
+ me.initAvoidCollision();
+ dataset.forEach(function (data) {
+ var startAngle = drawAngle,
+ endAngle = startAngle + totalAngle * (data.value / totalValue);
+ var o = (0, _helper.extend)({ startAngle: startAngle, endAngle: endAngle }, opt);
+ me.drawData(data, o);
+ me.drawLabel(data, o);
+ drawAngle = endAngle;
});
+ }
- return me.xAxis.buildDatasets(xScaleConfig);
+ // Get longest label
+
+ }, {
+ key: '_longestLabel',
+ value: function _longestLabel(totalValue) {
+ var me = this,
+ visDatasets = me.visDatasets,
+ ctx = me.ctx;
+ var maxLabelWidth = 0;
+ visDatasets.forEach(function (dataset) {
+ var label = dataset.label,
+ value = dataset.value,
+ format = dataset.format;
+
+ label = _helper.is.Function(format) ? format.call(me, label, value, totalValue, 0, dataset) : label;
+ var textLen = ctx.measureText(label).width;
+
+ maxLabelWidth = textLen > maxLabelWidth ? textLen : maxLabelWidth;
+ });
+ return maxLabelWidth;
}
+ // Get maximal font size of label
+
}, {
- key: 'labels',
- get: function get() {
+ key: '_maximalLabelFontSize',
+ value: function _maximalLabelFontSize() {
var me = this,
- tmp = void 0;
- if (me._labels) {
- return me._labels;
- } else if (tmp = me.chartConfig.labels) {
- if (_helper.is.Array(tmp)) {
- return tmp;
- }
- }
- me._labels = me.visDatasets.map(function (dataset) {
- return dataset.label;
+ visDatasets = me.visDatasets;
+ var max = 0;
+ visDatasets.forEach(function (dataset) {
+ var fontSize = dataset.fontSize;
+
+ max = fontSize > max ? fontSize : max;
});
- return me._labels;
+ return max;
}
+ // Avoid Collision
+
}, {
- key: 'legends',
- get: function get() {
- var me = this;
- if (!me._legends) {
- me._legends = me._getLegendConfig();
+ key: 'initAvoidCollision',
+ value: function initAvoidCollision() {
+ this._lastPoint = null;
+ }
+ }, {
+ key: 'avoidCollision',
+ value: function avoidCollision(newPoint, centerPoint) {
+ var avoidUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.ctx.fontSize + 4;
+
+ var me = this,
+ box = me.box;
+ var cpx = centerPoint.x,
+ cpy = centerPoint.y;
+ if (me._lastPoint) {
+ var lpx = me._lastPoint.x,
+ lpy = me._lastPoint.y;
+ var npx = newPoint.x,
+ npy = newPoint.y;
+ if ((npx - cpx) * (lpx - cpx) > 0 && Math.abs(lpy - npy) < avoidUnit) {
+ var ny = npx - cpx > 0 ? lpy + avoidUnit : lpy - avoidUnit;
+ newPoint.y = ny;
+ }
}
- return me._legends;
- },
- set: function set(value) {
- this._legends = value;
+ this._lastPoint = newPoint;
+ return newPoint;
}
}]);
- return WxLiner;
+ return WxDoughnut;
}(_wxChart2.default);
- var _initialiseProps = function _initialiseProps() {
- var _this3 = this;
-
- this._animateLineTick = function (n, ln) {
- var sp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
- var bp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
+ exports.default = WxDoughnut;
+ }, { "../core/animation": 15, "../core/layout": 17, "../core/legend": 18, "../core/title": 20, "../util/helper": 25, "../util/randomColor": 27, "../util/wxCanvas": 29, "./wxChart": 14 }], 13: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
+ 'use strict';
- return sp ? (n % ln + bp * ln) / (ln * sp) : 0;
- };
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
- this._getCurr = function (dataset, index) {
- if (index > dataset.length - 1) {
- return;
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
- return dataset[index];
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
+ }();
- this._getNext = function (dataset, index, spanGaps) {
- // The end
- if (index >= dataset.length - 1) {
- return;
- }
- var nextDate = dataset[index + 1];
- if (!nextDate.point) {
- if (!!spanGaps) return _this3._getNext(dataset, index + 1, spanGaps);else return;
+ var _get = function get(object, property, receiver) {
+ if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {
+ var parent = Object.getPrototypeOf(object);if (parent === null) {
+ return undefined;
+ } else {
+ return get(parent, property, receiver);
}
- return nextDate;
- };
+ } else if ("value" in desc) {
+ return desc.value;
+ } else {
+ var getter = desc.get;if (getter === undefined) {
+ return undefined;
+ }return getter.call(receiver);
+ }
+ };
- this._getNextPoint = function (dataset, index, spanGaps) {
- var next = _this3._getNext(dataset, index, spanGaps);
- return next ? next.point : null;
- };
+ var _es6Mixins = require('es6-mixins');
- this._getPre = function (dataset, index, spanGaps) {
- if (index <= 0) {
- return;
- }
- var preDate = dataset[index - 1];
- if (!preDate.point) {
- if (!!spanGaps) return _this3._getPre(dataset, index - 1, spanGaps);else return;
- }
- return preDate;
- };
+ var _es6Mixins2 = _interopRequireDefault(_es6Mixins);
- this._getPrePoint = function (dataset, index, spanGaps) {
- var pre = _this3._getPre(dataset, index, spanGaps);
- return pre ? pre.point : null;
- };
+ var _helper = require('../util/helper');
- this._lineToPoint = function (pre, p, next, tension) {
- var ctx = _this3.ctx;
- if (!tension || tension === 0) {
- ctx.lineTo(p.x, p.y);
- } else {
- var controlPoints = (0, _helper.splineCurve)(pre, p, next, tension);
- if (!pre) {
- ctx.moveTo(p.x, p.y);
- } else {
- ctx.bezierCurveTo(pre.controlPoints.next.x, pre.controlPoints.next.y, controlPoints.previous.x, controlPoints.previous.y, p.x, p.y);
- }
- p.controlPoints = controlPoints;
- }
- };
+ var _randomColor = require('../util/randomColor');
- this._animateLineToPoint = function (pre, p, next, pert, curt, tension) {
- var ctx = _this3.ctx;
- if (!tension || tension === 0) {
- var x1 = pre.x,
- x2 = p.x,
- y1 = pre.y,
- y2 = p.y;
- var totalPath = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)),
- cosAngle = (x2 - x1) / totalPath,
- sinAngle = (y2 - y1) / totalPath;
- var pointX = x1 + cosAngle * curt,
- pointY = y1 + sinAngle * curt;
- ctx.moveTo(x1, y1);
- ctx.lineTo(pointX, pointY);
- return {
- startPoint: pre,
- endPoint: { x: pointX, y: pointY }
- };
- } else {
- var p0 = void 0,
- p1 = void 0,
- p2 = void 0,
- p3 = void 0,
- controlPoints = (0, _helper.splineCurve)(pre, p, next, tension);
+ var _randomColor2 = _interopRequireDefault(_randomColor);
- if (pre && p) {
- var bz = new Bezier({ x: pre.x, y: pre.y }, { x: pre.controlPoints.next.x, y: pre.controlPoints.next.y }, { x: controlPoints.previous.x, y: controlPoints.previous.y }, { x: p.x, y: p.y });
- var sbz = bz.split(pert || 0, curt);
-
- p0 = sbz.point(0);p1 = sbz.point(1);p2 = sbz.point(2);p3 = sbz.point(3);
-
- ctx.moveTo(Math.round(p0.x), p0.y);
- ctx.bezierCurveTo(p1.x, p1.y, p2.x, p2.y, Math.round(p3.x), p3.y);
- }
- p.controlPoints = controlPoints;
- return {
- startPoint: p0 ? {
- x: Math.round(p0.x),
- y: p0.y
- } : null,
- endPoint: p3 ? {
- x: Math.round(p3.x),
- y: p3.y
- } : null
- };
- }
- };
-
- this.__fillInHere = function (firstPoint, currPoint, xAxisY, fillAlpha) {
- var ctx = _this3.ctx;
- ctx.lineTo(currPoint.x, xAxisY);
- ctx.lineTo(firstPoint.x, xAxisY);
-
- ctx.globalAlpha = fillAlpha;
- ctx.fill();
- ctx.globalAlpha = 1;
- };
-
- this._getAnimationDrawLine = function (lineData, preData) {
- var me = _this3,
- animate = me.chartConfig.animate,
- animateOpt = me.chartConfig.animateOptions,
- ctx = me.ctx;
-
- var legend = lineData.legend,
- dataset = lineData.dataset;
- var display = legend.display,
- spanGaps = legend.spanGaps,
- tension = legend.tension,
- lineWidth = legend.lineWidth,
- lineJoin = legend.lineJoin,
- fillStyle = legend.fillStyle,
- strokeStyle = legend.strokeStyle,
- fillArea = legend.fillArea,
- fillAlpha = legend.fillAlpha;
-
- // Animation dynamic options
-
- var dataLen = dataset.length,
- categoryTicks = (animateOpt.end - animateOpt.start) / (dataLen - 1);
-
- if (!display) {
- return;
- }
-
- return function (t, lastt, toNext) {
- ctx.save();
- ctx.lineWidth = lineWidth;
- ctx.lineJoin = lineJoin;
- ctx.strokeStyle = strokeStyle;
- ctx.fillStyle = fillStyle;
-
- var dataIndex = !lastt ? 0 // first point
- : Math.floor(t / categoryTicks) + 1;
- var point = void 0,
- drawCurrPoint = void 0,
- index = void 0,
- data = void 0,
- pret = lastt ? lastt.t : 0,
- curt = 0,
- curr = me._getCurr(dataset, dataIndex),
- next = me._getNext(dataset, dataIndex, spanGaps),
- pre = me._getPre(dataset, dataIndex, spanGaps),
- ppPoint = void 0,
- diffIndex = lastt ? dataIndex - lastt.index : 0;
-
- if (curr) {
- drawCurrPoint = curr.point;
- point = curr.point;
- index = curr.index;
- data = curr.data;
- curt = me._animateLineTick(t, categoryTicks, index - (pre ? pre.index : 0), dataIndex - (pre ? pre.index : 0) - 1);
- }
+ var _wxCanvas = require('../util/wxCanvas');
- if (pre) {
- ppPoint = me._getPrePoint(dataset, pre.index, spanGaps);
- }
+ var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
- if (!drawCurrPoint && next) {
- drawCurrPoint = next.point;
- index = next.index;
- next = me._getNext(dataset, next.index, spanGaps);
- }
+ var _wxChart = require('./wxChart');
- if (diffIndex == 1) {
- // Draw line
- if (pre && pre.point) {
- ctx.beginPath();
- me._animateLineToPoint(ppPoint, pre.point, drawCurrPoint, pret, 1, tension);
- ctx.stroke();
- }
+ var _wxChart2 = _interopRequireDefault(_wxChart);
- pret = 0;
- }
+ var _title = require('../core/title');
- if (!point && spanGaps || point) {
- // this tick path close
- // Draw line
+ var _title2 = _interopRequireDefault(_title);
- if (drawCurrPoint) {
- ctx.beginPath();
- me._animateLineToPoint(pre ? pre.point : null, drawCurrPoint, next ? next.point : null, pret, curt, tension);
- ctx.stroke();
- }
- }
+ var _scale = require('../core/scale');
- if (pret == 0 && pre && pre.point) {
- var _pre$data = pre.data,
- pointBorderColor = _pre$data.pointBorderColor,
- pointBorderWidth = _pre$data.pointBorderWidth,
- pointRadius = _pre$data.pointRadius,
- pointStyle = _pre$data.pointStyle,
- label = _pre$data.label;
- // TODO: pointStyle NOT IMPLEMENT, Only can render line
-
- if (pointRadius) {
- ctx.beginPath();
- ctx.arc(pre.point.x, pre.point.y, pointRadius, 0, 2 * Math.PI);
- ctx.fill();
- }
+ var _scale2 = _interopRequireDefault(_scale);
- if (pointBorderWidth) {
- ctx.beginPath();
- ctx.arc(pre.point.x, pre.point.y, pointRadius, 0, 2 * Math.PI);
- ctx.lineWidth = pointBorderWidth;
- ctx.strokeStyle = pointBorderColor || legend.strokeStyle;
- ctx.stroke();
- }
- }
+ var _scale3 = require('../scale/scale.liner');
- ctx.draw();
- ctx.restore();
+ var _scale4 = _interopRequireDefault(_scale3);
- return {
- point: point,
- t: curt,
- index: dataIndex,
- diffIndex: diffIndex
- };
- };
- };
- };
+ var _scale5 = require('../scale/scale.crosshelp');
- exports.default = WxLiner;
- }, { "../core/animation": 14, "../core/layout": 16, "../core/legend": 17, "../core/scale": 18, "../core/title": 19, "../scale/scale.category": 20, "../scale/scale.crosshelp": 21, "../scale/scale.liner": 22, "../scale/scale.stackhelp": 23, "../util/helper": 24, "../util/randomColor": 26, "../util/wxCanvas": 29, "./wxChart": 13, "bezier-js": 1, "es6-mixins": 5 }], 13: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
+ var _scale6 = _interopRequireDefault(_scale5);
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ var _scale7 = require('../scale/scale.stackhelp');
- var _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
- }
- }return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
- };
- }();
+ var _scale8 = _interopRequireDefault(_scale7);
- exports.getChartInstances = getChartInstances;
+ var _scale9 = require('../scale/scale.category');
- var _helper = require('../util/helper');
+ var _scale10 = _interopRequireDefault(_scale9);
- var _wxCanvas = require('../util/wxCanvas');
+ var _legend = require('../core/legend');
- var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
+ var _legend2 = _interopRequireDefault(_legend);
var _layout = require('../core/layout');
- var _mitt = require('mitt');
-
- var _mitt2 = _interopRequireDefault(_mitt);
+ var _layout2 = _interopRequireDefault(_layout);
- var _es6Mixins = require('es6-mixins');
+ var _animation = require('../core/animation');
- var _es6Mixins2 = _interopRequireDefault(_es6Mixins);
+ var _animation2 = _interopRequireDefault(_animation);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
@@ -4894,787 +5164,944 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}
}
- // Chart default config
- var wxChartDefaultConfig = {
- fontSize: 10,
- width: 300,
- height: 200,
- display: 'block',
- padding: 0,
- backgroundColor: null
- };
+ function _possibleConstructorReturn(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && ((typeof call === "undefined" ? "undefined" : _typeof2(call)) === "object" || typeof call === "function") ? call : self;
+ }
- // Store all references of 'WxChart' instances - allowing us to globally resize chart instances on window resize.
- var wxChartInstances = {};
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof2(superClass)));
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
+ }
- function getChartInstances(id) {
- if (id && id in wxChartInstances) {
- return wxChartInstances[id];
- }
- return null;
- };
+ var Bezier = require('bezier-js');
+ var tinycolor = require("tinycolor2");
- // The basic class of WeiXin chart
+ // Line legend's default config
+ var WX_LINE_LEGEND_DEFAULT_CONFIG = {
+ lineWidth: 1,
+ // 'capStyle': 'butt', //Default line cap is cap,
+ lineJoin: 'miter',
+ fillArea: false,
+ fillAlpha: 0.5,
+ display: true,
+ spanGaps: false, // If set true, will draw line between the null point
+ tension: 0.4 // Default bezier curve tension. Set to 0 for no bezier curves.
+ };
+ // Line default config
+ var WX_LINER_DEFAULT_CONFIG = {
+ // Scale options
+ xScaleOptions: {
+ position: 'bottom'
+ },
+ xScaleItemOptions: undefined,
+ yScaleOptions: {
+ position: 'left'
+ },
+ yScaleItemOptions: undefined,
+ crossScaleOptions: {},
+ // The title text or a title config object
+ title: undefined,
- var WxChart = function () {
- /**
- * @constructor
- * @param {string} id - Canvas id ,DOM ID or HTMLElement
- * @param {Object|number} [config] - The config of Canvas or the width of chart.
- * @param {number} [config.width] - The width of canvas.
- * @param {number} [config.height] - The height of canvas.
- * @param {number} [config.padding] - The padding of canvas.
- * @param {string} [config.display] - The display style of chart.
- */
- function WxChart(id, config) {
- _classCallCheck(this, WxChart);
+ stacked: false, // If true, line are stacked on the x-axis
+ discardNeg: false,
- var me = this;
+ // The legend of line chart
+ legends: [], // lineWidth, lineJoin, fillStyle, strokeStyle, fillArea can be set in here
+ legendOptions: {
+ 'position': 'bottom'
+ },
- // Event emitter
- (0, _es6Mixins2.default)([(0, _mitt2.default)()], this, {
- // Mixins will create a new method to nested call all duplicate method
- mergeDuplicates: false
- });
+ // Point global options
+ point: {},
- // Arguments parse...
- var chartConf = void 0;
- if (_helper.is.PureObject(config)) {
- chartConf = (0, _helper.extend)({}, wxChartDefaultConfig, config);
- } else if (_helper.is.Number(config) || _helper.is.String(config)) {
- // WxChart(id, width, height, display, ...options)
- chartConf = {
- 'width': arguments[1],
- 'height': 2 in arguments ? arguments[2] : wxChartDefaultConfig.height,
- 'display': 3 in arguments ? arguments[3] : wxChartDefaultConfig.display
- };
- if (4 in arguments && _helper.is.PureObject(arguments[4])) {
- (0, _helper.extend)({}, wxChartDefaultConfig, chartConf, arguments[4]);
- } else {
- (0, _helper.extend)({}, wxChartDefaultConfig, chartConf);
- }
- }
+ // The randomColor scheme
+ // See https://github.com/davidmerfield/randomColor
+ color: {
+ hue: 'red',
+ luminosity: 'light'
+ },
- me.canvas = new _wxCanvas2.default(id, chartConf);
- me.ctx = me.canvas.getContext('2d');
- me.isWeiXinAPP = (0, _helper.checkWX)();
- me._id = (0, _helper.uid)();
+ // The dataset's default key
+ defaultKey: 'value',
- me.emit('initCanvas', {
- canvas: me.canvas,
- ctx: me.ctx,
- id: me.id + ''
- });
+ // Animation
+ animate: true,
+ animateOptions: {
+ start: 1,
+ end: 1001,
+ duration: 1000
+ }
+ };
- me._config = me.initConfig(chartConf);
- me.initContext();
+ var WX_LINER_ITEM_DEFAULT_CONFIG = {
+ showItem: true,
+ // format: // title format function
+ pointRadius: 2,
+ pointStyle: 'circle', // Support triangle, rect and Image object
+ pointBorderWidth: 1,
+ pointBorderColor: '#ffffff',
+ display: true
+ };
- // Append to wxChartInstances
- wxChartInstances[me.id + ''] = me;
+ var WxLiner = function (_WxChart) {
+ _inherits(WxLiner, _WxChart);
- return me;
- }
+ /**
+ * WxLiner chart
+ * @constructor
+ * @param {string} id - The canvas element's id
+ * @param {Object} config
+ * @param {number} [config.width=300] - The width of canvas.
+ * @param {number} [config.height=200] - The height of canvas.
+ * @param {number} [config.padding=] - The padding of canvas.
+ * @param {string} [config.display=block] - The display style of chart.
+ *
+ * @param {Object} config.legendOptions=[] - The legend & label options.You should set 'key' to bind the attribute in datasets which is the value of the point.
+ * @param {(string|Object)} [config.title=] - The title text or title options of chart.
+ * @example
+ * datasets:[{
+ * valueA: 30,
+ * valueB: 40,
+ * label: '一月'
+ * }, {
+ * valueA: 20,
+ * valueB: 50,
+ * pointRadius: 2,
+ * label: '二月'
+ * },...]
+ *
+ * legends: [{
+ * 'text': 'valueA Text',
+ * 'key': 'valueA',
+ * 'strokeStyle': '#3385ff'
+ * }, {
+ * text: 'valueB Text',
+ * key: 'valueB'
+ * }]
+ */
+ function WxLiner(id, config) {
+ _classCallCheck(this, WxLiner);
- _createClass(WxChart, [{
- key: 'initConfig',
- value: function initConfig(config) {
- var me = this;
- if (!me.canvas) {
- console.error("Failed to create WxChart: can't acquire context!");
- }
+ var _this = _possibleConstructorReturn(this, (WxLiner.__proto__ || Object.getPrototypeOf(WxLiner)).call(this, id, config));
- var canvas = me.canvas,
- cvWidth = canvas.width,
- cvHeight = canvas.height;
- config.width = cvWidth;
- config.height = cvHeight;
- config.aspectRatio = config.aspectRatio ? config.aspectRatio : !_helper.is.Undefined(cvHeight) && !_helper.is.Undefined(cvWidth) ? (cvWidth / cvWidth).toFixed(2) : null;
- config.display = config.display || 'block';
- return config;
- }
- }, {
- key: 'initContext',
- value: function initContext() {
- var me = this;
- if (!me.canvas) {
- console.error("Failed to create WxChart: can't acquire context!");
- return me;
- }
- // Set scale of canvas
- (0, _helper.retinaScale)(me.ctx, me.canvas.width, me.canvas.height);
+ _initialiseProps.call(_this);
- // Set font size
- if (me.config.fontSize) {
- me.ctx.fontSize = me.config.fontSize;
- }
+ (0, _es6Mixins2.default)([_scale8.default], _this, {
+ // Mixins will create a new method to nested call all duplicate method
+ mergeDuplicates: false
+ });
- // calculate box
- var padding = me.config.padding || 0;
- me.innerBox = new _layout.BoxInstance('top', 0, 0, me.config.width - padding * 2, me.config.height - padding * 2, me.config.width, me.config.height);
- }
- }, {
- key: 'clear',
- value: function clear() {
- var me = this;
- me.ctx.clearRect(0, 0, me.canvas.width, me.canvas.height);
- if (me.config.backgroundColor) {
- me.ctx.save();
- me.ctx.fillStyle = me.config.backgroundColor;
- me.ctx.fillRect(0, 0, me.canvas.width, me.canvas.height);
- me.ctx.restore();
- me.ctx.draw();
- }
+ var me = _this;
+ me.chartConfig = (0, _helper.extend)({}, WX_LINER_DEFAULT_CONFIG, config);
- me.emit('clear', {
- canvas: me.canvas
- });
+ me.title = null;
+ // Initialize title and legend
+ if (me.chartConfig.title) {
+ me.title = new _title2.default(me, _helper.is.PureObject(me.chartConfig.title) ? me.chartConfig.title : null);
+ me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;
}
- }, {
- key: 'destroy',
- value: function destroy() {
- var me = this;
- me.clear();
- me.canvas.releaseContext();
+ // Initialize legend
+ me.legend = new _legend2.default(me, me.chartConfig.legendOptions);
- if (me.id && me.id in wxChartInstances) {
- delete wxChartInstances[me.id];
- }
+ // Initialize x,y Scale
+ me.yAxis = new _scale4.default(me, me.chartConfig.yScaleOptions);
+ me.xAxis = new _scale10.default(me, me.chartConfig.xScaleOptions);
+ me.wxCrossScale = new _scale6.default(me.xAxis, me.yAxis, me.chartConfig.crossScaleOptions);
+ me.wxLayout = new _layout2.default(me);
- //me.id = null;
- me.canvas = null;
- me.ctx = null;
- me._config = null;
- me.innerBox = null;
+ // Initialize wxAnimation
+ if (me.chartConfig.animate) me.wxAnimation = new _animation2.default(me.chartConfig.animateOptions);
- me.emit('destroy');
- }
- }, {
- key: 'draw',
- value: function draw() {
- // Do nothing...
- }
- }, {
- key: 'update',
- value: function update(datasets, defaultItemOpt) {
- var me = this;
- if (_helper.is.Undefined(datasets)) {
- return;
- }
- if (!_helper.is.Array(datasets)) {
- datasets = [datasets];
- }
+ me.emit('init', {
+ options: me.chartConfig
+ });
+ return _this;
+ }
- datasets = datasets.map(function (dataset) {
- return (0, _helper.extend)({}, defaultItemOpt, dataset);
- });
+ // Get/Set labels
- me.emit('update', { datasets: datasets });
- // Fill default Options
- me.clear();
- me._datasets = datasets;
- me._visDatasets = null;
- return me._datasets;
- }
- }, {
- key: 'calculateTotal',
- value: function calculateTotal() {
- var datasets = this.datasets;
- var total = 0;
- var value = void 0;
- datasets.forEach(function (dataset, index) {
- value = parseFloat(dataset.value);
- if (!_helper.is.NaN(value) && !dataset.hidden) {
- total += Math.abs(value);
- }
- });
+ _createClass(WxLiner, [{
+ key: '_getLegendConfig',
- return total;
- }
- }, {
- key: 'id',
- get: function get() {
- return this._id;
- }
-
- // The 'config' property
-
- }, {
- key: 'config',
- get: function get() {
- if (!this._config) {
- this._config = (0, _helper.extend)({}, wxChartDefaultConfig);
- }
- return this._config;
- },
- set: function set(chartConf) {
- var me = this;
- // Update chart config
- me.initConfig(chartConf);
- me.initContext();
- // Clear canvas
- me.clear();
- // Call redraw
- me.draw();
- }
- }, {
- key: 'datasets',
- get: function get() {
- return this._datasets;
- },
- set: function set(datasets) {
- return this.update(datasets);
+ /**
+ * Build legends config
+ * @private
+ */
+ value: function _getLegendConfig() {
+ var me = this,
+ defaultKey = me.chartConfig.defaultKey || 'value',
+ legendsConfig = me.chartConfig.legends;
+ if (!legendsConfig) {
+ if (me.labels && me.labels.length) {
+ legendsConfig = me.labels.map(function (label) {
+ return { 'text': label, 'key': defaultKey };
+ });
+ } else {
+ throw new Error('Can not get legend config!');
+ }
+ } else {
+ legendsConfig = legendsConfig.map(function (legend) {
+ return (0, _helper.extend)(true, {
+ 'key': defaultKey
+ }, legend);
+ });
+ }
+ return legendsConfig;
}
/**
- * Get visible ticks
+ * Update a datesets of chart and reDraw
+ * @param {Object} datasets - data sets
+ * @param {string} [datasets[].display] - Disaply the bar or not
+ * @param {number} [datasets[].fillStyle] - Point fill color. The default color will randomly assigned by 'color' option.
+ * @param {string} [datasets[].strokeStyle='#ffffff'] - Point's border color
+ * @param {string} [datasets[].pointStyle='circle'] - Point style, support triangle, rect and Image object
+ * @param {number} [datasets[].pointRadius=3] - Point radius if style is circle
+ * @param {number} [datasets[].pointBorderWidth=1.5] - Point border width
+ * @param {string} [datasets[].pointBorderColor='auto'] - Point border color. If not set, will same as lineColor(luminosity+50%)
+ * @param {number} [datasets[].display=true] - display the point or not
+ * @returns {*}
*/
}, {
- key: 'visDatasets',
- get: function get() {
- return this._visDatasets ? this._visDatasets : this._visDatasets = this.datasets.filter(function (v) {
- return !!v.display;
- });
+ key: 'update',
+ value: function update(datasets) {
+ var me = this;
+ me._labels = null;
+ me._legends = null;
+ _get(WxLiner.prototype.__proto__ || Object.getPrototypeOf(WxLiner.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_LINER_ITEM_DEFAULT_CONFIG, me.chartConfig.point));
+ me.wxLayout.removeAllBox();
+ if (me.wxAnimation) me.wxAnimation.reset();
+ return me.draw();
}
- // Can not reset
- , set: function set(val) {}
- }]);
-
- return WxChart;
- }();
+ /**
+ * Draw chart
+ */
- exports.default = WxChart;
- }, { "../core/layout": 16, "../util/helper": 24, "../util/wxCanvas": 29, "es6-mixins": 5, "mitt": 7 }], 14: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
+ }, {
+ key: 'draw',
+ value: function draw() {
+ var box = void 0,
+ me = this,
+ animate = me.chartConfig.animate,
+ stacked = me.chartConfig.stacked,
+ discardNeg = me.chartConfig.discardNeg,
+ wxLayout = me.wxLayout;
+ var _me$chartConfig = me.chartConfig,
+ cutoutPercentage = _me$chartConfig.cutoutPercentage,
+ rotation = _me$chartConfig.rotation,
+ color = _me$chartConfig.color,
+ borderWidth = _me$chartConfig.borderWidth,
+ padding = _me$chartConfig.padding;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ me.emit('beforeDraw', {
+ options: me.chartConfig
+ });
- var _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
- }
- }return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
- };
- }();
+ // First, we draw title
+ box = wxLayout.adjustBox();
+ if (me.title) {
+ me.title.update(me.titleText, box);
+ wxLayout.addBox(me.title.box);
+ }
- exports.wxAnimationActLinker = wxAnimationActLinker;
+ // Second, random color and get legend datasets
+ box = wxLayout.adjustBox();
+ var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.legends.length }));
- var _tweezer = require('../util/tweezer');
+ me.legends = me.legends.map(function (legend, index) {
+ if (!legend.strokeStyle) {
+ legend.strokeStyle = me.chartConfig.backgroundColor || legend.borderColor || rColors[index];
+ }
- var _tweezer2 = _interopRequireDefault(_tweezer);
+ return (0, _helper.extend)(true, {
+ fillStyle: rColors[index]
+ }, WX_LINE_LEGEND_DEFAULT_CONFIG, legend);
+ });
+ me.legend.update(me.legends, box);
+ wxLayout.addBox(me.legend.box);
- var _ez = require('ez.js');
+ // Thirdly, draw scale
+ me._drawScale(wxLayout);
- var ez = _interopRequireWildcard(_ez);
+ box = wxLayout.adjustBox();
+ // Finally, draw line
+ var lineConfigs = me.legends.map(function (legend, legendIndex) {
+ var config = {
+ box: box,
+ legend: legend
+ };
+ var key = legend.key;
+ // config.dataset = me.visDatasets.map(data => {return {value: data[key], data: data}});
+ config.dataset = me.visDatasets.map(function (data, index) {
+ var value = data[key],
+ point = void 0;
- var _helper = require('../util/helper');
+ if (value) {
+ var yAxisPoint = void 0,
+ xAxisPoint = me.xAxis.getPoint(index);
+ if (stacked) {
+ if (discardNeg) {
+ var _me$_getStackValue = me._getStackValue(index, legendIndex),
+ sumPos = _me$_getStackValue.sumPos;
- var _mitt = require('mitt');
+ yAxisPoint = value < 0 ? me.yAxis.getPoint(sumPos) : me.yAxis.getPoint(sumPos + value);
+ } else {
+ yAxisPoint = me._getStackPoint(index, legendIndex);
+ }
+ } else {
+ yAxisPoint = me.yAxis.getPoint(value);
+ }
- var _mitt2 = _interopRequireDefault(_mitt);
+ point = {
+ x: xAxisPoint.x,
+ y: yAxisPoint.y
+ };
+ }
- var _es6Mixins = require('es6-mixins');
+ return { value: value, point: point, data: data, index: index };
+ });
+ return config;
+ });
- var _es6Mixins2 = _interopRequireDefault(_es6Mixins);
+ lineConfigs.reduce(function (pre, curr) {
+ me.drawLine(curr, pre);
+ return curr;
+ }, null);
- function _interopRequireWildcard(obj) {
- if (obj && obj.__esModule) {
- return obj;
- } else {
- var newObj = {};if (obj != null) {
- for (var key in obj) {
- if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
+ if (animate) {
+ me.emit('animate', { animation: me.wxAnimation });
+ me.wxAnimation.run(true);
+ me.wxAnimation.on('done', function () {
+ me.emit('draw', {
+ options: lineConfigs
+ });
+ });
+ } else {
+ me.emit('draw', {
+ options: lineConfigs
+ });
}
- }newObj.default = obj;return newObj;
- }
- }
+ // lineConfigs.forEach(line => me._drawLine(line));
+ }
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : { default: obj };
- }
+ /**
+ * /**
+ * Draw the scale of chart
+ *
+ * @param wxLayout
+ * @private
+ */
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
+ }, {
+ key: '_drawScale',
+ value: function _drawScale(wxLayout) {
+ var box = void 0,
+ me = this;
- function wxAnimationActLinker() {
- var actions = [],
- globals = {};
- return function (action) {
- var _arguments = arguments;
+ box = wxLayout.adjustBox();
+ var xDatasets = me.xScaleAxisDatas(),
+ yDatasets = me.yScaleAxisDatas(box);
- for (var _len = arguments.length, options = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- options[_key - 1] = arguments[_key];
- }
+ var _me$wxCrossScale$draw = me.wxCrossScale.draw(box, xDatasets, yDatasets),
+ xBox = _me$wxCrossScale$draw.xBox,
+ yBox = _me$wxCrossScale$draw.yBox;
- var me = this;
- if (me instanceof WxAnimation) {
- // Run all actions in WxAnimation call
- var ret = void 0;
- actions.forEach(function (action) {
- ret = action.apply(me, _arguments);
- });
- return ret;
- } else {
- // Just push action
- actions.push(action);
- return actions;
+ wxLayout.addBox(xBox);
+ wxLayout.addBox(yBox);
}
- };
- }
-
- var WxAnimation = function () {
-
- /**
- * WxAnimation initial
- *
- * @param {Object} options - Animation options
- * @param {number} options.start - The start value
- * @param {number} options.end - The end value
- * @param {Object} [options.duration=1000] - The total seconds of animation
- * @param {Object} [options.easeType=easeInOut] - Easing type, please see [ez.js](https://github.com/jaxgeller/ez.js/blob/master/ez.js) for more information
- * @constructor
- */
-
- // The error in actions
+ /**
+ *
+ * @param {number} n - The total tick
+ * @param {number} ln - The space between category x-axis
+ * @param {number} sp - If has an gap, total gap space space
+ * @param {number} bp - If has an gap, the gap space before the current point
+ * @return {number}
+ * @private
+ */
- // The animate has started or not
-
- // Tweenzer instance
- function WxAnimation(options) {
- var _this = this;
+ /**
+ * Draw a line
+ * @param pre
+ * @param p
+ * @param next
+ * @param tension
+ * @private
+ */
- _classCallCheck(this, WxAnimation);
+ /**
+ * Draw a animate line
+ * @param pre
+ * @param p
+ * @param next
+ * @param pert
+ * @param curt
+ * @param tension
+ * @return {*}
+ * @private
+ */
- this.currentActionIndex = 0;
+ /**
+ * Return a animate tick func
+ * @param lineData
+ * @param preData
+ * @return {function(*, *, *)|null}
+ * @private
+ */
- this.handOverAction = function () {
- _this.currentActionIndex++;
- };
+ }, {
+ key: '_drawLine',
- this.stop = function () {
- _this.currentActionIndex = 0;
- _this.tweenzerHandler.stop();
- _this.started = false;
- _this.emit('stop');
- };
+ /**
+ * Draw one line
+ * @param {Object} lineData - Line dataset
+ * @param {Object} lineData.box - Draw box config
+ * @param {Object} lineData.legend - Legend's config
+ * @param {Object[]} lineData.dataset[].value - Data of each line point
+ * @param {Object[]} lineData.dataset[].data - The data object
+ * @param {Object[]} lineData.dataset[].point - The point for rending.
+ * @private
+ *
+ */
+ value: function _drawLine(lineData) {
+ var _this2 = this;
- this.reset = function () {
- _this.currentActionIndex = 0;
- _this.tweenzerHandler.stop().off('tick').off('done');
- _this.started = false;
- _this.resetActions();
- _this.emit('reset');
- };
+ var me = this,
+ ctx = me.ctx;
+ var box = lineData.box,
+ legend = lineData.legend,
+ dataset = lineData.dataset;
+ var display = legend.display,
+ spanGaps = legend.spanGaps,
+ tension = legend.tension,
+ lineWidth = legend.lineWidth,
+ lineJoin = legend.lineJoin,
+ fillStyle = legend.fillStyle,
+ strokeStyle = legend.strokeStyle,
+ fillArea = legend.fillArea,
+ fillAlpha = legend.fillAlpha;
- var easeFun = ez.easeInOutQuad;
- if (options.easeType) {
- if (typeof ez[options.easeType] != 'undefined') {
- easeFun = ez[options.easeType];
+ var xAxisY = me.xAxis.getPoint(0).y - me.xAxis.config.lineWidth / 2;
+ if (!display) {
+ return;
}
- }
- this.tweenzerHandler = new _tweezer2.default((0, _helper.extend)({ easing: easeFun }, options));
+ ctx.save();
- this.actions = [];
+ ctx.lineWidth = lineWidth;
+ ctx.lineJoin = lineJoin;
+ ctx.strokeStyle = strokeStyle;
+ ctx.fillStyle = fillStyle;
+ // Draw fill area
+ if (fillArea) {
+ (function () {
+ ctx.beginPath();
- var mit = (0, _mitt2.default)();
- (0, _es6Mixins2.default)([mit], this, {
- // Mixins will create a new method to nested call all duplicate method
- mergeDuplicates: false
- });
- }
+ var firstPoint = void 0,
+ currPoint = void 0;
+ dataset.forEach(function (d, index) {
+ var point = d.point;
- /**
- * Push an action to
- * @param {WxAnimation~action|wxAnimationActLinker} action
- * @return {number} - The index of action
- */
+ if (!!currPoint) {
+ if (point) {
+ _this2._lineToPoint(currPoint, point, me._getNextPoint(dataset, index, spanGaps), tension);
+ } else if (!spanGaps) {
+ // Not spanGap, close path and fill
+ _this2.__fillInHere(firstPoint, currPoint, xAxisY, fillAlpha);
+ // First point reset
+ firstPoint = undefined;
+ } else {
+ // SpanGap, not record this point.
+ return;
+ }
+ } else {
+ if (point) {
+ //ctx.moveTo(point.x, point.y);
+ _this2._lineToPoint(currPoint, point, me._getNextPoint(dataset, index, spanGaps), tension);
+ firstPoint = point;
+ }
+ }
+ currPoint = point;
+ });
+ if (currPoint && firstPoint) {
+ _this2.__fillInHere(firstPoint, currPoint, xAxisY, tension, fillAlpha);
+ }
+ })();
+ }
- // The current handler action
+ ctx.beginPath();
+ // Draw line
+ var prePoint = void 0;
+ dataset.forEach(function (d, index) {
+ var point = d.point;
- /**
- * A action callback
- * @callback WxAnimation~action
- * @param {number} value - The value of this tick
- * @param {Object} preRet - The last tick's return value
- * @param {Promise} toNext - Hand over next action
- * @param {function} nextAction - Next action or Null
- *
- * @description
- * Every action is a callback to deal one or more ticks
- * Several parameters will pass to. The first is value of this tick; Another is an function can hand over the executive authority to next action.
- */
+ if (point) {
+ _this2._lineToPoint(prePoint, point, me._getNextPoint(dataset, index, spanGaps), tension);
+ //!!currPoint ? ctx.lineTo(point.x, point.y): ctx.moveTo(point.x, point.y);
+ // !!currPoint ?
+ // lineToPoint(currPoint, point, getNextPoint(dataset, index, spanGaps)):
+ // ctx.moveTo(point.x, point.y);
+ } else if (spanGaps) {
+ // SpanGap, not record this point.
+ return;
+ }
+ prePoint = point;
+ });
+ ctx.stroke();
- _createClass(WxAnimation, [{
- key: 'pushActions',
- value: function pushActions(action) {
- if (!_helper.is.Function(action)) {
- throw new Error("Should pass to an `action` callback function");
- }
- return this.actions.push(action);
+ // Draw Point
+ dataset.forEach(function (d, index) {
+ me._drawPoint(ctx, box, d);
+ });
+
+ ctx.draw();
+ ctx.restore();
+
+ return;
}
/**
- * Reset actions
+ * Draw one line
+ * @param {Object} lineData - Line dataset
+ * @param {Object} lineData.box - Draw box config
+ * @param {Object} lineData.legend - Legend's config
+ * @param {Object[]} lineData.dataset[].value - Data of each line point
+ * @param {Object[]} lineData.dataset[].data - The data object
+ * @param {Object[]} lineData.dataset[].point - The point for rending.
+ * @param {Object} preData - Previous line dataset
+ * @private
+ *
*/
}, {
- key: 'resetActions',
- value: function resetActions() {
- this.actions = [];
- }
- }, {
- key: 'runTick',
- value: function runTick(value, preRet) {
+ key: 'drawLine',
+ value: function drawLine(lineData, preData) {
var me = this,
- caindex = me.currentActionIndex || 0;
- if (caindex >= me.actions.length) {
- return;
- }
+ animate = me.chartConfig.animate,
+ animateOpt = me.chartConfig.animateOptions;
- var ret = void 0,
- action = me.actions[caindex],
- nextAction = caindex + 1 <= me.actions.length ? me.actions[caindex + 1] : null;
- // try {
- me.emit('tick', { value: value, preRet: preRet, toNext: me.handOverAction, nextAction: nextAction, parallel: false });
- ret = action.apply(me, [value, preRet, me.handOverAction, nextAction]);
- // } catch (e) {
- // me.error = `${e.name} : ${e.message}`;
- // // Catch an error.
- // // Stop all actions
- // me.started = false;
- // me.currentActionIndex = 0;
- // me.tweenzerHandler.stop();
- // me.emit('error', {error: me.error});
- // }
- return ret;
+ if (animate) {
+ var actionAnimation = me._getAnimationDrawLine(lineData, preData);
+ if (!actionAnimation) {
+ return;
+ }
+ me.wxAnimation.pushActions(actionAnimation);
+ me.wxAnimation.pushActions(function (t) {
+ if (animateOpt.end === t) {
+ me._drawLine(lineData);
+ }
+ });
+ } else {
+ me._drawLine(lineData);
+ }
}
- }, {
- key: 'runTickParallel',
- value: function runTickParallel(value) {
- var tickRet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+ /**
+ * Build the yAxis datasets
+ * @param {BoxInstance} area - The area of chart
+ */
+ }, {
+ key: 'yScaleAxisDatas',
+ value: function yScaleAxisDatas(area) {
var me = this,
- actions = me.actions,
- actionsLen = me.actions.length;
+ stacked = me.chartConfig.stacked,
+ discardNeg = me.chartConfig.discardNeg,
+ ctx = me.ctx;
+ var yScaleItemOptions = me.chartConfig.yScaleItemOptions;
+ var tickLimits = me.yAxis.calculateTickLimit(area, ctx);
- // try {
- actions.forEach(function (action, index) {
- var preRet = tickRet ? tickRet[index] : null,
- toNext = function toNext() {},
- nextAction = index + 1 < actionsLen ? actions[index + 1] : null;
- me.emit('tick', { value: value, preRet: preRet, toNext: toNext, nextAction: nextAction, parallel: true });
- var ret = action.apply(me, [value, preRet, toNext, nextAction]);
- tickRet[index] = ret;
- });
- // } catch (e) {
- // me.error = `${e.name} : ${e.message}`;
- // // Catch an error.
- // // Stop all actions
- // me.started = false;
- // me.tweenzerHandler.stop();
- // me.emit('error', {error: me.error});
- // }
- return tickRet;
- }
- }, {
- key: 'tick',
- value: function tick(parallel) {
- var me = this,
- rets = undefined;
- return function (v) {
- if (parallel) rets = me.runTickParallel(v, rets);else rets = me.runTick(v, rets);
- };
+ if (stacked) {
+ var _me$stackYScaleAxisLi = me.stackYScaleAxisLimit(),
+ max = _me$stackYScaleAxisLi.max,
+ min = _me$stackYScaleAxisLi.min;
+
+ return me.yAxis.buildDatasets(max, min < 0 && discardNeg ? 0 : min, tickLimits, undefined, yScaleItemOptions);
+ } else {
+ // First, get all available values and calculate the max/min value
+ var _visDatasets$reduce = this.visDatasets.reduce(function (pre, cur) {
+ var max = pre.max,
+ min = pre.min;
+
+ if (cur.display) {
+ var curValue = me.legends.map(function (legend) {
+ if (legend.key) {
+ return cur[legend.key] || 0;
+ }
+ }).concat(max, min);
+ max = Math.max.apply(Math, curValue);
+ min = Math.min.apply(Math, curValue);
+ }
+ return { max: max, min: min };
+ }, {
+ max: 0,
+ min: 0
+ }),
+ _max = _visDatasets$reduce.max,
+ _min = _visDatasets$reduce.min;
+
+ return me.yAxis.buildDatasets(_max, _min, tickLimits, undefined, yScaleItemOptions);
+ }
}
+
/**
- * Run actions
- *
- * @param {Boolean} parallel - parallel to exec all actions
+ * Build the xAxis datasets
*/
}, {
- key: 'run',
- value: function run() {
- var parallel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
+ key: 'xScaleAxisDatas',
+ value: function xScaleAxisDatas() {
var me = this;
- me.emit('start', { parallel: parallel });
- me.started = true;
+ var xScaleItemOptions = me.chartConfig.xScaleItemOptions;
+ var xScaleConfig = me.labels.map(function (label) {
+ var item = {
+ 'text': label
+ };
+ if (typeof xScaleItemOptions !== 'undefined') {
+ item = (0, _helper.extend)(item, xScaleItemOptions);
+ }
+ return item;
+ });
- me.tweenzerHandler.on('tick', me.tick(parallel)).on('done', function () {
- me.currentActionIndex = 0;
- me.started = false;
- me.emit('done', { parallel: parallel });
- }).begin();
+ return me.xAxis.buildDatasets(xScaleConfig);
+ }
+ }, {
+ key: 'labels',
+ get: function get() {
+ var me = this,
+ tmp = void 0;
+ if (me._labels) {
+ return me._labels;
+ } else if (tmp = me.chartConfig.labels) {
+ if (_helper.is.Array(tmp)) {
+ return tmp;
+ }
+ }
+ me._labels = me.visDatasets.map(function (dataset) {
+ return dataset.label;
+ });
+ return me._labels;
+ }
+ }, {
+ key: 'legends',
+ get: function get() {
+ var me = this;
+ if (!me._legends) {
+ me._legends = me._getLegendConfig();
+ }
+ return me._legends;
+ },
+ set: function set(value) {
+ this._legends = value;
}
}]);
- return WxAnimation;
- }();
+ return WxLiner;
+ }(_wxChart2.default);
- exports.default = WxAnimation;
- }, { "../util/helper": 24, "../util/tweezer": 28, "es6-mixins": 5, "ez.js": 6, "mitt": 7 }], 15: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
+ var _initialiseProps = function _initialiseProps() {
+ var _this3 = this;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ this._animateLineTick = function (n, ln) {
+ var sp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+ var bp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
- var _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ return sp ? (n % ln + bp * ln) / (ln * sp) : 0;
+ };
+
+ this._getCurr = function (dataset, index) {
+ if (index > dataset.length - 1) {
+ return;
}
- }return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ return dataset[index];
};
- }();
- var _helper = require('../util/helper');
+ this._getNext = function (dataset, index, spanGaps) {
+ // The end
+ if (index >= dataset.length - 1) {
+ return;
+ }
+ var nextDate = dataset[index + 1];
+ if (!nextDate.point) {
+ if (!!spanGaps) return _this3._getNext(dataset, index + 1, spanGaps);else return;
+ }
+ return nextDate;
+ };
- var _layout = require('./layout');
+ this._getNextPoint = function (dataset, index, spanGaps) {
+ var next = _this3._getNext(dataset, index, spanGaps);
+ return next ? next.point : null;
+ };
- var _wxChart = require('../charts/wxChart');
+ this._getPre = function (dataset, index, spanGaps) {
+ if (index <= 0) {
+ return;
+ }
+ var preDate = dataset[index - 1];
+ if (!preDate.point) {
+ if (!!spanGaps) return _this3._getPre(dataset, index - 1, spanGaps);else return;
+ }
+ return preDate;
+ };
- var _wxChart2 = _interopRequireDefault(_wxChart);
+ this._getPrePoint = function (dataset, index, spanGaps) {
+ var pre = _this3._getPre(dataset, index, spanGaps);
+ return pre ? pre.point : null;
+ };
- var _wxCanvas = require('../util/wxCanvas');
+ this._lineToPoint = function (pre, p, next, tension) {
+ var ctx = _this3.ctx;
+ if (!tension || tension === 0) {
+ ctx.lineTo(p.x, p.y);
+ } else {
+ var controlPoints = (0, _helper.splineCurve)(pre, p, next, tension);
+ if (!pre) {
+ ctx.moveTo(p.x, p.y);
+ } else {
+ ctx.bezierCurveTo(pre.controlPoints.next.x, pre.controlPoints.next.y, controlPoints.previous.x, controlPoints.previous.y, p.x, p.y);
+ }
+ p.controlPoints = controlPoints;
+ }
+ };
- var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
+ this._animateLineToPoint = function (pre, p, next, pert, curt, tension) {
+ var ctx = _this3.ctx;
+ if (!tension || tension === 0) {
+ var x1 = pre.x,
+ x2 = p.x,
+ y1 = pre.y,
+ y2 = p.y;
+ var totalPath = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)),
+ cosAngle = (x2 - x1) / totalPath,
+ sinAngle = (y2 - y1) / totalPath;
+ var pointX = x1 + cosAngle * curt,
+ pointY = y1 + sinAngle * curt;
+ ctx.moveTo(x1, y1);
+ ctx.lineTo(pointX, pointY);
+ return {
+ startPoint: pre,
+ endPoint: { x: pointX, y: pointY }
+ };
+ } else {
+ var p0 = void 0,
+ p1 = void 0,
+ p2 = void 0,
+ p3 = void 0,
+ controlPoints = (0, _helper.splineCurve)(pre, p, next, tension);
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : { default: obj };
- }
+ if (pre && p) {
+ var bz = new Bezier({ x: pre.x, y: pre.y }, { x: pre.controlPoints.next.x, y: pre.controlPoints.next.y }, { x: controlPoints.previous.x, y: controlPoints.previous.y }, { x: p.x, y: p.y });
+ var sbz = bz.split(pert || 0, curt);
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
+ p0 = sbz.point(0);p1 = sbz.point(1);p2 = sbz.point(2);p3 = sbz.point(3);
- // The basic component
- var WxBaseComponent = function () {
- function WxBaseComponent(wxChart, config) {
- _classCallCheck(this, WxBaseComponent);
+ ctx.moveTo(Math.round(p0.x), p0.y);
+ ctx.bezierCurveTo(p1.x, p1.y, p2.x, p2.y, Math.round(p3.x), p3.y);
+ }
+ p.controlPoints = controlPoints;
+ return {
+ startPoint: p0 ? {
+ x: Math.round(p0.x),
+ y: p0.y
+ } : null,
+ endPoint: p3 ? {
+ x: Math.round(p3.x),
+ y: p3.y
+ } : null
+ };
+ }
+ };
- var me = this;
+ this.__fillInHere = function (firstPoint, currPoint, xAxisY, fillAlpha) {
+ var ctx = _this3.ctx;
+ ctx.lineTo(currPoint.x, xAxisY);
+ ctx.lineTo(firstPoint.x, xAxisY);
- if (!wxChart || !wxChart instanceof _wxChart2.default) {
- throw new Error('Should be an WxChart instance');
+ ctx.globalAlpha = fillAlpha;
+ ctx.fill();
+ ctx.globalAlpha = 1;
+ };
+
+ this._drawPoint = function (ctx, box, p) {
+ if (!p || !p.point) {
+ return;
}
- me.wxChart = wxChart;
- // scale set options
- this._datasets = [];
+ var _p$data = p.data,
+ pointBorderColor = _p$data.pointBorderColor,
+ pointBorderWidth = _p$data.pointBorderWidth,
+ pointRadius = _p$data.pointRadius,
+ pointStyle = _p$data.pointStyle,
+ label = _p$data.label,
+ showItem = _p$data.showItem,
+ format = _p$data.format;
+ var _p$point = p.point,
+ pointX = _p$point.x,
+ pointY = _p$point.y;
- return me;
- }
+ // TODO: pointStyle NOT IMPLEMENT, Only can render line
- /**
- * Initialize datasets and options
- * @param {Object[]} datasets
- * @param {Object} [defaultOptions]
- * @returns {Array|*}
- */
+ if (pointRadius) {
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, pointRadius, 0, 2 * Math.PI);
+ ctx.fill();
+ }
- _createClass(WxBaseComponent, [{
- key: 'init',
- value: function init(datasets) {
- var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ if (!!showItem) {
+ var curFillStyle = ctx.fillStyle;
+ ctx.textBaseline = "bottom";
+ ctx.fillStyle = tinycolor(curFillStyle).darken(15).toString();
+ ctx.fillStyle = curFillStyle;
- var me = this;
+ var barItem = _helper.is.Function(format) ? format.call(_this3, label, p.value, p.index) : p.value + '';
+ var boxX = box.x,
+ boxY = box.y;
- if (_helper.is.Undefined(datasets) || _helper.is.Null(datasets)) {
- datasets = me.datasets;
- if (!datasets) {
- throw new Error('Datasets is null');
- }
- }
+ var itemX = pointX - ctx.measureText(barItem).width / 2,
+ itemY = pointY - ctx.fontSize / 6 - (pointRadius || 0) - (pointBorderWidth || 0);
- if (!_helper.is.Array(datasets)) {
- datasets = [datasets];
+ // Check box's X,Y
+ if (itemX < box.x) {
+ itemX = box.x;
+ }
+ if (itemY < box.y) {
+ itemY = pointX + ctx.fontSize / 6 + (pointRadius || 0) + (pointBorderWidth || 0);
+ ctx.textBaseline = "top";
}
- datasets = datasets.map(function (dataset) {
- return (0, _helper.extend)({}, defaultOptions, dataset);
- });
-
- me._datasets = datasets;
- me._visDatasets = null;
- return me._datasets;
+ ctx.fillText(barItem, itemX, itemY);
}
- /**
- * Update data and re-draw
- * @param {Object[]} datasets
- * @param {BoxInstance} [area]
- * @param {Object} [config]
- */
-
- }, {
- key: 'update',
- value: function update(datasets, area) {
- var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
-
- var me = this;
-
- me.clear();
- if (!datasets) {
- return;
- }
- datasets = me.init(datasets);
+ if (pointBorderWidth) {
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, pointRadius, 0, 2 * Math.PI);
+ ctx.lineWidth = pointBorderWidth;
+ ctx.strokeStyle = pointBorderColor || legend.strokeStyle;
+ ctx.stroke();
+ }
+ };
- if (area && area instanceof _layout.BoxInstance) {
- area = me.box = me.calculateBox(area, datasets, config);
- } else if (me.box) {
- area = me.box;
- } else {
- return;
- }
+ this._getAnimationDrawLine = function (lineData, preData) {
+ var me = _this3,
+ animate = me.chartConfig.animate,
+ animateOpt = me.chartConfig.animateOptions,
+ ctx = me.ctx;
- if (me.isVisiable()) {
- me.draw(datasets, area, config);
- }
- }
+ var box = lineData.box,
+ legend = lineData.legend,
+ dataset = lineData.dataset;
+ var display = legend.display,
+ spanGaps = legend.spanGaps,
+ tension = legend.tension,
+ lineWidth = legend.lineWidth,
+ lineJoin = legend.lineJoin,
+ fillStyle = legend.fillStyle,
+ strokeStyle = legend.strokeStyle,
+ fillArea = legend.fillArea,
+ fillAlpha = legend.fillAlpha;
- /**
- * Calculate occupied space
- * @param {Object[]} [datasets] - datasets
- * @param {BoxInstance} [area] - Current box area
- * @param {Object} [config]
- * @returns {BoxInstance}
- */
+ // Animation dynamic options
- }, {
- key: 'calculateBox',
- value: function calculateBox(area) {
- var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;
- var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
+ var dataLen = dataset.length,
+ categoryTicks = (animateOpt.end - animateOpt.start) / (dataLen - 1);
- return area;
+ if (!display) {
+ return;
}
- /**
- * Set an occupied space for component
- * @param {BoxInstance} box - New box
- * @param {Boolean} [redraw=true] - Re-draw the component
- */
+ return function (t, lastt, toNext) {
+ ctx.save();
+ ctx.lineWidth = lineWidth;
+ ctx.lineJoin = lineJoin;
+ ctx.strokeStyle = strokeStyle;
+ ctx.fillStyle = fillStyle;
- }, {
- key: 'setBox',
- value: function setBox(box) {
- var redraw = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+ var dataIndex = !lastt ? 0 // first point
+ : Math.floor(t / categoryTicks) + 1;
+ var point = void 0,
+ drawCurrPoint = void 0,
+ index = void 0,
+ data = void 0,
+ pret = lastt ? lastt.t : 0,
+ curt = 0,
+ curr = me._getCurr(dataset, dataIndex),
+ next = me._getNext(dataset, dataIndex, spanGaps),
+ pre = me._getPre(dataset, dataIndex, spanGaps),
+ ppPoint = void 0,
+ diffIndex = lastt ? dataIndex - lastt.index : 0;
- var me = this;
- if (redraw) {
- me.clear();
- }
- if (box && box instanceof _layout.BoxInstance) {
- me.box = box;
+ if (curr) {
+ drawCurrPoint = curr.point;
+ point = curr.point;
+ index = curr.index;
+ data = curr.data;
+ curt = me._animateLineTick(t, categoryTicks, index - (pre ? pre.index : 0), dataIndex - (pre ? pre.index : 0) - 1);
}
- if (redraw && me.isVisiable()) {
- me.draw();
+
+ if (pre) {
+ ppPoint = me._getPrePoint(dataset, pre.index, spanGaps);
}
- }
- /**
- * Draw the component
- *
- * @param {Object[]} [datasets] - datasets
- * @param {BoxInstance} [box] - Current box area
- * @param {Object} [config]
- */
+ if (!drawCurrPoint && next) {
+ drawCurrPoint = next.point;
+ index = next.index;
+ next = me._getNext(dataset, next.index, spanGaps);
+ }
- }, {
- key: 'draw',
- value: function draw() {
- var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;
- var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
- var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
- }
- /**
- * Clear canvas in component's box
- */
+ if (diffIndex == 1) {
+ // Draw line
+ if (pre && pre.point) {
+ ctx.beginPath();
+ me._animateLineToPoint(ppPoint, pre.point, drawCurrPoint, pret, 1, tension);
+ ctx.stroke();
+ }
- }, {
- key: 'clear',
- value: function clear() {
- var me = this;
- if (me.box) {
- me.wxChart.ctx.clearRect(me.box.x, me.box.y, me.box.outerWidth, me.box.outerHeight);
- me.wxChart.ctx.draw();
+ pret = 0;
}
- }
- }, {
- key: 'isVisiable',
- value: function isVisiable() {
- return !!this.config.display;
- }
- }, {
- key: 'isHorizontal',
- value: function isHorizontal() {
- return this.position == 'top' || this.position == 'bottom';
- }
- }, {
- key: 'datasets',
- get: function get() {
- return this._datasets;
- },
- set: function set(datasets) {
- return this.update(datasets);
- }
- /**
- * Get visible ticks
- */
+ if (!point && spanGaps || point) {
+ // this tick path close
+ // Draw line
- }, {
- key: 'visDatasets',
- get: function get() {
- return this._visDatasets ? this._visDatasets : this._visDatasets = this.datasets.filter(function (v) {
- return !!v.display;
- });
- }
- // Can not reset
+ if (drawCurrPoint) {
+ ctx.beginPath();
+ me._animateLineToPoint(pre ? pre.point : null, drawCurrPoint, next ? next.point : null, pret, curt, tension);
+ ctx.stroke();
+ }
+ }
- , set: function set(val) {}
- }, {
- key: 'position',
- get: function get() {
- return this.config.position;
- },
- set: function set(value) {
- this.config.position = value;
- return this.update();
- }
- }]);
+ if (pret == 0 && pre && pre.point) {
+ me._drawPoint(ctx, box, (0, _helper.extend)({}, pre, { showItem: false }));
+ }
- return WxBaseComponent;
- }();
+ ctx.draw();
+ ctx.restore();
- exports.default = WxBaseComponent;
- }, { "../charts/wxChart": 13, "../util/helper": 24, "../util/wxCanvas": 29, "./layout": 16 }], 16: [function (require, module, exports) {
+ return {
+ point: point,
+ t: curt,
+ index: dataIndex,
+ diffIndex: diffIndex
+ };
+ };
+ };
+ };
+
+ exports.default = WxLiner;
+ }, { "../core/animation": 15, "../core/layout": 17, "../core/legend": 18, "../core/scale": 19, "../core/title": 20, "../scale/scale.category": 21, "../scale/scale.crosshelp": 22, "../scale/scale.liner": 23, "../scale/scale.stackhelp": 24, "../util/helper": 25, "../util/randomColor": 27, "../util/wxCanvas": 29, "./wxChart": 14, "bezier-js": 1, "es6-mixins": 5, "tinycolor2": 10 }], 14: [function (require, module, exports) {
/* global module, wx, window: false, document: false */
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
- exports.BoxInstance = undefined;
var _createClass = function () {
function defineProperties(target, props) {
@@ -5686,294 +6113,288 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
};
}();
- var _base = require('./base');
-
- var _base2 = _interopRequireDefault(_base);
+ exports.getChartInstances = getChartInstances;
var _helper = require('../util/helper');
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : { default: obj };
- }
+ var _wxCanvas = require('../util/wxCanvas');
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
+ var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
+
+ var _layout = require('../core/layout');
+
+ var _mitt = require('mitt');
+
+ var _mitt2 = _interopRequireDefault(_mitt);
+
+ var _es6Mixins = require('es6-mixins');
+
+ var _es6Mixins2 = _interopRequireDefault(_es6Mixins);
+
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
- /**
- * A box model description
- * @typedef {Object} BoxInstance
- * @property {number} x - The x point.
- * @property {number} y - The y point.
- * @property {number} width - Inner width (context only, not calculate padding and margin)
- * @property {number} height - Inner height (context only, not calculate padding and margin)
- * @property {number} outerWidth - Outer width
- * @property {number} outerHeight - Outer height
- *
- * @description
- * (x,y) -------------------------- (ex, y)
- * | |
- * | (lx,ly)-------------(rx,ly) |
- * | | | |
- * | | | |
- * | (lx,ry)-------------(rx,ry) |
- * | |
- * (x,ey) ------------------------- (ex, ey)
- */
- var BoxInstance = exports.BoxInstance = function () {
- function BoxInstance(position, x, y, width, height, outerWidth, outerHeight) {
- _classCallCheck(this, BoxInstance);
+ // Chart default config
+ var wxChartDefaultConfig = {
+ fontSize: 10,
+ width: 300,
+ height: 200,
+ display: 'block',
+ padding: 0,
+ backgroundColor: null
+ };
+
+ // Store all references of 'WxChart' instances - allowing us to globally resize chart instances on window resize.
+ var wxChartInstances = {};
+
+ function getChartInstances(id) {
+ if (id && id in wxChartInstances) {
+ return wxChartInstances[id];
+ }
+ return null;
+ };
+
+ // The basic class of WeiXin chart
+
+ var WxChart = function () {
+ /**
+ * @constructor
+ * @param {string} id - Canvas id ,DOM ID or HTMLElement
+ * @param {Object|number} [config] - The config of Canvas or the width of chart.
+ * @param {number} [config.width] - The width of canvas.
+ * @param {number} [config.height] - The height of canvas.
+ * @param {number} [config.padding] - The padding of canvas.
+ * @param {string} [config.display] - The display style of chart.
+ */
+ function WxChart(id, config) {
+ _classCallCheck(this, WxChart);
var me = this;
- if (_helper.is.PureObject(position)) {
- var opt = position;
- position = opt.position;
- x = opt.x;
- y = opt.y;
- width = opt.width;
- height = opt.height;
+ // Event emitter
+ (0, _es6Mixins2.default)([(0, _mitt2.default)()], this, {
+ // Mixins will create a new method to nested call all duplicate method
+ mergeDuplicates: false
+ });
- var padding = opt.padding,
- margin = opt.margin;
- if (_helper.is.Number(padding) && _helper.is.Number(margin)) {
- outerWidth = width + padding * 2 + margin * 2;
- outerHeight = height + padding * 2 + margin * 2;
+ // Arguments parse...
+ var chartConf = void 0;
+ if (_helper.is.PureObject(config)) {
+ chartConf = (0, _helper.extend)({}, wxChartDefaultConfig, config);
+ } else if (_helper.is.Number(config) || _helper.is.String(config)) {
+ // WxChart(id, width, height, display, ...options)
+ chartConf = {
+ 'width': arguments[1],
+ 'height': 2 in arguments ? arguments[2] : wxChartDefaultConfig.height,
+ 'display': 3 in arguments ? arguments[3] : wxChartDefaultConfig.display
+ };
+ if (4 in arguments && _helper.is.PureObject(arguments[4])) {
+ (0, _helper.extend)({}, wxChartDefaultConfig, chartConf, arguments[4]);
} else {
- outerWidth = opt.outerWidth;
- outerHeight = opt.outerHeight;
+ (0, _helper.extend)({}, wxChartDefaultConfig, chartConf);
}
}
- me.position = position;
- me.width = width;
- me.height = height;
- me.outerWidth = outerWidth;
- me.outerHeight = outerHeight;
+ me.canvas = new _wxCanvas2.default(id, chartConf);
+ me.ctx = me.canvas.getContext('2d');
+ me.isWeiXinAPP = (0, _helper.checkWX)();
+ me._id = (0, _helper.uid)();
- Object.defineProperty(this, 'x', {
- get: function get() {
- return x;
- },
- set: function set(value) {
- me.width += x - value;
- me.outerWidth += x - value;
- x = value;
- }
+ me.emit('initCanvas', {
+ canvas: me.canvas,
+ ctx: me.ctx,
+ id: me.id + ''
});
- Object.defineProperty(this, 'y', {
- get: function get() {
- return y;
- },
- set: function set(value) {
- me.height += y - value;
- me.outerHeight += y - value;
- y = value;
- }
- });
- }
+ me._config = me.initConfig(chartConf);
+ me.initContext();
- /**
- * The x,y in right-bottom
- */
+ // Append to wxChartInstances
+ wxChartInstances[me.id + ''] = me;
- _createClass(BoxInstance, [{
- key: 'clone',
+ return me;
+ }
- /**
- * Clone this box and return an new Instance
- * @returns {BoxInstance}
- */
- value: function clone() {
+ _createClass(WxChart, [{
+ key: 'initConfig',
+ value: function initConfig(config) {
var me = this;
- return new BoxInstance(me.position, me.x, me.y, me.width, me.height, me.outerWidth, me.outerHeight);
+ if (!me.canvas) {
+ console.error("Failed to create WxChart: can't acquire context!");
+ }
+
+ var canvas = me.canvas,
+ cvWidth = canvas.width,
+ cvHeight = canvas.height;
+ config.width = cvWidth;
+ config.height = cvHeight;
+ config.aspectRatio = config.aspectRatio ? config.aspectRatio : !_helper.is.Undefined(cvHeight) && !_helper.is.Undefined(cvWidth) ? (cvWidth / cvWidth).toFixed(2) : null;
+ config.display = config.display || 'block';
+ return config;
}
+ }, {
+ key: 'initContext',
+ value: function initContext() {
+ var me = this;
+ if (!me.canvas) {
+ console.error("Failed to create WxChart: can't acquire context!");
+ return me;
+ }
+ // Set scale of canvas
+ (0, _helper.retinaScale)(me.ctx, me.canvas.width, me.canvas.height);
- /**
- * Check whether intersect with other BoxInstance
- */
+ // Set font size
+ if (me.config.fontSize) {
+ me.ctx.fontSize = me.config.fontSize;
+ }
+ // calculate box
+ var padding = me.config.padding || 0;
+ me.innerBox = new _layout.BoxInstance('top', 0, 0, me.config.width - padding * 2, me.config.height - padding * 2, me.config.width, me.config.height);
+ }
}, {
- key: 'isIntersect',
- value: function isIntersect(boxInstance) {
+ key: 'clear',
+ value: function clear() {
var me = this;
- return !(me.ex < boxInstance.x || me.x > boxInstance.ex || me.ey < boxInstance.y || me.y < boxInstance.ey);
+ me.ctx.clearRect(0, 0, me.canvas.width, me.canvas.height);
+ if (me.config.backgroundColor) {
+ me.ctx.save();
+ me.ctx.fillStyle = me.config.backgroundColor;
+ me.ctx.fillRect(0, 0, me.canvas.width, me.canvas.height);
+ me.ctx.restore();
+ me.ctx.draw();
+ }
+
+ me.emit('clear', {
+ canvas: me.canvas
+ });
}
}, {
- key: 'toObject',
- value: function toObject() {
- return {
- position: this.position,
- x: this.x,
- y: this.y,
- ex: this.ex,
- ey: this.ey,
- lx: this.lx,
- ly: this.ly,
- rx: this.rx,
- ry: this.ry,
- width: this.width,
- height: this.height,
- outerHeight: this.outerHeight,
- outerWidth: this.outerWidth
- };
+ key: 'destroy',
+ value: function destroy() {
+ var me = this;
+
+ me.clear();
+ me.canvas.releaseContext();
+
+ if (me.id && me.id in wxChartInstances) {
+ delete wxChartInstances[me.id];
+ }
+
+ //me.id = null;
+ me.canvas = null;
+ me.ctx = null;
+ me._config = null;
+ me.innerBox = null;
+
+ me.emit('destroy');
}
}, {
- key: 'ex',
- get: function get() {
- return this.x + this.outerWidth;
+ key: 'draw',
+ value: function draw() {
+ // Do nothing...
}
}, {
- key: 'ey',
- get: function get() {
- return this.y + this.outerHeight;
- }
- /**
- * The x,y in content
- */
+ key: 'update',
+ value: function update(datasets, defaultItemOpt) {
+ var me = this;
+ if (_helper.is.Undefined(datasets)) {
+ return;
+ }
+ if (!_helper.is.Array(datasets)) {
+ datasets = [datasets];
+ }
- }, {
- key: 'lx',
- get: function get() {
- return this.x + this.marginLR;
- }
- }, {
- key: 'ly',
- get: function get() {
- return this.y + this.marginTB;
+ datasets = datasets.map(function (dataset) {
+ return (0, _helper.extend)({}, defaultItemOpt, dataset);
+ });
+
+ me.emit('update', { datasets: datasets });
+ // Fill default Options
+ me.clear();
+ me._datasets = datasets;
+ me._visDatasets = null;
+ return me._datasets;
}
}, {
- key: 'rx',
- get: function get() {
- return this.x + this.width + this.marginLR;
+ key: 'calculateTotal',
+ value: function calculateTotal() {
+ var datasets = this.datasets;
+ var total = 0;
+ var value = void 0;
+
+ datasets.forEach(function (dataset, index) {
+ value = parseFloat(dataset.value);
+ if (!_helper.is.NaN(value) && !dataset.hidden) {
+ total += Math.abs(value);
+ }
+ });
+
+ return total;
}
}, {
- key: 'ry',
+ key: 'id',
get: function get() {
- return this.y + this.height + this.marginTB;
+ return this._id;
}
+
+ // The 'config' property
+
}, {
- key: 'marginLR',
+ key: 'config',
get: function get() {
- return (this.outerWidth - this.width) / 2;
- },
- set: function set(value) {
- if (_helper.is.Number(value)) {
- this.width -= value * 2;
+ if (!this._config) {
+ this._config = (0, _helper.extend)({}, wxChartDefaultConfig);
}
+ return this._config;
+ },
+ set: function set(chartConf) {
+ var me = this;
+ // Update chart config
+ me.initConfig(chartConf);
+ me.initContext();
+ // Clear canvas
+ me.clear();
+ // Call redraw
+ me.draw();
}
}, {
- key: 'marginTB',
+ key: 'datasets',
get: function get() {
- return (this.outerHeight - this.height) / 2;
+ return this._datasets;
},
- set: function set(value) {
- if (_helper.is.Number(value)) {
- this.height -= value * 2;
- }
- }
- }]);
-
- return BoxInstance;
- }();
- /**
- * @class WxLayout
- * Find the best box area of items
- */
-
- var WxLayout = function () {
- function WxLayout(wxChart) {
- _classCallCheck(this, WxLayout);
-
- var me = this;
-
- if (!wxChart || !wxChart instanceof _base2.default) {
- throw new Error('Should be an WxChart instance');
- }
- me.wxChart = wxChart;
- //me.initBox = wx.wxChart.innerBox.clone();
- me._boxs = [];
- }
-
- /**
- * Add an boxInstance
- * @param {BoxInstance} boxInstance
- * @returns {number} The box id
- */
-
- _createClass(WxLayout, [{
- key: 'addBox',
- value: function addBox(boxInstance) {
- var me = this;
- if (!boxInstance instanceof BoxInstance) {
- throw new Error('Please add an BoxInstance Object');
- }
- return parseInt(me._boxs.push(boxInstance)) - 1;
+ set: function set(datasets) {
+ return this.update(datasets);
}
/**
- * Remove an boxInstance
- * @param {(BoxInstance|number)} boxId - The box id
+ * Get visible ticks
*/
}, {
- key: 'removeBox',
- value: function removeBox(boxId) {
- var me = this;
- if (_helper.is.Number(boxId)) {
- me._boxs.splice(boxId, 1);
- } else if (boxId instanceof BoxInstance) {
- me._boxs.splice(me._boxs.indexOf(boxId), 1);
- }
- }
- }, {
- key: 'removeAllBox',
- value: function removeAllBox() {
- this._boxs = [];
- }
- }, {
- key: 'adjustBox',
- value: function adjustBox() {
- var me = this;
- var box = me.wxChart.innerBox.clone();
- me._boxs.forEach(function (boxInstance) {
- var position = boxInstance.position,
- x = boxInstance.x,
- y = boxInstance.y,
- height = boxInstance.height,
- width = boxInstance.width,
- outerWidth = boxInstance.outerWidth,
- outerHeight = boxInstance.outerHeight;
-
- switch (position) {
- case 'top':
- box.y += outerHeight;
- break;
- case 'bottom':
- box.outerHeight -= outerHeight;
- box.height -= outerHeight;
- break;
- case 'left':
- box.x += outerWidth;
- break;
- case 'right':
- box.outerWidth -= outerWidth;
- box.width -= outerWidth;
- break;
- }
+ key: 'visDatasets',
+ get: function get() {
+ return this._visDatasets ? this._visDatasets : this._visDatasets = this.datasets.filter(function (v) {
+ return !!v.display;
});
- return box;
}
+ // Can not reset
+
+ , set: function set(val) {}
}]);
- return WxLayout;
+ return WxChart;
}();
- exports.default = WxLayout;
- }, { "../util/helper": 24, "./base": 15 }], 17: [function (require, module, exports) {
+ exports.default = WxChart;
+ }, { "../core/layout": 17, "../util/helper": 25, "../util/wxCanvas": 29, "es6-mixins": 5, "mitt": 7 }], 15: [function (require, module, exports) {
/* global module, wx, window: false, document: false */
'use strict';
@@ -5981,12 +6402,6 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
value: true
});
- var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
- return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
- } : function (obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
- };
-
var _createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
@@ -5997,29 +6412,37 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
};
}();
- var _get = function get(object, property, receiver) {
- if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {
- var parent = Object.getPrototypeOf(object);if (parent === null) {
- return undefined;
- } else {
- return get(parent, property, receiver);
- }
- } else if ("value" in desc) {
- return desc.value;
- } else {
- var getter = desc.get;if (getter === undefined) {
- return undefined;
- }return getter.call(receiver);
- }
- };
+ exports.wxAnimationActLinker = wxAnimationActLinker;
- var _base = require('./base');
+ var _tweezer = require('../util/tweezer');
- var _base2 = _interopRequireDefault(_base);
+ var _tweezer2 = _interopRequireDefault(_tweezer);
+
+ var _ez = require('ez.js');
+
+ var ez = _interopRequireWildcard(_ez);
var _helper = require('../util/helper');
- var _layout = require('./layout');
+ var _mitt = require('mitt');
+
+ var _mitt2 = _interopRequireDefault(_mitt);
+
+ var _es6Mixins = require('es6-mixins');
+
+ var _es6Mixins2 = _interopRequireDefault(_es6Mixins);
+
+ function _interopRequireWildcard(obj) {
+ if (obj && obj.__esModule) {
+ return obj;
+ } else {
+ var newObj = {};if (obj != null) {
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
+ }
+ }newObj.default = obj;return newObj;
+ }
+ }
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
@@ -6031,336 +6454,226 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}
}
- function _possibleConstructorReturn(self, call) {
- if (!self) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }return call && ((typeof call === "undefined" ? "undefined" : _typeof2(call)) === "object" || typeof call === "function") ? call : self;
- }
+ function wxAnimationActLinker() {
+ var actions = [],
+ globals = {};
+ return function (action) {
+ var _arguments = arguments;
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof2(superClass)));
- }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
- }
+ for (var _len = arguments.length, options = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ options[_key - 1] = arguments[_key];
+ }
- // Legend default config
- var WX_LEGEND_DEFAULT_CONFIG = {
- display: true,
- /**
- * position can set to :top, bottom, left(same as left bottom), right(same as right bottom), left top, left bottom, right top, right bottom
- */
- position: 'top',
- fullWidth: true, // if the fullWidth is false, the 'width' property should be existed.
- labels: {
- boxWidth: 30,
- fontSize: 11,
- padding: 10 // Padding width between legend items
- }
- };
+ var me = this;
+ if (me instanceof WxAnimation) {
+ // Run all actions in WxAnimation call
+ var ret = void 0;
+ actions.forEach(function (action) {
+ ret = action.apply(me, _arguments);
+ });
+ return ret;
+ } else {
+ // Just push action
+ actions.push(action);
+ return actions;
+ }
+ };
+ }
- //
- // The datasets is an empty array at the first time
- // When you set 'data' attribute, the legend items will draw on Canvas
- // Format
- // {
- // text: 'Displayed Text String',
- // fillAlpha: 1, // Global fill alpha
- // fillStyle: 'Color', // Fill style of the legend box
- // display: Boolean, // If true, this item represents a hidden datasets. Label will be rendered with a strike-through effect,
- // strokeStyle: 'Color'
- // lineCap: String,
- // lineJoin: String,
- // lineWidth: Number
- // }
- var WX_LEGEND_DEFAULT_ITEM_CONFIG = {
- 'lineWidth': 1,
- 'display': true
- };
+ var WxAnimation = function () {
- var WxLegend = function (_WxBaseComponent) {
- _inherits(WxLegend, _WxBaseComponent);
+ /**
+ * WxAnimation initial
+ *
+ * @param {Object} options - Animation options
+ * @param {number} options.start - The start value
+ * @param {number} options.end - The end value
+ * @param {Object} [options.duration=1000] - The total seconds of animation
+ * @param {Object} [options.easeType=easeInOut] - Easing type, please see [ez.js](https://github.com/jaxgeller/ez.js/blob/master/ez.js) for more information
+ * @constructor
+ */
- function WxLegend(wxChart, config) {
- _classCallCheck(this, WxLegend);
+ // The error in actions
- var _this = _possibleConstructorReturn(this, (WxLegend.__proto__ || Object.getPrototypeOf(WxLegend)).call(this, wxChart, config));
- _this.config = (0, _helper.extend)(true, {}, WX_LEGEND_DEFAULT_CONFIG, config);
- return _this;
- }
+ // The animate has started or not
- _createClass(WxLegend, [{
- key: 'init',
- value: function init(datasets) {
- var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : WX_LEGEND_DEFAULT_ITEM_CONFIG;
+ // Tweenzer instance
+ function WxAnimation(options) {
+ var _this = this;
- var me = this;
- var config = me.config;
+ _classCallCheck(this, WxAnimation);
- datasets = _get(WxLegend.prototype.__proto__ || Object.getPrototypeOf(WxLegend.prototype), 'init', this).call(this, datasets, defaultOptions);
- // Reset legendBox
- // Calculate the legend items
- datasets = me.calculateLegendItem(datasets, config);
+ this.currentActionIndex = 0;
- me._datasets = datasets;
+ this.handOverAction = function () {
+ _this.currentActionIndex++;
+ };
- return datasets;
- }
- }, {
- key: 'calculateLegendItem',
- value: function calculateLegendItem(datasets, config) {
- var me = this;
- var labelsConfig = config.labels || {};
+ this.stop = function () {
+ _this.currentActionIndex = 0;
+ _this.tweenzerHandler.stop();
+ _this.started = false;
+ _this.emit('stop');
+ };
- var ctx = me.wxChart.ctx;
- var boxWidth = labelsConfig.boxWidth;
- var fontSize = labelsConfig.fontSize;
- if (!_helper.is.Array(datasets) && _helper.is.PureObject(datasets)) {
- datasets = [datasets];
+ this.reset = function () {
+ _this.currentActionIndex = 0;
+ _this.tweenzerHandler.stop().off('tick').off('done');
+ _this.started = false;
+ _this.resetActions();
+ _this.emit('reset');
+ };
+
+ var easeFun = ez.easeInOutQuad;
+ if (options.easeType) {
+ if (typeof ez[options.easeType] != 'undefined') {
+ easeFun = ez[options.easeType];
}
+ }
- datasets = datasets.map(function (dataset) {
- var textWidth = ctx.measureText(dataset.text).width;
+ this.tweenzerHandler = new _tweezer2.default((0, _helper.extend)({ easing: easeFun }, options));
- var width = boxWidth + fontSize / 2 + textWidth;
- dataset._prop = {
- 'fontSize': fontSize,
- 'boxHeight': fontSize,
- 'boxWidth': boxWidth,
- 'textWidth': textWidth,
- 'width': width
- };
- return dataset;
- });
+ this.actions = [];
- return datasets;
- }
- }, {
- key: 'calculateBox',
- value: function calculateBox(area) {
- var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;
- var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
+ var mit = (0, _mitt2.default)();
+ (0, _es6Mixins2.default)([mit], this, {
+ // Mixins will create a new method to nested call all duplicate method
+ mergeDuplicates: false
+ });
+ }
- var me = this;
- var outerWidth = void 0,
- outerHeight = void 0,
- width = void 0,
- height = void 0;
- var wxChart = me.wxChart,
- ctx = wxChart.ctx,
- fontSize = ctx.fontSize;
- var x = area.x,
- y = area.y;
- var padding = config.labels.padding || 10;
+ /**
+ * Push an action to
+ * @param {WxAnimation~action|wxAnimationActLinker} action
+ * @return {number} - The index of action
+ */
- if (me.isHorizontal()) {
- (function () {
- width = !!config.fullWidth ? area.width - padding * 2 : config.width;
- outerWidth = !!config.fullWidth ? area.width : config.width;
- height = fontSize;
- outerHeight = height + padding * 2;
+ // The current handler action
- // Calculate all items
- var lineNum = 0,
- currentLineWidth = 0,
- maxLineWidth = 0;
- datasets.forEach(function (dataset) {
- var prop = dataset._prop,
- outerWidth = prop.width + padding;
- var lineWidth = currentLineWidth + outerWidth;
- if (lineWidth > width) {
- // The previous line width
- maxLineWidth = maxLineWidth < currentLineWidth ? currentLineWidth : maxLineWidth;
- // We should take a new line
- lineNum++;
- // Set currentLineWidth = 0
- currentLineWidth = outerWidth;
- // The first item width insufficient..
- if (outerWidth > width) {
- // The width options is tooooo small!
- console.warn('The width options is too small! width=', width, '.The chart will set to ', lineWidth);
- width = outerWidth;
- }
- } else {
- currentLineWidth += outerWidth;
- }
+ /**
+ * A action callback
+ * @callback WxAnimation~action
+ * @param {number} value - The value of this tick
+ * @param {Object} preRet - The last tick's return value
+ * @param {Promise} toNext - Hand over next action
+ * @param {function} nextAction - Next action or Null
+ *
+ * @description
+ * Every action is a callback to deal one or more ticks
+ * Several parameters will pass to. The first is value of this tick; Another is an function can hand over the executive authority to next action.
+ */
- prop.padding = padding;
- prop.lineNum = lineNum;
- prop.outerWidth = outerWidth;
- });
- maxLineWidth = maxLineWidth < currentLineWidth ? currentLineWidth : maxLineWidth;
+ _createClass(WxAnimation, [{
+ key: 'pushActions',
+ value: function pushActions(action) {
+ if (!_helper.is.Function(action)) {
+ throw new Error("Should pass to an `action` callback function");
+ }
+ return this.actions.push(action);
+ }
- // Re calculate the height of legend
- if (lineNum > 0) {
- height = fontSize * (lineNum + 1) + lineNum * fontSize / 2;
- outerHeight = height + padding * 2;
- }
+ /**
+ * Reset actions
+ */
- x += (width - maxLineWidth) / 2;
- if (me.position == 'bottom') {
- y = area.ry - outerHeight;
- y = y < area.y ? area.y : y;
- }
- })();
- } else {
- var _ret2 = function () {
- var position = me.position.match(/left/) ? 'left' : 'right';
- var align = me.position.match(/top/) ? 'top' : 'bottom';
- var width = 0,
- lineNum = 0;
- datasets.forEach(function (dataset) {
- var wh = dataset._prop.width;
- width = width < wh ? wh : width;
+ }, {
+ key: 'resetActions',
+ value: function resetActions() {
+ this.actions = [];
+ }
+ }, {
+ key: 'runTick',
+ value: function runTick(value, preRet) {
+ var me = this,
+ caindex = me.currentActionIndex || 0;
+ if (caindex >= me.actions.length) {
+ return;
+ }
- dataset._prop.padding = padding;
- dataset._prop.lineNum = lineNum;
- // not use to set prop.outerWidth
- dataset._prop.outerWidth = null;
- lineNum++;
- });
- outerWidth = width + padding * 2;
- height = fontSize * (lineNum + 1) + lineNum * padding / 2;
- outerHeight = height + padding * 2;
-
- if (align == 'bottom') {
- y = area.ry - outerHeight;
- y = y < area.y ? area.y : y;
- }
- if (position == 'right') {
- x = area.rx - outerWidth;
- x = x < 0 ? 0 : x;
- }
- return {
- v: new _layout.BoxInstance({
- position: position,
- x: x,
- y: y,
- width: width,
- outerWidth: outerWidth,
- height: height,
- outerHeight: outerHeight
- })
- };
- }();
+ var ret = void 0,
+ action = me.actions[caindex],
+ nextAction = caindex + 1 <= me.actions.length ? me.actions[caindex + 1] : null;
+ // try {
+ me.emit('tick', { value: value, preRet: preRet, toNext: me.handOverAction, nextAction: nextAction, parallel: false });
+ ret = action.apply(me, [value, preRet, me.handOverAction, nextAction]);
+ // } catch (e) {
+ // me.error = `${e.name} : ${e.message}`;
+ // // Catch an error.
+ // // Stop all actions
+ // me.started = false;
+ // me.currentActionIndex = 0;
+ // me.tweenzerHandler.stop();
+ // me.emit('error', {error: me.error});
+ // }
+ return ret;
+ }
+ }, {
+ key: 'runTickParallel',
+ value: function runTickParallel(value) {
+ var tickRet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
- if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v;
- }
+ var me = this,
+ actions = me.actions,
+ actionsLen = me.actions.length;
- return new _layout.BoxInstance({
- position: config.position,
- x: x,
- y: y,
- width: width,
- outerWidth: outerWidth,
- height: height,
- outerHeight: outerHeight
+ // try {
+ actions.forEach(function (action, index) {
+ var preRet = tickRet ? tickRet[index] : null,
+ toNext = function toNext() {},
+ nextAction = index + 1 < actionsLen ? actions[index + 1] : null;
+ me.emit('tick', { value: value, preRet: preRet, toNext: toNext, nextAction: nextAction, parallel: true });
+ var ret = action.apply(me, [value, preRet, toNext, nextAction]);
+ tickRet[index] = ret;
});
+ // } catch (e) {
+ // me.error = `${e.name} : ${e.message}`;
+ // // Catch an error.
+ // // Stop all actions
+ // me.started = false;
+ // me.tweenzerHandler.stop();
+ // me.emit('error', {error: me.error});
+ // }
+ return tickRet;
}
}, {
- key: 'draw',
- value: function draw() {
- var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;
- var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
- var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
-
+ key: 'tick',
+ value: function tick(parallel) {
var me = this,
- ctx = me.wxChart.ctx;
- var x = box.x,
- y = box.y,
- width = box.width,
- outerWidth = box.outerWidth,
- height = box.height,
- outerHeight = box.outerHeight;
-
- // Clear the area of legend
-
- me.clear();
-
- // Begin a new sub-context
- ctx.save();
- // Draw all items
- var currentLineNum = -1;
- var currentX = x,
- currentY = y;
- datasets.forEach(function (dataset) {
- var text = dataset.text,
- display = dataset.display,
- fillStyle = dataset.fillStyle,
- fillAlpha = dataset.fillAlpha,
- strokeStyle = dataset.strokeStyle,
- lineCap = dataset.lineCap,
- lineJoin = dataset.lineJoin,
- lineWidth = dataset.lineWidth;
- var _dataset$_prop = dataset._prop,
- width = _dataset$_prop.width,
- fontSize = _dataset$_prop.fontSize,
- textWidth = _dataset$_prop.textWidth,
- padding = _dataset$_prop.padding,
- lineNum = _dataset$_prop.lineNum,
- boxWidth = _dataset$_prop.boxWidth,
- boxHeight = _dataset$_prop.boxHeight,
- outerWidth = _dataset$_prop.outerWidth;
-
- if (!width) {
- // No need to draw
- return;
- }
-
- // Set style
- ctx.textBaseline = 'top';
- ctx.textAlign = 'start';
- ctx.fillStyle = fillStyle;
- ctx.fontSize = fontSize;
- ctx.strokeStyle = strokeStyle;
- ctx.lineCap = lineCap;
- ctx.lineJoin = lineJoin;
- ctx.lineWidth = lineWidth;
-
- if (currentLineNum < lineNum) {
- currentLineNum = lineNum;
- currentX = x + padding;
- currentY = y + lineNum * fontSize * 1.5 + padding;
- }
- var thisX = currentX;
- // draw rect
- if (ctx.lineWidth != 0) {
- ctx.strokeRect(currentX, currentY, boxWidth, boxHeight);
- }
- ctx.globalAlpha = fillAlpha;
- ctx.fillRect(currentX, currentY, boxWidth, boxHeight);
- ctx.globalAlpha = 1;
-
- // draw text
- currentX += boxWidth + fontSize / 2;
- ctx.fillText(text, currentX, currentY);
+ rets = undefined;
+ return function (v) {
+ if (parallel) rets = me.runTickParallel(v, rets);else rets = me.runTick(v, rets);
+ };
+ }
+ /**
+ * Run actions
+ *
+ * @param {Boolean} parallel - parallel to exec all actions
+ */
- // draw hidden strike through
- if (!display) {
- ctx.save();
- // Strike through the text if hidden
- ctx.beginPath();
- ctx.lineWidth = 1;
- ctx.moveTo(currentX, currentY + fontSize / 2);
- ctx.lineTo(currentX + textWidth, currentY + fontSize / 2);
- ctx.stroke();
- ctx.restore();
- }
+ }, {
+ key: 'run',
+ value: function run() {
+ var parallel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- currentX = thisX + outerWidth;
- });
- ctx.restore();
+ var me = this;
+ me.emit('start', { parallel: parallel });
+ me.started = true;
- ctx.draw();
+ me.tweenzerHandler.on('tick', me.tick(parallel)).on('done', function () {
+ me.currentActionIndex = 0;
+ me.started = false;
+ me.emit('done', { parallel: parallel });
+ }).begin();
}
}]);
- return WxLegend;
- }(_base2.default);
+ return WxAnimation;
+ }();
- exports.default = WxLegend;
- }, { "../util/helper": 24, "./base": 15, "./layout": 16 }], 18: [function (require, module, exports) {
+ exports.default = WxAnimation;
+ }, { "../util/helper": 25, "../util/tweezer": 28, "es6-mixins": 5, "ez.js": 6, "mitt": 7 }], 16: [function (require, module, exports) {
/* global module, wx, window: false, document: false */
'use strict';
@@ -6378,33 +6691,17 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
};
}();
- var _get = function get(object, property, receiver) {
- if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {
- var parent = Object.getPrototypeOf(object);if (parent === null) {
- return undefined;
- } else {
- return get(parent, property, receiver);
- }
- } else if ("value" in desc) {
- return desc.value;
- } else {
- var getter = desc.get;if (getter === undefined) {
- return undefined;
- }return getter.call(receiver);
- }
- };
-
var _helper = require('../util/helper');
- var _wxCanvas = require('../util/wxCanvas');
+ var _layout = require('./layout');
- var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
+ var _wxChart = require('../charts/wxChart');
- var _layout = require('./layout');
+ var _wxChart2 = _interopRequireDefault(_wxChart);
- var _base = require('./base');
+ var _wxCanvas = require('../util/wxCanvas');
- var _base2 = _interopRequireDefault(_base);
+ var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
@@ -6416,607 +6713,232 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}
}
- function _possibleConstructorReturn(self, call) {
- if (!self) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }return call && ((typeof call === "undefined" ? "undefined" : _typeof2(call)) === "object" || typeof call === "function") ? call : self;
- }
+ // The basic component
+ var WxBaseComponent = function () {
+ function WxBaseComponent(wxChart, config) {
+ _classCallCheck(this, WxBaseComponent);
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof2(superClass)));
- }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
- }
+ var me = this;
- // Scale default config
- var WX_SCALE_DEFAULT_CONFIG = {
- display: true,
- position: 'top', // left, bottom, right, top
- extendLeft: 0,
- extendTop: 0,
- title: undefined,
- titleFontSize: 12,
- titleFontColor: '#4c4d4d',
- //'lineSpace' = fontSize * 0.5'
- color: '#000000', // Line color
- lineWidth: 1,
+ if (!wxChart || !wxChart instanceof _wxChart2.default) {
+ throw new Error('Should be an WxChart instance');
+ }
+ me.wxChart = wxChart;
- gridLines: {
- display: true,
- color: '#e0e0e0', // Line color
- lineWidth: 1
- },
+ // scale set options
+ this._datasets = [];
- ticks: {
- display: true,
- autoSkip: true,
- lineWidth: 1,
- fontColor: '#000000',
- fontSize: 11,
- minRotation: 0,
- maxRotation: 90
-
- //maxTicksLimit: null,
+ return me;
}
- };
-
- var WX_SCALE_DEFAULT_ITEM_CONFIG = {
- display: true,
- // text: '',
- lineWidth: 1,
- fontColor: '#000000'
- };
- // The WeinXin APP scale
+ /**
+ * Initialize datasets and options
+ * @param {Object[]} datasets
+ * @param {Object} [defaultOptions]
+ * @returns {Array|*}
+ */
- var WxScale = function (_WxBaseComponent) {
- _inherits(WxScale, _WxBaseComponent);
+ _createClass(WxBaseComponent, [{
+ key: 'init',
+ value: function init(datasets) {
+ var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- function WxScale(wxChart, config) {
- _classCallCheck(this, WxScale);
+ var me = this;
- var _this = _possibleConstructorReturn(this, (WxScale.__proto__ || Object.getPrototypeOf(WxScale)).call(this, wxChart, config));
+ if (_helper.is.Undefined(datasets) || _helper.is.Null(datasets)) {
+ datasets = me.datasets;
+ if (!datasets) {
+ throw new Error('Datasets is null');
+ }
+ }
- _this.config = (0, _helper.extend)(true, {}, WX_SCALE_DEFAULT_CONFIG, config);
- return _this;
- }
+ if (!_helper.is.Array(datasets)) {
+ datasets = [datasets];
+ }
- /**
- * Get visible tick's text data
- */
+ datasets = datasets.map(function (dataset) {
+ return (0, _helper.extend)({}, defaultOptions, dataset);
+ });
- _createClass(WxScale, [{
- key: 'getTicksText',
- value: function getTicksText(tick) {
- if (!!tick && !!tick.text) {
- return tick.format ? tick.format.call(tick, tick.text, tick) : tick.text;
- }
- return null;
+ me._datasets = datasets;
+ me._visDatasets = null;
+ return me._datasets;
}
/**
- * Get lineSpace
- * @returns {*|number}
+ * Update data and re-draw
+ * @param {Object[]} datasets
+ * @param {BoxInstance} [area]
+ * @param {Object} [config]
*/
}, {
- key: 'longestText',
-
- /**
- * Get longest text
- */
- value: function longestText() {
- var ctx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.wxChart.ctx;
- var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;
+ key: 'update',
+ value: function update(datasets, area) {
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
var me = this;
- var maxTextLen = 0;
- datasets.forEach(function (dataset) {
- if (!!dataset.display) {
- var textWidth = void 0;
- if (dataset.textWidth) {
- textWidth = dataset.textWidth;
- } else {
- var text = me.getTicksText(dataset);
- textWidth = ctx.measureText(text).width;
- dataset.textWidth = textWidth;
- }
- maxTextLen = maxTextLen < textWidth ? textWidth : maxTextLen;
- }
- });
- return maxTextLen;
- }
- }, {
- key: 'calculateFixPadding',
- value: function calculateFixPadding(datasets, config) {
- var me = this,
- ctx = me.wxChart.ctx;
- if (config.fixPadding) {
- return config.fixPadding;
+
+ me.clear();
+ if (!datasets) {
+ return;
}
- if (me.isHorizontal()) {
- var visTicks = me.visDatasets;
- var firstTickText = me.getTicksText(visTicks[0]),
- lastTickText = me.getTicksText(visTicks[visTicks.length - 1]);
- return Math.max(ctx.measureText(firstTickText).width, ctx.measureText(lastTickText).width);
+ datasets = me.init(datasets);
+
+ if (area && area instanceof _layout.BoxInstance) {
+ area = me.box = me.calculateBox(area, datasets, config);
+ } else if (me.box) {
+ area = me.box;
} else {
- return ctx.fontSize;
+ return;
}
- }
- }, {
- key: 'init',
- value: function init(datasets) {
- var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : WX_SCALE_DEFAULT_ITEM_CONFIG;
- var me = this;
- var config = me.config;
+ if (me.isVisiable()) {
+ me.draw(datasets, area, config);
+ }
+ }
- datasets = _get(WxScale.prototype.__proto__ || Object.getPrototypeOf(WxScale.prototype), 'init', this).call(this, datasets, defaultOptions);
- me.visDatasets = null;
- me._datasets = datasets;
- me.fixPadding = me.calculateFixPadding(datasets, config);
+ /**
+ * Calculate occupied space
+ * @param {Object[]} [datasets] - datasets
+ * @param {BoxInstance} [area] - Current box area
+ * @param {Object} [config]
+ * @returns {BoxInstance}
+ */
- return datasets;
- }
}, {
key: 'calculateBox',
value: function calculateBox(area) {
var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;
var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
- var me = this,
- ctx = me.wxChart.ctx;
- var fontSize = ctx.fontSize;
- var tickWidth = me.calculateTickWidth(datasets, area, config);
- var x = void 0,
- y = void 0,
- minWidth = void 0,
- minHeight = void 0,
- maxWidth = void 0,
- maxHeight = void 0;
- var minFontRotation = (0, _helper.toRadians)(config.ticks.minRotation || 0),
- maxFontRotation = (0, _helper.toRadians)(config.ticks.maxRotation || 90),
- fontRadians = minFontRotation;
- var lineSpace = me.lineSpace;
- var lineWidth = 1;
+ return area;
+ }
- var longestText = me.longestText();
- if (me.isHorizontal()) {
- if (longestText > tickWidth) {
- // Ticket's width not satisfied with the longest text's width
- if (tickWidth <= ctx.fontSize) {
- fontRadians = maxFontRotation;
- } else {
- fontRadians = Math.acos(tickWidth / longestText);
- minHeight = Math.sin(fontRadians) * longestText + lineWidth + lineSpace + fontSize / 2;
- if (minHeight > area.height) {
- minHeight = area.height;
- fontRadians = Math.asin((minHeight - lineWidth - lineSpace - fontSize / 2) / longestText);
- } else if (fontRadians > maxFontRotation) {
- fontRadians = maxFontRotation;
- minHeight = Math.sin(fontRadians) * longestText + lineWidth + lineSpace + fontSize / 2;
- }
- }
- } else {
- minHeight = fontSize * 1.5 + lineWidth + lineSpace;
- }
- minWidth = area.width;
- maxWidth = area.outerWidth;
- maxHeight = minHeight;
- } else {
- var titleWidth = 0;
- if (config.title) {
- titleWidth = ctx.measureText(config.title, config.titleFontSize).width - lineWidth - lineSpace - fontSize / 2;
- }
- minWidth = longestText + lineWidth + lineSpace + fontSize / 2;
- minWidth = minWidth > titleWidth ? minWidth : titleWidth;
- if (minWidth > area.width) {
- minWidth = area.width;
- fontRadians = Math.acos((minWidth - lineWidth - lineSpace - fontSize / 2) / longestText);
- fontRadians = fontRadians > maxFontRotation ? maxFontRotation : fontRadians;
- }
- minHeight = area.height;
- maxWidth = minWidth;
- maxHeight = area.outerHeight;
+ /**
+ * Set an occupied space for component
+ * @param {BoxInstance} box - New box
+ * @param {Boolean} [redraw=true] - Re-draw the component
+ */
+
+ }, {
+ key: 'setBox',
+ value: function setBox(box) {
+ var redraw = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ var me = this;
+ if (redraw) {
+ me.clear();
}
- switch (me.position) {
- case 'left':
- case 'top':
- x = area.x;
- y = area.y;
- break;
- case 'right':
- x = area.x + area.width - maxWidth;
- y = area.y;
- break;
- case 'bottom':
- x = area.x;
- y = area.y + area.height - maxHeight;
- break;
+ if (box && box instanceof _layout.BoxInstance) {
+ me.box = box;
+ }
+ if (redraw && me.isVisiable()) {
+ me.draw();
}
-
- me.fontRadians = fontRadians;
- return new _layout.BoxInstance(me.position, x, y, minWidth, minHeight, maxWidth, maxHeight);
}
- }, {
- key: 'calculateTickWidth',
/**
- * Calculate ticks' separation distance
- * @param {BoxInstance} [area=this.box]
- *
+ * Draw the component
*
- * Horizontal Scale:
- * x------------------------------------.--x(first tick)--------------------------.--x(last tick)--margin--x
- * x------------------------------------.--x(first tick)-----x(last tick)--margin-.--x--titleWidth+padding--
- * |---extendLeft---|(box.x)---margin---|-----------area.width----------------------|---------margin------|
- * |----------------------------area box-------------------------------------------------|
- * Vertical Scale:
- * x----------------------------------------.--x--------(first tick)----------.--x(last tick)-x
- * x------------------titleHeight+padding---.--x---margin-x-------(first tick).--x(last tick)-x
- * |---extendTop----|(box.y)---margin-------|-----------area.height--------------|---margin---|
- * |----------------------------area box-------------------------------------|
+ * @param {Object[]} [datasets] - datasets
+ * @param {BoxInstance} [box] - Current box area
+ * @param {Object} [config]
*/
- value: function calculateTickWidth() {
+
+ }, {
+ key: 'draw',
+ value: function draw() {
var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;
- var area = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
+ var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
+ }
+ /**
+ * Clear canvas in component's box
+ */
- var me = this,
- ticketWidth = void 0;
- var visTicks = me.visDatasets;
- var defaultLineWidth = config.ticks.lineWidth;
- // total line width
- var totalLineWidth = _helper.sum.apply(null, visTicks.map(function (v) {
- return v.lineWidth || defaultLineWidth;
- }));
- var fixPadding = me.fixPadding;
-
- if (me.isHorizontal()) {
- var innerWidth = area.width,
- marginLR = area.marginLR;
- var titleWidth = me.calculateTitleWidth();
- var extendLeft = me.config.extendLeft;
- if (marginLR !== 0) {
- totalLineWidth += defaultLineWidth * 2;
- } else if (extendLeft !== 0) {
- totalLineWidth += defaultLineWidth;
- }
- ticketWidth = (innerWidth - titleWidth - totalLineWidth - fixPadding) / (visTicks.length - 1);
- } else {
- var innerHeight = area.height,
- marginTB = area.marginTB;
- var titleHeight = me.calculateTitleWidth();
- var extendTop = config.extendTop;
- if (marginTB !== 0) {
- totalLineWidth += defaultLineWidth * 2;
- } else if (extendTop !== 0) {
- totalLineWidth += defaultLineWidth;
- }
- ticketWidth = (innerHeight - titleHeight - totalLineWidth - fixPadding) / (visTicks.length - 1);
+ }, {
+ key: 'clear',
+ value: function clear() {
+ var me = this;
+ if (me.box) {
+ me.wxChart.ctx.clearRect(me.box.x, me.box.y, me.box.outerWidth, me.box.outerHeight);
+ me.wxChart.ctx.draw();
}
- return ticketWidth;
}
}, {
- key: 'calculateTitleWidth',
- value: function calculateTitleWidth() {
- var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config;
-
- var titleWidth = void 0,
- me = this,
- ctx = me.wxChart.ctx;
- if (me.isHorizontal()) {
- titleWidth = config.title ? ctx.measureText(config.title, config.titleFontSize).width : 0;
- } else {
- titleWidth = config.title ? config.titleFontSize : 0;
- }
- return titleWidth;
+ key: 'isVisiable',
+ value: function isVisiable() {
+ return !!this.config.display;
}
}, {
- key: '_getTicksLineWidthOffset',
- value: function _getTicksLineWidthOffset(index, visTicks) {
- var offset = 0,
- me = this;
- if (!visTicks) {
- visTicks = me.visDatasets;
- }
- var defaultLineWidth = this.config.ticks.lineWidth;
- visTicks.map(function (tick, i) {
- if (index >= i) {
- offset += tick.lineWidth || defaultLineWidth;
- }
- });
- return offset;
+ key: 'isHorizontal',
+ value: function isHorizontal() {
+ return this.position == 'top' || this.position == 'bottom';
+ }
+ }, {
+ key: 'datasets',
+ get: function get() {
+ return this._datasets;
+ },
+ set: function set(datasets) {
+ return this.update(datasets);
}
/**
- * Get position of ticket
- * @param {number} index - Begin from zero. If set -1, the function will return the actual x,y included extendLeft or extendTop
- * @param {number} [ticketWidth=this.ticketWidth]
- * @param {BoxInstance} [area=this.box]
+ * Get visible ticks
*/
}, {
- key: 'getTicksPosition',
- value: function getTicksPosition(index, ticketWidth) {
- var area = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.box;
-
- var me = this,
- ctx = me.wxChart.ctx;
- var fixPadding = me.fixPadding;
- if (!ticketWidth) {
- ticketWidth = me.calculateTickWidth();
- }
- var visTicks = me.visDatasets;
-
- var baseX = void 0,
- baseY = void 0;
- if (me.isHorizontal()) {
- baseX = index === -1 ? area.x - me.config.extendLeft + fixPadding / 2 + (me.config.extendLeft ? me.config.ticks.lineWidth : 0) : area.lx + me._getTicksLineWidthOffset(index, visTicks) + ticketWidth * index + fixPadding / 2;
- baseY = me.position === 'top' ? area.ry - me.lineSpace : area.ly + me.lineSpace;
- } else {
- baseY = index === -1 ? area.y - me.config.extendTop + fixPadding / 2 + (me.config.extendTop ? me.config.ticks.lineWidth : 0) : area.ly + me.calculateTitleWidth() + me._getTicksLineWidthOffset(index, visTicks) + ticketWidth * index + fixPadding / 2;
- baseX = me.position === 'left' ? area.rx - me.lineSpace : area.lx + me.lineSpace;
- }
- return { x: baseX, y: baseY };
+ key: 'visDatasets',
+ get: function get() {
+ return this._visDatasets ? this._visDatasets : this._visDatasets = this.datasets.filter(function (v) {
+ return !!v.display;
+ });
}
+ // Can not reset
+
+ , set: function set(val) {}
}, {
- key: '_initDrawATickText',
- value: function _initDrawATickText() {
- var me = this,
- ctx = me.wxChart.ctx;
- switch (me.position) {
- case 'left':
- ctx.textAlign = 'end';
- ctx.textBaseline = 'middle';
- break;
- case 'right':
- ctx.textAlign = 'start';
- ctx.textBaseline = 'middle';
- break;
- case 'top':
- ctx.textAlign = 'center';
- ctx.textBaseline = 'alphabetic';
- break;
- case 'bottom':
- ctx.textAlign = 'center';
- ctx.textBaseline = 'top';
- break;
- }
+ key: 'position',
+ get: function get() {
+ return this.config.position;
+ },
+ set: function set(value) {
+ this.config.position = value;
+ return this.update();
}
- }, {
- key: '_drawATickLine',
- value: function _drawATickLine(x, y, fontSize) {
- var tick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
+ }]);
- var me = this,
- ctx = me.wxChart.ctx;
- var lineSpace = me.lineSpace;
- var sx = x;
- var sy = y;
- switch (me.position) {
- case 'left':
- sx += lineSpace;
- break;
- case 'right':
- sx -= lineSpace;
- break;
- case 'top':
- sy += lineSpace;
- break;
- case 'bottom':
- sy -= lineSpace;
- break;
- }
- ctx.beginPath();
- ctx.moveTo(sx, sy);
- ctx.lineTo(x, y);
- ctx.stroke();
+ return WxBaseComponent;
+ }();
- // Draw text
- var text = void 0;
- if (tick && tick.text && _helper.is.String(tick.text)) {
- ctx.save();
- me._initDrawATickText();
- text = tick.format ? tick.format.call(me, tick.text, tick, x, y, me.fontRadians) : tick.text;
- var textWidth = tick.textWidth ? tick.textWidth : ctx.measureText(text).width;
- switch (me.position) {
- case 'left':
- ctx.translate(x - fontSize / 2, y + Math.sin(me.fontRadians) * textWidth / 2);
- ctx.rotate(me.fontRadians);
- //ctx.fillText(text, x - ctx.fontSize/2, y);
- break;
- case 'right':
- ctx.translate(x + fontSize / 2, y + Math.sin(me.fontRadians) * textWidth / 2);
- ctx.rotate(-me.fontRadians);
- // ctx.fillText(text, x + ctx.fontSize/2, y);
- break;
- case 'top':
- ctx.translate(x, y - fontSize / 2);
- ctx.rotate(-me.fontRadians);
- break;
- case 'bottom':
- ctx.translate(x, y + fontSize / 2);
- ctx.rotate(me.fontRadians);
- break;
- }
- ctx.fillText(text, 0, 0);
+ exports.default = WxBaseComponent;
+ }, { "../charts/wxChart": 14, "../util/helper": 25, "../util/wxCanvas": 29, "./layout": 17 }], 17: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
+ 'use strict';
- ctx.restore();
- }
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.BoxInstance = undefined;
+
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
- }, {
- key: 'draw',
- value: function draw() {
- var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;
- var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
- var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
- var me = this,
- ctx = me.wxChart.ctx;
- var fontSize = ctx.fontSize;
- var fixPadding = me.fixPadding,
- tickWidth = me.calculateTickWidth(datasets, box, config);
- var tickConfig = config.ticks;
- var x = box.x,
- y = box.y,
- width = box.width,
- outerWidth = box.outerWidth,
- height = box.height,
- outerHeight = box.outerHeight;
+ var _base = require('./base');
- var visTicks = me.visDatasets;
-
- var _me$getTicksPosition = me.getTicksPosition(-1, tickWidth),
- currX = _me$getTicksPosition.x,
- currY = _me$getTicksPosition.y,
- baseX = _me$getTicksPosition.x,
- baseY = _me$getTicksPosition.y;
-
- ctx.save();
- ctx.fillStyle = tickConfig.fontColor;
- ctx.fontSize = tickConfig.fontSize;
- ctx.lineWidth = tickConfig.lineWidth;
- var titleWidth = me.calculateTitleWidth();
-
- if (me.isHorizontal()) {
- // Draw the first point
- if (me.box.marginLR || config.extendLeft) {
- currX += tickConfig.lineWidth;
- me._drawATickLine(currX, currY, fontSize);
- }
- // Move to first tick
- currX = me.box.lx + fixPadding / 2;
- // Draw ticks
- visTicks.map(function (tick) {
- currX += tick.lineWidth;
- ctx.fillStyle = tick.fontColor;
- ctx.lineWidth = tick.lineWidth;
- ctx.fontSize = tick.fontSize || ctx.fontSize;
- me._drawATickLine(currX, currY, fontSize, tick);
- currX += tickWidth;
- });
- // Draw the last point
- currX = me.box.ex - fixPadding / 2 - titleWidth;
- if (me.box.marginLR) {
- me._drawATickLine(currX, currY, fontSize);
- }
-
- ctx.fillStyle = tickConfig.fontColor;
- ctx.lineWidth = config.lineWidth;
- // draw axis line
- ctx.beginPath();
- ctx.moveTo(baseX, currY);
- ctx.lineTo(currX, currY);
- ctx.stroke();
-
- if (config.title) {
- ctx.save();
- currX += fontSize / 2;
- ctx.fontSize = config.titleFontSize;
- ctx.textAlign = 'start';
- ctx.textBaseline = 'bottom';
- ctx.fillStyle = config.titleFontColor;
- ctx.fillText(config.title, currX, currY);
- ctx.restore();
- }
- } else {
- if (config.title) {
- ctx.save();
- ctx.fontSize = config.titleFontSize;
- ctx.textAlign = 'center';
- ctx.textBaseline = 'bottom';
- ctx.fillStyle = config.titleFontColor;
- ctx.fillText(config.title, currX, currY);
- ctx.restore();
- }
-
- // Draw the first point
- if (me.box.marginTB || config.extendTop) {
- currY += titleWidth;
- me._drawATickLine(currX, currY, fontSize);
- }
- currY = me.box.ly + fixPadding / 2 + titleWidth;
- // Draw ticks
- visTicks.map(function (tick) {
- currY += tick.lineWidth;
- ctx.fillStyle = tick.fontColor;
- ctx.lineWidth = tick.lineWidth;
- ctx.fontSize = tick.fontSize || ctx.fontSize;
- me._drawATickLine(currX, currY, fontSize, tick);
- currY += tickWidth;
- });
- // Draw the last point
- currY = me.box.ey - fixPadding / 2;
- if (me.box.marginTB) {
- me._drawATickLine(currX, currY, fontSize);
- }
-
- ctx.fillStyle = tickConfig.fontColor;
- ctx.lineWidth = config.lineWidth;
- // draw axis line
- ctx.beginPath();
- ctx.moveTo(currX, baseY + titleWidth);
- ctx.lineTo(currX, currY);
- ctx.stroke();
- }
- ctx.draw();
- ctx.restore();
- }
-
- // Empty interface
- /**
- * Get one point by a value
- * @param {number} index - The index of category
- */
-
- }, {
- key: 'getPoint',
- value: function getPoint(index) {
- return null;
- }
- }, {
- key: 'lineSpace',
- get: function get() {
- var me = this;
- if (me._lineSpace) {
- return me._lineSpace;
- }
- me._lineSpace = this.config.lineSpace || this.wxChart.ctx.fontSize * 0.5;
- return me._lineSpace;
- }
- }]);
-
- return WxScale;
- }(_base2.default);
-
- exports.default = WxScale;
- }, { "../util/helper": 24, "../util/wxCanvas": 29, "./base": 15, "./layout": 16 }], 19: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
-
- var _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
- }
- }return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
- };
- }();
-
- var _base = require('./base');
-
- var _base2 = _interopRequireDefault(_base);
+ var _base2 = _interopRequireDefault(_base);
var _helper = require('../util/helper');
- var _layout = require('./layout');
-
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
@@ -7027,145 +6949,278 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}
}
- function _possibleConstructorReturn(self, call) {
- if (!self) {
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
- }return call && ((typeof call === "undefined" ? "undefined" : _typeof2(call)) === "object" || typeof call === "function") ? call : self;
- }
+ /**
+ * A box model description
+ * @typedef {Object} BoxInstance
+ * @property {number} x - The x point.
+ * @property {number} y - The y point.
+ * @property {number} width - Inner width (context only, not calculate padding and margin)
+ * @property {number} height - Inner height (context only, not calculate padding and margin)
+ * @property {number} outerWidth - Outer width
+ * @property {number} outerHeight - Outer height
+ *
+ * @description
+ * (x,y) -------------------------- (ex, y)
+ * | |
+ * | (lx,ly)-------------(rx,ly) |
+ * | | | |
+ * | | | |
+ * | (lx,ry)-------------(rx,ry) |
+ * | |
+ * (x,ey) ------------------------- (ex, ey)
+ */
+ var BoxInstance = exports.BoxInstance = function () {
+ function BoxInstance(position, x, y, width, height, outerWidth, outerHeight) {
+ _classCallCheck(this, BoxInstance);
- function _inherits(subClass, superClass) {
- if (typeof superClass !== "function" && superClass !== null) {
- throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof2(superClass)));
- }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
- }
+ var me = this;
+ if (_helper.is.PureObject(position)) {
+ var opt = position;
- // Legend default config
- var WX_TITLE_DEFAULT_CONFIG = {
- display: true,
- position: 'top', // top, bottom
- fullWidth: true, // if the fullWidth is false, the 'width' property should be existed.
- fontSize: 16,
- fontColor: '#666666',
- padding: 10
- };
+ position = opt.position;
+ x = opt.x;
+ y = opt.y;
+ width = opt.width;
+ height = opt.height;
- var WxTitle = function (_WxBaseComponent) {
- _inherits(WxTitle, _WxBaseComponent);
+ var padding = opt.padding,
+ margin = opt.margin;
+ if (_helper.is.Number(padding) && _helper.is.Number(margin)) {
+ outerWidth = width + padding * 2 + margin * 2;
+ outerHeight = height + padding * 2 + margin * 2;
+ } else {
+ outerWidth = opt.outerWidth;
+ outerHeight = opt.outerHeight;
+ }
+ }
- function WxTitle(wxChart, config) {
- _classCallCheck(this, WxTitle);
+ me.position = position;
+ me.width = width;
+ me.height = height;
+ me.outerWidth = outerWidth;
+ me.outerHeight = outerHeight;
- var _this = _possibleConstructorReturn(this, (WxTitle.__proto__ || Object.getPrototypeOf(WxTitle)).call(this, wxChart, config));
+ Object.defineProperty(this, 'x', {
+ get: function get() {
+ return x;
+ },
+ set: function set(value) {
+ me.width += x - value;
+ me.outerWidth += x - value;
+ x = value;
+ }
+ });
- _this.config = (0, _helper.extend)(true, {}, WX_TITLE_DEFAULT_CONFIG, config);
- return _this;
+ Object.defineProperty(this, 'y', {
+ get: function get() {
+ return y;
+ },
+ set: function set(value) {
+ me.height += y - value;
+ me.outerHeight += y - value;
+ y = value;
+ }
+ });
}
/**
- * Update data and re-draw
- * @param {Object[]} text
- * @param {Object} [defaultOptions]
- * @returns {string} text
+ * The x,y in right-bottom
*/
- _createClass(WxTitle, [{
- key: 'init',
- value: function init(text) {
- var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ _createClass(BoxInstance, [{
+ key: 'clone',
+ /**
+ * Clone this box and return an new Instance
+ * @returns {BoxInstance}
+ */
+ value: function clone() {
var me = this;
- var config = me.config;
+ return new BoxInstance(me.position, me.x, me.y, me.width, me.height, me.outerWidth, me.outerHeight);
+ }
- text = text ? text : config.text;
- if (_helper.is.Undefined(text) || _helper.is.Null(text)) {
- throw new Error('Text is null');
- }
+ /**
+ * Check whether intersect with other BoxInstance
+ */
- me._datasets = text;
- return text;
- }
}, {
- key: 'calculateBox',
- value: function calculateBox(area) {
- var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.config.text;
- var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
-
+ key: 'isIntersect',
+ value: function isIntersect(boxInstance) {
var me = this;
- var wxChart = me.wxChart,
- ctx = wxChart.ctx,
- fontSize = config.fontSize || 16;
- var x = area.x,
- y = area.y;
- var padding = config.padding || 10;
-
- var width = !!config.fullWidth ? area.width - padding * 2 : config.width,
- outerWidth = !!config.fullWidth ? area.width : config.width,
- height = fontSize,
- outerHeight = height + padding * 2;
+ return !(me.ex < boxInstance.x || me.x > boxInstance.ex || me.ey < boxInstance.y || me.y < boxInstance.ey);
+ }
+ }, {
+ key: 'toObject',
+ value: function toObject() {
+ return {
+ position: this.position,
+ x: this.x,
+ y: this.y,
+ ex: this.ex,
+ ey: this.ey,
+ lx: this.lx,
+ ly: this.ly,
+ rx: this.rx,
+ ry: this.ry,
+ width: this.width,
+ height: this.height,
+ outerHeight: this.outerHeight,
+ outerWidth: this.outerWidth
+ };
+ }
+ }, {
+ key: 'ex',
+ get: function get() {
+ return this.x + this.outerWidth;
+ }
+ }, {
+ key: 'ey',
+ get: function get() {
+ return this.y + this.outerHeight;
+ }
+ /**
+ * The x,y in content
+ */
- if (config.position == 'bottom') {
- y = area.ry - outerHeight;
- y = y < area.y ? area.y : y;
+ }, {
+ key: 'lx',
+ get: function get() {
+ return this.x + this.marginLR;
+ }
+ }, {
+ key: 'ly',
+ get: function get() {
+ return this.y + this.marginTB;
+ }
+ }, {
+ key: 'rx',
+ get: function get() {
+ return this.x + this.width + this.marginLR;
+ }
+ }, {
+ key: 'ry',
+ get: function get() {
+ return this.y + this.height + this.marginTB;
+ }
+ }, {
+ key: 'marginLR',
+ get: function get() {
+ return (this.outerWidth - this.width) / 2;
+ },
+ set: function set(value) {
+ if (_helper.is.Number(value)) {
+ this.width -= value * 2;
}
-
- return new _layout.BoxInstance({
- position: config.position,
- x: x,
- y: y,
- width: width,
- height: height,
- outerWidth: outerWidth,
- outerHeight: outerHeight
- });
}
}, {
- key: 'draw',
- value: function draw() {
- var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config.text;
- var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
- var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
+ key: 'marginTB',
+ get: function get() {
+ return (this.outerHeight - this.height) / 2;
+ },
+ set: function set(value) {
+ if (_helper.is.Number(value)) {
+ this.height -= value * 2;
+ }
+ }
+ }]);
- var me = this,
- ctx = me.wxChart.ctx;
- var x = box.x,
- y = box.y,
- width = box.width,
- outerWidth = box.outerWidth,
- height = box.height,
- outerHeight = box.outerHeight;
+ return BoxInstance;
+ }();
+ /**
+ * @class WxLayout
+ * Find the best box area of items
+ */
- if (_helper.is.Undefined(text) || _helper.is.Null(text)) {
- throw new Error('Text is null');
- }
+ var WxLayout = function () {
+ function WxLayout(wxChart) {
+ _classCallCheck(this, WxLayout);
- var fontColor = config.fontColor,
- fontSize = config.fontSize;
- // Clear the area of legend
+ var me = this;
- me.clear();
- // Begin a new sub-context
- ctx.save();
+ if (!wxChart || !wxChart instanceof _base2.default) {
+ throw new Error('Should be an WxChart instance');
+ }
+ me.wxChart = wxChart;
+ //me.initBox = wx.wxChart.innerBox.clone();
+ me._boxs = [];
+ }
- ctx.textBaseline = 'top';
- ctx.textAlign = 'start';
- ctx.fillStyle = fontColor;
- ctx.fontSize = fontSize;
+ /**
+ * Add an boxInstance
+ * @param {BoxInstance} boxInstance
+ * @returns {number} The box id
+ */
- var textLen = ctx.measureText(text).width;
- x += (width - textLen) / 2;
- ctx.fillText(text, x, y);
+ _createClass(WxLayout, [{
+ key: 'addBox',
+ value: function addBox(boxInstance) {
+ var me = this;
+ if (!boxInstance instanceof BoxInstance) {
+ throw new Error('Please add an BoxInstance Object');
+ }
+ return parseInt(me._boxs.push(boxInstance)) - 1;
+ }
- ctx.restore();
- ctx.draw();
+ /**
+ * Remove an boxInstance
+ * @param {(BoxInstance|number)} boxId - The box id
+ */
+
+ }, {
+ key: 'removeBox',
+ value: function removeBox(boxId) {
+ var me = this;
+ if (_helper.is.Number(boxId)) {
+ me._boxs.splice(boxId, 1);
+ } else if (boxId instanceof BoxInstance) {
+ me._boxs.splice(me._boxs.indexOf(boxId), 1);
+ }
+ }
+ }, {
+ key: 'removeAllBox',
+ value: function removeAllBox() {
+ this._boxs = [];
+ }
+ }, {
+ key: 'adjustBox',
+ value: function adjustBox() {
+ var me = this;
+ var box = me.wxChart.innerBox.clone();
+ me._boxs.forEach(function (boxInstance) {
+ var position = boxInstance.position,
+ x = boxInstance.x,
+ y = boxInstance.y,
+ height = boxInstance.height,
+ width = boxInstance.width,
+ outerWidth = boxInstance.outerWidth,
+ outerHeight = boxInstance.outerHeight;
+
+ switch (position) {
+ case 'top':
+ box.y += outerHeight;
+ break;
+ case 'bottom':
+ box.outerHeight -= outerHeight;
+ box.height -= outerHeight;
+ break;
+ case 'left':
+ box.x += outerWidth;
+ break;
+ case 'right':
+ box.outerWidth -= outerWidth;
+ box.width -= outerWidth;
+ break;
+ }
+ });
+ return box;
}
}]);
- return WxTitle;
- }(_base2.default);
+ return WxLayout;
+ }();
- exports.default = WxTitle;
- ;
- }, { "../util/helper": 24, "./base": 15, "./layout": 16 }], 20: [function (require, module, exports) {
+ exports.default = WxLayout;
+ }, { "../util/helper": 25, "./base": 16 }], 18: [function (require, module, exports) {
/* global module, wx, window: false, document: false */
'use strict';
@@ -7173,6 +7228,12 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
value: true
});
+ var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
+ return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
+ } : function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
+ };
+
var _createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
@@ -7183,12 +7244,30 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
};
}();
- var _scale = require('../core/scale');
+ var _get = function get(object, property, receiver) {
+ if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {
+ var parent = Object.getPrototypeOf(object);if (parent === null) {
+ return undefined;
+ } else {
+ return get(parent, property, receiver);
+ }
+ } else if ("value" in desc) {
+ return desc.value;
+ } else {
+ var getter = desc.get;if (getter === undefined) {
+ return undefined;
+ }return getter.call(receiver);
+ }
+ };
- var _scale2 = _interopRequireDefault(_scale);
+ var _base = require('./base');
+
+ var _base2 = _interopRequireDefault(_base);
var _helper = require('../util/helper');
+ var _layout = require('./layout');
+
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
@@ -7211,195 +7290,324 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
- /**
- * @class Liner scale
- */
- var WxCategoryScale = function (_WxScale) {
- _inherits(WxCategoryScale, _WxScale);
-
- function WxCategoryScale() {
- _classCallCheck(this, WxCategoryScale);
-
- return _possibleConstructorReturn(this, (WxCategoryScale.__proto__ || Object.getPrototypeOf(WxCategoryScale)).apply(this, arguments));
+ // Legend default config
+ var WX_LEGEND_DEFAULT_CONFIG = {
+ display: true,
+ /**
+ * position can set to :top, bottom, left(same as left bottom), right(same as right bottom), left top, left bottom, right top, right bottom
+ */
+ position: 'top',
+ fullWidth: true, // if the fullWidth is false, the 'width' property should be existed.
+ labels: {
+ boxWidth: 30,
+ fontSize: 11,
+ padding: 10 // Padding width between legend items
}
+ };
- _createClass(WxCategoryScale, [{
- key: 'buildTicks',
-
- /**
- * Build a ticks array by minIndex or maxIndex
- * Use to generator category scale ticks
- *
- * @param {Array} legends - The legend config of chart
- * @param {number} maxIndex - Max index
- * @param {number} minIndex - Min index
- *
- * @return {Array} The ticks data
- */
- value: function buildTicks(legends, maxIndex, minIndex) {
- if (!legends || !_helper.is.Array(legends)) {
- return legends;
- }
- minIndex = minIndex || 0;
- maxIndex = maxIndex || legends.length;
-
- return legends.slice(minIndex, maxIndex);
- }
- }, {
- key: 'buildDatasets',
- value: function buildDatasets(legends, maxIndex, minIndex) {
- return this.buildTicks.apply(this, arguments);
- }
-
- /**
- * Get one point by a value
- * @param {number} index - The index of category
- */
-
- }, {
- key: 'getPoint',
- value: function getPoint(index) {
- return this.getTicksPosition(index);
- }
- }]);
-
- return WxCategoryScale;
- }(_scale2.default);
+ //
+ // The datasets is an empty array at the first time
+ // When you set 'data' attribute, the legend items will draw on Canvas
+ // Format
+ // {
+ // text: 'Displayed Text String',
+ // fillAlpha: 1, // Global fill alpha
+ // fillStyle: 'Color', // Fill style of the legend box
+ // display: Boolean, // If true, this item represents a hidden datasets. Label will be rendered with a strike-through effect,
+ // strokeStyle: 'Color'
+ // lineCap: String,
+ // lineJoin: String,
+ // lineWidth: Number
+ // }
+ var WX_LEGEND_DEFAULT_ITEM_CONFIG = {
+ 'lineWidth': 1,
+ 'display': true
+ };
- exports.default = WxCategoryScale;
- }, { "../core/scale": 18, "../util/helper": 24 }], 21: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
+ var WxLegend = function (_WxBaseComponent) {
+ _inherits(WxLegend, _WxBaseComponent);
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ function WxLegend(wxChart, config) {
+ _classCallCheck(this, WxLegend);
- var _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
- }
- }return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
- };
- }();
+ var _this = _possibleConstructorReturn(this, (WxLegend.__proto__ || Object.getPrototypeOf(WxLegend)).call(this, wxChart, config));
- var _scale = require('../core/scale');
+ _this.config = (0, _helper.extend)(true, {}, WX_LEGEND_DEFAULT_CONFIG, config);
+ return _this;
+ }
- var _scale2 = _interopRequireDefault(_scale);
+ _createClass(WxLegend, [{
+ key: 'init',
+ value: function init(datasets) {
+ var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : WX_LEGEND_DEFAULT_ITEM_CONFIG;
- var _layout = require('../core/layout');
+ var me = this;
+ var config = me.config;
- var _layout2 = _interopRequireDefault(_layout);
+ datasets = _get(WxLegend.prototype.__proto__ || Object.getPrototypeOf(WxLegend.prototype), 'init', this).call(this, datasets, defaultOptions);
+ // Reset legendBox
+ // Calculate the legend items
+ datasets = me.calculateLegendItem(datasets, config);
- var _helper = require('../util/helper');
+ me._datasets = datasets;
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : { default: obj };
- }
+ return datasets;
+ }
+ }, {
+ key: 'calculateLegendItem',
+ value: function calculateLegendItem(datasets, config) {
+ var me = this;
+ var labelsConfig = config.labels || {};
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
+ var ctx = me.wxChart.ctx;
+ var boxWidth = labelsConfig.boxWidth;
+ var fontSize = labelsConfig.fontSize;
+ if (!_helper.is.Array(datasets) && _helper.is.PureObject(datasets)) {
+ datasets = [datasets];
+ }
- var WX_CROSSSCALE_CONFIG = {
- xMargin: undefined, // undefined, a number or a function
- xFirstPointSpace: 'auto' };
- /**
- * An cross scale helper
- */
+ datasets = datasets.map(function (dataset) {
+ var textWidth = ctx.measureText(dataset.text).width;
- var WxCrossScale = function () {
- /**
- * @constructor
- * @param {WxScale} xScale - x-Axis instance
- * @param {WxScale} yScale - y-Axis instance
- * @param {Object} [config]
- */
- function WxCrossScale(xScale, yScale, config) {
- _classCallCheck(this, WxCrossScale);
+ var width = boxWidth + fontSize / 2 + textWidth;
+ dataset._prop = {
+ 'fontSize': fontSize,
+ 'boxHeight': fontSize,
+ 'boxWidth': boxWidth,
+ 'textWidth': textWidth,
+ 'width': width
+ };
+ return dataset;
+ });
- if (!xScale instanceof _scale2.default && !yScale instanceof _scale2.default) {
- throw new Error('Should be an WxScale instance');
+ return datasets;
}
+ }, {
+ key: 'calculateBox',
+ value: function calculateBox(area) {
+ var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
- var me = this;
- me.xScale = xScale;
- me.yScale = yScale;
+ var me = this;
+ var outerWidth = void 0,
+ outerHeight = void 0,
+ width = void 0,
+ height = void 0;
+ var wxChart = me.wxChart,
+ ctx = wxChart.ctx,
+ fontSize = ctx.fontSize;
+ var x = area.x,
+ y = area.y;
+ var padding = config.labels.padding || 10;
- me.config = (0, _helper.extend)(true, {}, WX_CROSSSCALE_CONFIG, config);
- }
+ if (me.isHorizontal()) {
+ (function () {
+ width = !!config.fullWidth ? area.width - padding * 2 : config.width;
+ outerWidth = !!config.fullWidth ? area.width : config.width;
+ height = fontSize;
+ outerHeight = height + padding * 2;
- /**
- * Draw a cross scale
- */
+ // Calculate all items
+ var lineNum = 0,
+ currentLineWidth = 0,
+ maxLineWidth = 0;
+ datasets.forEach(function (dataset) {
+ var prop = dataset._prop,
+ outerWidth = prop.width + padding;
+ var lineWidth = currentLineWidth + outerWidth;
+ if (lineWidth > width) {
+ // The previous line width
+ maxLineWidth = maxLineWidth < currentLineWidth ? currentLineWidth : maxLineWidth;
+ // We should take a new line
+ lineNum++;
+ // Set currentLineWidth = 0
+ currentLineWidth = outerWidth;
- _createClass(WxCrossScale, [{
- key: 'draw',
- value: function draw(area, xScaleDatasets, yScaleDatasets) {
- var me = this,
- _me$config = me.config,
- xMargin = _me$config.xMargin,
- xFirstPointSpace = _me$config.xFirstPointSpace;
+ // The first item width insufficient..
+ if (outerWidth > width) {
+ // The width options is tooooo small!
+ console.warn('The width options is too small! width=', width, '.The chart will set to ', lineWidth);
+ width = outerWidth;
+ }
+ } else {
+ currentLineWidth += outerWidth;
+ }
- me.yScale.init(yScaleDatasets);
- var yBox = me.yScale.calculateBox(area, yScaleDatasets);
- me.xScale.init(xScaleDatasets);
- var xBox = me.xScale.calculateBox(area, xScaleDatasets);
+ prop.padding = padding;
+ prop.lineNum = lineNum;
+ prop.outerWidth = outerWidth;
+ });
+ maxLineWidth = maxLineWidth < currentLineWidth ? currentLineWidth : maxLineWidth;
- // Y-Base
- var yMHeight = xBox.outerHeight - xBox.marginTB - me.xScale.lineSpace;
- //yBox.y = yBox.y + yMHeight*2;
- me.yScale.config.fixPadding = yMHeight * 2;
+ // Re calculate the height of legend
+ if (lineNum > 0) {
+ height = fontSize * (lineNum + 1) + lineNum * fontSize / 2;
+ outerHeight = height + padding * 2;
+ }
- // Adjust X-BOX
- var xMWidth = yBox.outerWidth - yBox.marginLR - me.yScale.lineSpace;
+ x += (width - maxLineWidth) / 2;
+ if (me.position == 'bottom') {
+ y = area.ry - outerHeight;
+ y = y < area.y ? area.y : y;
+ }
+ })();
+ } else {
+ var _ret2 = function () {
+ var position = me.position.match(/left/) ? 'left' : 'right';
+ var align = me.position.match(/top/) ? 'top' : 'bottom';
+ var width = 0,
+ lineNum = 0;
+ datasets.forEach(function (dataset) {
+ var wh = dataset._prop.width;
+ width = width < wh ? wh : width;
- var xOffset = xMWidth - me.xScale.fixPadding / 2;
+ dataset._prop.padding = padding;
+ dataset._prop.lineNum = lineNum;
+ // not use to set prop.outerWidth
+ dataset._prop.outerWidth = null;
+ lineNum++;
+ });
+ outerWidth = width + padding * 2;
+ height = fontSize * (lineNum + 1) + lineNum * padding / 2;
+ outerHeight = height + padding * 2;
- var xExtendLeft = void 0;
- if (xFirstPointSpace === 'auto') {
- xExtendLeft = me.xScale.config.extendLeft || Math.min(xBox.width / 10, me.xScale.calculateTickWidth(xScaleDatasets, xBox) / xScaleDatasets.length);
- } else if (xFirstPointSpace === 0) {
- // Zero y-space; The first point of Y will overlap the last point of X, so remove the last point of X
- yScaleDatasets[yScaleDatasets.length - 1].text = '';
- xExtendLeft = 0;
- } else if (_helper.is.Function(xFirstPointSpace)) {
- xExtendLeft = xFirstPointSpace(xBox, yBox, area, me.xScale, me.yScale, xScaleDatasets, yScaleDatasets);
- } else {
- xExtendLeft = parseFloat(xFirstPointSpace);
+ if (align == 'bottom') {
+ y = area.ry - outerHeight;
+ y = y < area.y ? area.y : y;
+ }
+ if (position == 'right') {
+ x = area.rx - outerWidth;
+ x = x < 0 ? 0 : x;
+ }
+ return {
+ v: new _layout.BoxInstance({
+ position: position,
+ x: x,
+ y: y,
+ width: width,
+ outerWidth: outerWidth,
+ height: height,
+ outerHeight: outerHeight
+ })
+ };
+ }();
+
+ if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v;
}
- xOffset -= me.xScale.config.ticks.lineWidth || 1;
- xOffset += xExtendLeft;
+ return new _layout.BoxInstance({
+ position: config.position,
+ x: x,
+ y: y,
+ width: width,
+ outerWidth: outerWidth,
+ height: height,
+ outerHeight: outerHeight
+ });
+ }
+ }, {
+ key: 'draw',
+ value: function draw() {
+ var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;
+ var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
- var xAxisXPoint = area.x + xOffset;
- if (_helper.is.Function(xMargin)) {
- xMargin = xMargin(xBox, yBox, area, me.xScale, me.yScale, xScaleDatasets, yScaleDatasets);
- } else if (!xMargin || !_helper.is.Number(xMargin)) {
- xMargin = 0;
- }
+ var me = this,
+ ctx = me.wxChart.ctx;
+ var x = box.x,
+ y = box.y,
+ width = box.width,
+ outerWidth = box.outerWidth,
+ height = box.height,
+ outerHeight = box.outerHeight;
- var calXbox = new _layout.BoxInstance(xBox.position, xAxisXPoint, xBox.y, xBox.width - xOffset - xMargin, xBox.height, xBox.outerWidth - xOffset, xBox.outerHeight);
- me.yScale.setBox(yBox, false);
- me.yScale.update(yScaleDatasets);
+ // Clear the area of legend
- me.xScale.setBox(calXbox, false);
- me.xScale.config.extendLeft = xExtendLeft;
- me.xScale.update(xScaleDatasets);
+ me.clear();
- return { xBox: calXbox, yBox: yBox };
+ // Begin a new sub-context
+ ctx.save();
+ // Draw all items
+ var currentLineNum = -1;
+ var currentX = x,
+ currentY = y;
+ datasets.forEach(function (dataset) {
+ var text = dataset.text,
+ display = dataset.display,
+ fillStyle = dataset.fillStyle,
+ fillAlpha = dataset.fillAlpha,
+ strokeStyle = dataset.strokeStyle,
+ lineCap = dataset.lineCap,
+ lineJoin = dataset.lineJoin,
+ lineWidth = dataset.lineWidth;
+ var _dataset$_prop = dataset._prop,
+ width = _dataset$_prop.width,
+ fontSize = _dataset$_prop.fontSize,
+ textWidth = _dataset$_prop.textWidth,
+ padding = _dataset$_prop.padding,
+ lineNum = _dataset$_prop.lineNum,
+ boxWidth = _dataset$_prop.boxWidth,
+ boxHeight = _dataset$_prop.boxHeight,
+ outerWidth = _dataset$_prop.outerWidth;
+
+ if (!width) {
+ // No need to draw
+ return;
+ }
+
+ // Set style
+ ctx.textBaseline = 'top';
+ ctx.textAlign = 'start';
+ ctx.fillStyle = fillStyle;
+ ctx.fontSize = fontSize;
+ ctx.strokeStyle = strokeStyle;
+ ctx.lineCap = lineCap;
+ ctx.lineJoin = lineJoin;
+ ctx.lineWidth = lineWidth;
+
+ if (currentLineNum < lineNum) {
+ currentLineNum = lineNum;
+ currentX = x + padding;
+ currentY = y + lineNum * fontSize * 1.5 + padding;
+ }
+ var thisX = currentX;
+ // draw rect
+ if (ctx.lineWidth != 0) {
+ ctx.strokeRect(currentX, currentY, boxWidth, boxHeight);
+ }
+ ctx.globalAlpha = fillAlpha;
+ ctx.fillRect(currentX, currentY, boxWidth, boxHeight);
+ ctx.globalAlpha = 1;
+
+ // draw text
+ currentX += boxWidth + fontSize / 2;
+ ctx.fillText(text, currentX, currentY);
+
+ // draw hidden strike through
+ if (!display) {
+ ctx.save();
+ // Strike through the text if hidden
+ ctx.beginPath();
+ ctx.lineWidth = 1;
+ ctx.moveTo(currentX, currentY + fontSize / 2);
+ ctx.lineTo(currentX + textWidth, currentY + fontSize / 2);
+ ctx.stroke();
+ ctx.restore();
+ }
+
+ currentX = thisX + outerWidth;
+ });
+ ctx.restore();
+
+ ctx.draw();
}
}]);
- return WxCrossScale;
- }();
+ return WxLegend;
+ }(_base2.default);
- exports.default = WxCrossScale;
- }, { "../core/layout": 16, "../core/scale": 18, "../util/helper": 24 }], 22: [function (require, module, exports) {
+ exports.default = WxLegend;
+ }, { "../util/helper": 25, "./base": 16, "./layout": 17 }], 19: [function (require, module, exports) {
/* global module, wx, window: false, document: false */
'use strict';
@@ -7417,12 +7625,34 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
};
}();
- var _scale = require('../core/scale');
-
- var _scale2 = _interopRequireDefault(_scale);
+ var _get = function get(object, property, receiver) {
+ if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {
+ var parent = Object.getPrototypeOf(object);if (parent === null) {
+ return undefined;
+ } else {
+ return get(parent, property, receiver);
+ }
+ } else if ("value" in desc) {
+ return desc.value;
+ } else {
+ var getter = desc.get;if (getter === undefined) {
+ return undefined;
+ }return getter.call(receiver);
+ }
+ };
var _helper = require('../util/helper');
+ var _wxCanvas = require('../util/wxCanvas');
+
+ var _wxCanvas2 = _interopRequireDefault(_wxCanvas);
+
+ var _layout = require('./layout');
+
+ var _base = require('./base');
+
+ var _base2 = _interopRequireDefault(_base);
+
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
@@ -7445,2336 +7675,2163 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
- /**
- * @class Liner scale
- */
- var WxLinerScale = function (_WxScale) {
- _inherits(WxLinerScale, _WxScale);
+ // Scale default config
+ var WX_SCALE_DEFAULT_CONFIG = {
+ display: true,
+ position: 'top', // left, bottom, right, top
+ extendLeft: 0,
+ extendTop: 0,
+ title: undefined,
+ titleFontSize: 12,
+ titleFontColor: '#4c4d4d',
+ //'lineSpace' = fontSize * 0.5'
+ color: '#000000', // Line color
+ lineWidth: 1,
- function WxLinerScale() {
- _classCallCheck(this, WxLinerScale);
+ gridLines: {
+ display: true,
+ color: '#e0e0e0', // Line color
+ lineWidth: 1
+ },
- return _possibleConstructorReturn(this, (WxLinerScale.__proto__ || Object.getPrototypeOf(WxLinerScale)).apply(this, arguments));
+ ticks: {
+ display: true,
+ autoSkip: true,
+ lineWidth: 1,
+ fontColor: '#000000',
+ fontSize: 11,
+ minRotation: 0,
+ maxRotation: 90
+
+ //maxTicksLimit: null,
}
+ };
- _createClass(WxLinerScale, [{
- key: 'buildTicks',
+ var WX_SCALE_DEFAULT_ITEM_CONFIG = {
+ display: true,
+ // text: '',
+ lineWidth: 1,
+ fontColor: '#000000'
+ };
- /**
- * Build a ticks array by max/min value
- * Use to generator liner scale ticks
- *
- * @param {number} max - Max value
- * @param {number} min - Min value
- * @param {number} maxTicks - The maxinum number of ticks
- * @param {number} [stepSize] - Special space size
- *
- * @return {Array} The ticks data
- */
- value: function buildTicks(max, min, maxTicks, stepSize) {
- var spacing = void 0,
- ticks = [];
- if (!!stepSize && stepSize > 0) {
- spacing = stepSize;
- } else {
- var niceRange = (0, _helper.niceNum)(max - min, false);
- spacing = (0, _helper.niceNum)(niceRange / (maxTicks - 1), true);
- }
+ // The WeinXin APP scale
- var niceMin = Math.floor(min / spacing) * spacing;
- var niceMax = Math.ceil(max / spacing) * spacing;
- var numSpaces = (niceMax - niceMin) / spacing;
+ var WxScale = function (_WxBaseComponent) {
+ _inherits(WxScale, _WxBaseComponent);
- if ((0, _helper.almostEquals)(numSpaces, Math.round(numSpaces), spacing / 1000)) {
- numSpaces = Math.round(numSpaces);
- } else {
- numSpaces = Math.ceil(numSpaces);
- }
+ function WxScale(wxChart, config) {
+ _classCallCheck(this, WxScale);
- for (var j = 0; j < numSpaces; j++) {
- ticks.push(niceMin + j * spacing);
- }
- ticks.push(niceMax);
+ var _this = _possibleConstructorReturn(this, (WxScale.__proto__ || Object.getPrototypeOf(WxScale)).call(this, wxChart, config));
- return ticks;
- }
+ _this.config = (0, _helper.extend)(true, {}, WX_SCALE_DEFAULT_CONFIG, config);
+ return _this;
+ }
- /**
- * Build a datasets base on buildTicks
- *
- * @param {number} max - Max value
- * @param {number} min - Min value
- * @param {number} maxTicks - The maximum number of ticks
- * @param {number} [stepSize] - Assign the space size
- * @param {Object} [scaleOptions] - Assign the dataset item's options
- *
- * @return {Array} The ticks data
- */
+ /**
+ * Get visible tick's text data
+ */
- }, {
- key: 'buildDatasets',
- value: function buildDatasets(max, min, maxTicks, stepSize, scaleOptions) {
- var me = this;
- var ticks = me.buildTicks(max, min, maxTicks, stepSize);
- if (!me.isHorizontal()) ticks.reverse();
- return ticks.map(function (val) {
- return (0, _helper.extend)({
- text: val + '',
- value: val
- }, scaleOptions);
- });
+ _createClass(WxScale, [{
+ key: 'getTicksText',
+ value: function getTicksText(tick) {
+ if (!!tick && !!tick.text) {
+ return tick.format ? tick.format.call(tick, tick.text, tick) : tick.text;
+ }
+ return null;
}
/**
- * Calculate the maximum ticks of scale
- *
- * @param {BoxInstance} area - area of chart
- * @param {WxCanvasRenderingContext2D} ctx - Content of chart
- * @returns {number} maxTicks
+ * Get lineSpace
+ * @returns {*|number}
*/
}, {
- key: 'calculateTickLimit',
- value: function calculateTickLimit(area, ctx) {
- var me = this,
- fontSize = ctx.fontSize;
- var maxTicks = void 0;
- var tickOpts = me.config.ticks;
-
- if (me.isHorizontal()) {
- maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(area.width / 50));
- } else {
- // The factor of 2 used to scale the font size has been experimentally determined.
- maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(area.height / (2 * fontSize)));
- }
-
- return maxTicks;
- }
+ key: 'longestText',
/**
- * Get one point by a value
- * **Must** run after 'setBox' or 'update'
- * @param {number} value
- * @returns {object} point
- *
+ * Get longest text
*/
+ value: function longestText() {
+ var ctx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.wxChart.ctx;
+ var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;
+ var me = this;
+ var maxTextLen = 0;
+ datasets.forEach(function (dataset) {
+ if (!!dataset.display) {
+ var textWidth = void 0;
+ if (dataset.textWidth) {
+ textWidth = dataset.textWidth;
+ } else {
+ var text = me.getTicksText(dataset);
+ textWidth = ctx.measureText(text).width;
+ dataset.textWidth = textWidth;
+ }
+ maxTextLen = maxTextLen < textWidth ? textWidth : maxTextLen;
+ }
+ });
+ return maxTextLen;
+ }
}, {
- key: 'getPoint',
- value: function getPoint(value) {
+ key: 'calculateFixPadding',
+ value: function calculateFixPadding(datasets, config) {
var me = this,
- box = this.box;
- var pointX = void 0,
- pointY = void 0;
-
- var startVal = parseInt(me.visDatasets[0].value),
- endVal = parseInt(me.visDatasets[me.visDatasets.length - 1].value);
- // if (!me.isHorizontal()) {
- // [startVal,endVal] = [endVal,startVal];
- // }
- var range = endVal - startVal;
-
+ ctx = me.wxChart.ctx;
+ if (config.fixPadding) {
+ return config.fixPadding;
+ }
if (me.isHorizontal()) {
- var realWidth = me.getTicksPosition(me.visDatasets.length - 1).x - me.getTicksPosition(0).x;
- pointX = me.getTicksPosition(0).x + realWidth / range * (value - startVal);
- pointY = me.position === 'top' ? box.ry - me.lineSpace : box.ly + me.lineSpace;
+ var visTicks = me.visDatasets;
+ var firstTickText = me.getTicksText(visTicks[0]),
+ lastTickText = me.getTicksText(visTicks[visTicks.length - 1]);
+ return Math.max(ctx.measureText(firstTickText).width, ctx.measureText(lastTickText).width);
} else {
- var realHeight = me.getTicksPosition(me.visDatasets.length - 1).y - me.getTicksPosition(0).y;
- pointX = me.position === 'left' ? box.rx - me.lineSpace : box.lx + me.lineSpace;
- pointY = me.getTicksPosition(0).y + realHeight / range * (value - startVal);
+ return ctx.fontSize;
}
- return { x: Math.round(pointX), y: Math.round(pointY) };
}
- }]);
-
- return WxLinerScale;
- }(_scale2.default);
-
- exports.default = WxLinerScale;
- }, { "../core/scale": 18, "../util/helper": 24 }], 23: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
+ }, {
+ key: 'init',
+ value: function init(datasets) {
+ var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : WX_SCALE_DEFAULT_ITEM_CONFIG;
- /**
- * An mixin class(implement by es6-mixins) for stacked point
- */
+ var me = this;
+ var config = me.config;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ datasets = _get(WxScale.prototype.__proto__ || Object.getPrototypeOf(WxScale.prototype), 'init', this).call(this, datasets, defaultOptions);
+ me.visDatasets = null;
+ me._datasets = datasets;
+ me.fixPadding = me.calculateFixPadding(datasets, config);
- var _createClass = function () {
- function defineProperties(target, props) {
- for (var i = 0; i < props.length; i++) {
- var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ return datasets;
}
- }return function (Constructor, protoProps, staticProps) {
- if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
- };
- }();
-
- function _classCallCheck(instance, Constructor) {
- if (!(instance instanceof Constructor)) {
- throw new TypeError("Cannot call a class as a function");
- }
- }
-
- var WxStackMixin = function () {
- function WxStackMixin() {
- _classCallCheck(this, WxStackMixin);
- }
+ }, {
+ key: 'calculateBox',
+ value: function calculateBox(area) {
+ var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
- _createClass(WxStackMixin, [{
- key: 'stackYScaleAxisLimit',
+ var me = this,
+ ctx = me.wxChart.ctx;
+ var fontSize = ctx.fontSize;
+ var tickWidth = me.calculateTickWidth(datasets, area, config);
+ var x = void 0,
+ y = void 0,
+ minWidth = void 0,
+ minHeight = void 0,
+ maxWidth = void 0,
+ maxHeight = void 0;
+ var minFontRotation = (0, _helper.toRadians)(config.ticks.minRotation || 0),
+ maxFontRotation = (0, _helper.toRadians)(config.ticks.maxRotation || 90),
+ fontRadians = minFontRotation;
+ var lineSpace = me.lineSpace;
+ var lineWidth = 1;
- /**
- * Calculate the yAxis data for *WxLinerScale*
- */
- value: function stackYScaleAxisLimit() {
- var me = this;
- var min = 0,
- max = 0;
- me.visDatasets.forEach(function (data) {
- var sumNeg = 0,
- sumPos = 0;
- me.legends.forEach(function (legend) {
- var key = legend.key;
- var stackedVal = data[key];
- if (stackedVal < 0) {
- sumNeg += stackedVal || 0;
+ var longestText = me.longestText();
+ if (me.isHorizontal()) {
+ if (longestText > tickWidth) {
+ // Ticket's width not satisfied with the longest text's width
+ if (tickWidth <= ctx.fontSize) {
+ fontRadians = maxFontRotation;
} else {
- sumPos += stackedVal || 0;
+ fontRadians = Math.acos(tickWidth / longestText);
+ minHeight = Math.sin(fontRadians) * longestText + lineWidth + lineSpace + fontSize / 2;
+ if (minHeight > area.height) {
+ minHeight = area.height;
+ fontRadians = Math.asin((minHeight - lineWidth - lineSpace - fontSize / 2) / longestText);
+ } else if (fontRadians > maxFontRotation) {
+ fontRadians = maxFontRotation;
+ minHeight = Math.sin(fontRadians) * longestText + lineWidth + lineSpace + fontSize / 2;
+ }
}
- });
- data.__sumNeg = sumNeg;
- data.__sumPos = sumPos;
- if (sumNeg < min) min = sumNeg;
- if (sumPos > max) max = sumPos;
- });
+ } else {
+ minHeight = fontSize * 1.5 + lineWidth + lineSpace;
+ }
+ minWidth = area.width;
+ maxWidth = area.outerWidth;
+ maxHeight = minHeight;
+ } else {
+ var titleWidth = 0;
+ if (config.title) {
+ titleWidth = ctx.measureText(config.title, config.titleFontSize).width - lineWidth - lineSpace - fontSize / 2;
+ }
+ minWidth = longestText + lineWidth + lineSpace + fontSize / 2;
+ minWidth = minWidth > titleWidth ? minWidth : titleWidth;
+ if (minWidth > area.width) {
+ minWidth = area.width;
+ fontRadians = Math.acos((minWidth - lineWidth - lineSpace - fontSize / 2) / longestText);
+ fontRadians = fontRadians > maxFontRotation ? maxFontRotation : fontRadians;
+ }
+ minHeight = area.height;
+ maxWidth = minWidth;
+ maxHeight = area.outerHeight;
+ }
+ switch (me.position) {
+ case 'left':
+ case 'top':
+ x = area.x;
+ y = area.y;
+ break;
+ case 'right':
+ x = area.x + area.width - maxWidth;
+ y = area.y;
+ break;
+ case 'bottom':
+ x = area.x;
+ y = area.y + area.height - maxHeight;
+ break;
+ }
- return { max: max, min: min };
+ me.fontRadians = fontRadians;
+ return new _layout.BoxInstance(me.position, x, y, minWidth, minHeight, maxWidth, maxHeight);
}
+ }, {
+ key: 'calculateTickWidth',
+
/**
- * Calculate the stack value
- * @param {number} index - The index of item
- * @param {Object} legendIndex - The index of legend
- * @param {number} [offset=0] - The offset value of stack
- * @param {WxScale} [yScale=this.yAxis] - Y-Axis instance
- * @return {{sumNeg: number, sumPos: number}}
- * @private
+ * Calculate ticks' separation distance
+ * @param {BoxInstance} [area=this.box]
+ *
+ *
+ * Horizontal Scale:
+ * x------------------------------------.--x(first tick)--------------------------.--x(last tick)--margin--x
+ * x------------------------------------.--x(first tick)-----x(last tick)--margin-.--x--titleWidth+padding--
+ * |---extendLeft---|(box.x)---margin---|-----------area.width----------------------|---------margin------|
+ * |----------------------------area box-------------------------------------------------|
+ * Vertical Scale:
+ * x----------------------------------------.--x--------(first tick)----------.--x(last tick)-x
+ * x------------------titleHeight+padding---.--x---margin-x-------(first tick).--x(last tick)-x
+ * |---extendTop----|(box.y)---margin-------|-----------area.height--------------|---margin---|
+ * |----------------------------area box-------------------------------------|
*/
-
- }, {
- key: '_getStackValue',
- value: function _getStackValue(index, legendIndex) {
- var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
- var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;
+ value: function calculateTickWidth() {
+ var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;
+ var area = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
var me = this,
- data = me.visDatasets[index];
+ ticketWidth = void 0;
+ var visTicks = me.visDatasets;
+ var defaultLineWidth = config.ticks.lineWidth;
+ // total line width
+ var totalLineWidth = _helper.sum.apply(null, visTicks.map(function (v) {
+ return v.lineWidth || defaultLineWidth;
+ }));
+ var fixPadding = me.fixPadding;
- var stackedVal = void 0,
- sumNeg = 0,
- sumPos = 0;
- for (var j = 0; j < legendIndex; j++) {
- stackedVal = data[me.legends[j].key];
- if (stackedVal < 0) {
- sumNeg += stackedVal || 0;
- } else {
- sumPos += stackedVal || 0;
+ if (me.isHorizontal()) {
+ var innerWidth = area.width,
+ marginLR = area.marginLR;
+ var titleWidth = me.calculateTitleWidth();
+ var extendLeft = me.config.extendLeft;
+ if (marginLR !== 0) {
+ totalLineWidth += defaultLineWidth * 2;
+ } else if (extendLeft !== 0) {
+ totalLineWidth += defaultLineWidth;
+ }
+ ticketWidth = (innerWidth - titleWidth - totalLineWidth - fixPadding) / (visTicks.length - 1);
+ } else {
+ var innerHeight = area.height,
+ marginTB = area.marginTB;
+ var titleHeight = me.calculateTitleWidth();
+ var extendTop = config.extendTop;
+ if (marginTB !== 0) {
+ totalLineWidth += defaultLineWidth * 2;
+ } else if (extendTop !== 0) {
+ totalLineWidth += defaultLineWidth;
}
+ ticketWidth = (innerHeight - titleHeight - totalLineWidth - fixPadding) / (visTicks.length - 1);
}
- return {
- sumNeg: sumNeg,
- sumPos: sumPos
- };
+ return ticketWidth;
+ }
+ }, {
+ key: 'calculateTitleWidth',
+ value: function calculateTitleWidth() {
+ var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config;
+
+ var titleWidth = void 0,
+ me = this,
+ ctx = me.wxChart.ctx;
+ if (me.isHorizontal()) {
+ titleWidth = config.title ? ctx.measureText(config.title, config.titleFontSize).width : 0;
+ } else {
+ titleWidth = config.title ? config.titleFontSize : 0;
+ }
+ return titleWidth;
+ }
+ }, {
+ key: '_getTicksLineWidthOffset',
+ value: function _getTicksLineWidthOffset(index, visTicks) {
+ var offset = 0,
+ me = this;
+ if (!visTicks) {
+ visTicks = me.visDatasets;
+ }
+ var defaultLineWidth = this.config.ticks.lineWidth;
+ visTicks.map(function (tick, i) {
+ if (index >= i) {
+ offset += tick.lineWidth || defaultLineWidth;
+ }
+ });
+ return offset;
}
/**
- * Calculate the stack bar
- * @param {number} index - The index of item
- * @param {Object} legendIndex - The index of legend
- * @param {number} [offsetValue=0] - The offset value of stack
- * @param {WxScale} [yScale=this.yAxis] - Y-Axis instance
- * @return {Object}
- * @private
+ * Get position of ticket
+ * @param {number} index - Begin from zero. If set -1, the function will return the actual x,y included extendLeft or extendTop
+ * @param {number} [ticketWidth=this.ticketWidth]
+ * @param {BoxInstance} [area=this.box]
*/
}, {
- key: '_getStackPoint',
- value: function _getStackPoint(index, legendIndex) {
- var offsetValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
- var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;
+ key: 'getTicksPosition',
+ value: function getTicksPosition(index, ticketWidth) {
+ var area = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.box;
var me = this,
- data = me.visDatasets[index],
- value = data[me.legends[legendIndex].key];
-
- var _me$_getStackValue = me._getStackValue(index, legendIndex, offsetValue, yScale),
- sumNeg = _me$_getStackValue.sumNeg,
- sumPos = _me$_getStackValue.sumPos;
+ ctx = me.wxChart.ctx;
+ var fixPadding = me.fixPadding;
+ if (!ticketWidth) {
+ ticketWidth = me.calculateTickWidth();
+ }
+ var visTicks = me.visDatasets;
- return value < 0 ? yScale.getPoint(sumNeg + value + offsetValue) : yScale.getPoint(sumPos + value + offsetValue);
+ var baseX = void 0,
+ baseY = void 0;
+ if (me.isHorizontal()) {
+ baseX = index === -1 ? area.x - me.config.extendLeft + fixPadding / 2 + (me.config.extendLeft ? me.config.ticks.lineWidth : 0) : area.lx + me._getTicksLineWidthOffset(index, visTicks) + ticketWidth * index + fixPadding / 2;
+ baseY = me.position === 'top' ? area.ry - me.lineSpace : area.ly + me.lineSpace;
+ } else {
+ baseY = index === -1 ? area.y - me.config.extendTop + fixPadding / 2 + (me.config.extendTop ? me.config.ticks.lineWidth : 0) : area.ly + me.calculateTitleWidth() + me._getTicksLineWidthOffset(index, visTicks) + ticketWidth * index + fixPadding / 2;
+ baseX = me.position === 'left' ? area.rx - me.lineSpace : area.lx + me.lineSpace;
+ }
+ return { x: baseX, y: baseY };
}
- }]);
-
- return WxStackMixin;
- }();
-
- exports.default = WxStackMixin;
- }, {}], 24: [function (require, module, exports) {
- /* global module, wx, window: false, document: false */
- 'use strict';
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
-
- var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
- return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
- } : function (obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
- };
-
- exports.sum = sum;
- exports.checkWX = checkWX;
- exports.wxConverToPx = wxConverToPx;
- exports.toRadians = toRadians;
- exports.toDegrees = toDegrees;
- exports.getWindowSize = getWindowSize;
- exports.getDPR = getDPR;
- exports.niceNum = niceNum;
- exports.almostEquals = almostEquals;
- exports.splineCurve = splineCurve;
- exports.getStyle = getStyle;
- exports.readUsedSize = readUsedSize;
- exports.retinaScale = retinaScale;
-
- function _toConsumableArray(arr) {
- if (Array.isArray(arr)) {
- for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
- arr2[i] = arr[i];
- }return arr2;
- } else {
- return Array.from(arr);
- }
- }
-
- var ObjProto = Object.prototype;
-
- // IS function, check variable's type
- var is = exports.is = {};
+ }, {
+ key: '_initDrawATickText',
+ value: function _initDrawATickText() {
+ var me = this,
+ ctx = me.wxChart.ctx;
+ switch (me.position) {
+ case 'left':
+ ctx.textAlign = 'end';
+ ctx.textBaseline = 'middle';
+ break;
+ case 'right':
+ ctx.textAlign = 'start';
+ ctx.textBaseline = 'middle';
+ break;
+ case 'top':
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'alphabetic';
+ break;
+ case 'bottom':
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'top';
+ break;
+ }
+ }
+ }, {
+ key: '_drawATickLine',
+ value: function _drawATickLine(x, y, fontSize) {
+ var tick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
- ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'].forEach(function (name) {
- is[name] = function (obj) {
- return ObjProto.toString.call(obj) === '[object ' + name + ']';
- };
- });
+ var me = this,
+ ctx = me.wxChart.ctx;
+ var lineSpace = me.lineSpace;
+ var sx = x;
+ var sy = y;
+ switch (me.position) {
+ case 'left':
+ sx += lineSpace;
+ break;
+ case 'right':
+ sx -= lineSpace;
+ break;
+ case 'top':
+ sy += lineSpace;
+ break;
+ case 'bottom':
+ sy -= lineSpace;
+ break;
+ }
+ ctx.beginPath();
+ ctx.moveTo(sx, sy);
+ ctx.lineTo(x, y);
+ ctx.stroke();
- // Is a given value an array?
- // Delegates to ECMA5's native Array.isArray
- is['Array'] = Array.isArray || function (obj) {
- return ObjProto.toString.call(obj) === '[object Array]';
- };
+ // Draw text
+ var text = void 0;
+ if (tick && tick.text && _helper.is.String(tick.text)) {
+ ctx.save();
+ me._initDrawATickText();
+ text = tick.format ? tick.format.call(me, tick.text, tick, x, y, me.fontRadians) : tick.text;
+ var textWidth = tick.textWidth ? tick.textWidth : ctx.measureText(text).width;
+ switch (me.position) {
+ case 'left':
+ ctx.translate(x - fontSize / 2, y + Math.sin(me.fontRadians) * textWidth / 2);
+ ctx.rotate(me.fontRadians);
+ //ctx.fillText(text, x - ctx.fontSize/2, y);
+ break;
+ case 'right':
+ ctx.translate(x + fontSize / 2, y + Math.sin(me.fontRadians) * textWidth / 2);
+ ctx.rotate(-me.fontRadians);
+ // ctx.fillText(text, x + ctx.fontSize/2, y);
+ break;
+ case 'top':
+ ctx.translate(x, y - fontSize / 2);
+ ctx.rotate(-me.fontRadians);
+ break;
+ case 'bottom':
+ ctx.translate(x, y + fontSize / 2);
+ ctx.rotate(me.fontRadians);
+ break;
+ }
+ ctx.fillText(text, 0, 0);
- // Is a given variable an object?
- is['Object'] = function (obj) {
- var type = typeof obj === 'undefined' ? 'undefined' : _typeof(obj);
- return type === 'function' || type === 'object' && !!obj;
- };
+ ctx.restore();
+ }
+ }
+ }, {
+ key: 'draw',
+ value: function draw() {
+ var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;
+ var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
- var class2type = {};
- var toString = class2type.toString;
- var hasOwn = class2type.hasOwnProperty;
- var fnToString = hasOwn.toString;
- var ObjectFunctionString = fnToString.call(Object);
- // Is a given variable an object?
- is['PureObject'] = function (obj) {
- var proto = void 0,
- Ctor = void 0;
+ var me = this,
+ ctx = me.wxChart.ctx;
+ var fontSize = ctx.fontSize;
+ var fixPadding = me.fixPadding,
+ tickWidth = me.calculateTickWidth(datasets, box, config);
+ var tickConfig = config.ticks;
+ var x = box.x,
+ y = box.y,
+ width = box.width,
+ outerWidth = box.outerWidth,
+ height = box.height,
+ outerHeight = box.outerHeight;
- // Detect obvious negatives
- // Use toString instead of jQuery.type to catch host objects
- if (!obj || ObjProto.toString.call(obj) !== "[object Object]") {
- return false;
- }
+ var visTicks = me.visDatasets;
- proto = Object.getPrototypeOf(obj);
- // Objects with no prototype (e.g., `Object.create( null )`) are plain
- if (!proto) {
- return true;
- }
- // Objects with prototype are plain iff they were constructed by a global Object function
- Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
- return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
- };
+ var _me$getTicksPosition = me.getTicksPosition(-1, tickWidth),
+ currX = _me$getTicksPosition.x,
+ currY = _me$getTicksPosition.y,
+ baseX = _me$getTicksPosition.x,
+ baseY = _me$getTicksPosition.y;
- is['Boolean'] = function (obj) {
- return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
- };
+ ctx.save();
+ ctx.fillStyle = tickConfig.fontColor;
+ ctx.fontSize = tickConfig.fontSize;
+ ctx.lineWidth = tickConfig.lineWidth;
+ var titleWidth = me.calculateTitleWidth();
- // Is a given value equal to null?
- is['Null'] = function (obj) {
- return obj === null;
- };
+ if (me.isHorizontal()) {
+ // Draw the first point
+ if (me.box.marginLR || config.extendLeft) {
+ currX += tickConfig.lineWidth;
+ me._drawATickLine(currX, currY, fontSize);
+ }
+ // Move to first tick
+ currX = me.box.lx + fixPadding / 2;
+ // Draw ticks
+ visTicks.map(function (tick) {
+ currX += tick.lineWidth;
+ ctx.fillStyle = tick.fontColor;
+ ctx.lineWidth = tick.lineWidth;
+ ctx.fontSize = tick.fontSize || ctx.fontSize;
+ me._drawATickLine(currX, currY, fontSize, tick);
+ currX += tickWidth;
+ });
+ // Draw the last point
+ currX = me.box.ex - fixPadding / 2 - titleWidth;
+ if (me.box.marginLR) {
+ me._drawATickLine(currX, currY, fontSize);
+ }
- // Is a given variable undefined?
- is['Undefined'] = function (obj) {
- return obj === void 0;
- };
+ ctx.fillStyle = tickConfig.fontColor;
+ ctx.lineWidth = config.lineWidth;
+ // draw axis line
+ ctx.beginPath();
+ ctx.moveTo(baseX, currY);
+ ctx.lineTo(currX, currY);
+ ctx.stroke();
- // Is the given value `NaN`? (NaN is the only number which does not equal itself).
- is['NaN'] = function (obj) {
- return is.Number(obj) && obj !== +obj;
- };
+ if (config.title) {
+ ctx.save();
+ currX += fontSize / 2;
+ ctx.fontSize = config.titleFontSize;
+ ctx.textAlign = 'start';
+ ctx.textBaseline = 'bottom';
+ ctx.fillStyle = config.titleFontColor;
+ ctx.fillText(config.title, currX, currY);
+ ctx.restore();
+ }
+ } else {
+ if (config.title) {
+ ctx.save();
+ ctx.fontSize = config.titleFontSize;
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'bottom';
+ ctx.fillStyle = config.titleFontColor;
+ ctx.fillText(config.title, currX, currY);
+ ctx.restore();
+ }
- // Some helper function
- function sum() {
- var args = Array.from(arguments);
- var res = 0;
- return args.reduce(function (a, b) {
- return a + b;
- }, 0);
- }
+ // Draw the first point
+ if (me.box.marginTB || config.extendTop) {
+ currY += titleWidth;
+ me._drawATickLine(currX, currY, fontSize);
+ }
+ currY = me.box.ly + fixPadding / 2 + titleWidth;
+ // Draw ticks
+ visTicks.map(function (tick) {
+ currY += tick.lineWidth;
+ ctx.fillStyle = tick.fontColor;
+ ctx.lineWidth = tick.lineWidth;
+ ctx.fontSize = tick.fontSize || ctx.fontSize;
+ me._drawATickLine(currX, currY, fontSize, tick);
+ currY += tickWidth;
+ });
+ // Draw the last point
+ currY = me.box.ey - fixPadding / 2;
+ if (me.box.marginTB) {
+ me._drawATickLine(currX, currY, fontSize);
+ }
- // Some regex
- var REG_HANZI = exports.REG_HANZI = /[\u4e00-\u9fa5]/;
- var REG_ALPHABET = exports.REG_ALPHABET = /[a-zA-Z]/;
- var REG_NUMBER = exports.REG_NUMBER = /[0-9]/;
- var REG_ALPHABET_NUMBER = exports.REG_ALPHABET_NUMBER = /[0-9a-zA-Z]/;
+ ctx.fillStyle = tickConfig.fontColor;
+ ctx.lineWidth = config.lineWidth;
+ // draw axis line
+ ctx.beginPath();
+ ctx.moveTo(currX, baseY + titleWidth);
+ ctx.lineTo(currX, currY);
+ ctx.stroke();
+ }
+ ctx.draw();
+ ctx.restore();
+ }
- // Assign function generator
- function _assignGenerator(own) {
- var _copy = function _copy(target) {
- var deep = true;
+ // Empty interface
+ /**
+ * Get one point by a value
+ * @param {number} index - The index of category
+ */
- for (var _len = arguments.length, source = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
- source[_key - 1] = arguments[_key];
+ }, {
+ key: 'getPoint',
+ value: function getPoint(index) {
+ return null;
}
-
- if (is.Boolean(target)) {
- deep = target;
- target = 0 in source ? source.shift() : null;
+ }, {
+ key: 'lineSpace',
+ get: function get() {
+ var me = this;
+ if (me._lineSpace) {
+ return me._lineSpace;
+ }
+ me._lineSpace = this.config.lineSpace || this.wxChart.ctx.fontSize * 0.5;
+ return me._lineSpace;
}
+ }]);
- if (is.Array(target)) {
- source.forEach(function (sc) {
- var _target;
+ return WxScale;
+ }(_base2.default);
- (_target = target).push.apply(_target, _toConsumableArray(sc));
- });
- } else if (is.Object(target)) {
- source.forEach(function (sc) {
- for (var key in sc) {
- if (own && !sc.hasOwnProperty(key)) continue;
- var so = sc[key],
- to = target[key];
- if (is.PureObject(so)) {
- target[key] = deep ? extend(true, is.PureObject(to) ? to : {}, so) : so;
- } else if (is.Array(so)) {
- target[key] = deep ? extend(true, is.Array(to) ? to : [], so) : so;
- } else {
- target[key] = so;
- }
- }
- });
+ exports.default = WxScale;
+ }, { "../util/helper": 25, "../util/wxCanvas": 29, "./base": 16, "./layout": 17 }], 20: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
- // Do nothing
- return target;
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
- return _copy;
- }
+ }();
- /**
- *
- * Extend a given object
- * @param {Boolean|Object|Array} target - target object or deep mark (default is true)
- * @param {Array|Object} source - target object if the first argument represent the deep mark, otherwise the source for merging
- * @returns {*}
- */
- var extend = exports.extend = _assignGenerator(false);
- var extendOwn = exports.extendOwn = _assignGenerator(true);
- /**
- * Check WeiXin environment
- */
- function checkWX() {
- return false === true || typeof wx != 'undefined' && (typeof wx === 'undefined' ? 'undefined' : _typeof(wx)) === 'object';
- }
+ var _base = require('./base');
- var isWeiXinAPP = exports.isWeiXinAPP = checkWX();
- /**
- * Convert (rpx/rem) to px
- * @param unit
- */
- var rpxReg = /([\d.]+)rpx/,
- remReg = /([\d.]+)rem/;
- function wxConverToPx(val) {
- if (!isWeiXinAPP) {
- return Number.parseInt(val);
- }
+ var _base2 = _interopRequireDefault(_base);
- var windowSize = getWindowSize();
- if (is.String(val)) {
- var m = val.match(rpxReg);
- if (!!m) {
- return +m[1] * windowSize.windowWidth / 750;
- }
+ var _helper = require('../util/helper');
- m = val.match(remReg);
- if (!!m) {
- return +m[1] * windowSize.windowWidth / 20;
- }
+ var _layout = require('./layout');
- return Number.parseInt(val);
- } else if (is.Number(val)) {
- return val;
- } else {
- throw new Error('Convert px error');
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
}
}
- function toRadians(degrees) {
- return degrees * (Math.PI / 180);
+ function _possibleConstructorReturn(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && ((typeof call === "undefined" ? "undefined" : _typeof2(call)) === "object" || typeof call === "function") ? call : self;
}
- function toDegrees(radians) {
- return radians * (180 / Math.PI);
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof2(superClass)));
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
- /**
- * Get window size (px)
- * @returns {*}
- */
- function getWindowSize() {
- var windowHeight = void 0,
- windowWidth = void 0;
- if (isWeiXinAPP) {
- var ret = wx.getSystemInfoSync();
- windowWidth = ret.windowWidth;
- windowHeight = ret.windowHeight;
- } else {
- windowWidth = window.innerWidth;
- windowHeight = window.innerHeight;
- }
- return { windowWidth: windowWidth, windowHeight: windowHeight };
+
+ // Legend default config
+ var WX_TITLE_DEFAULT_CONFIG = {
+ display: true,
+ position: 'top', // top, bottom
+ fullWidth: true, // if the fullWidth is false, the 'width' property should be existed.
+ fontSize: 16,
+ fontColor: '#666666',
+ padding: 10
};
- /**
- * Get window's Device Pixel Ratio
- */
- function getDPR() {
- if (isWeiXinAPP) {
- var ret = wx.getSystemInfoSync();
- return ret.pixelRatio;
- } else {
- return window.devicePixelRatio || 1;
+ var WxTitle = function (_WxBaseComponent) {
+ _inherits(WxTitle, _WxBaseComponent);
+
+ function WxTitle(wxChart, config) {
+ _classCallCheck(this, WxTitle);
+
+ var _this = _possibleConstructorReturn(this, (WxTitle.__proto__ || Object.getPrototypeOf(WxTitle)).call(this, wxChart, config));
+
+ _this.config = (0, _helper.extend)(true, {}, WX_TITLE_DEFAULT_CONFIG, config);
+ return _this;
}
- };
- var uid = exports.uid = function () {
- var id = 0;
- return function () {
- id++;
- return 'u' + id;
- };
- }();
+ /**
+ * Update data and re-draw
+ * @param {Object[]} text
+ * @param {Object} [defaultOptions]
+ * @returns {string} text
+ */
- function niceNum(range, round) {
- var exponent = Math.floor(Math.log10(range));
- var fraction = range / Math.pow(10, exponent);
- var niceFraction = void 0;
+ _createClass(WxTitle, [{
+ key: 'init',
+ value: function init(text) {
+ var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- if (round) {
- if (fraction < 1.5) {
- niceFraction = 1;
- } else if (fraction < 3) {
- niceFraction = 2;
- } else if (fraction < 7) {
- niceFraction = 5;
- } else {
- niceFraction = 10;
+ var me = this;
+ var config = me.config;
+
+ text = text ? text : config.text;
+ if (_helper.is.Undefined(text) || _helper.is.Null(text)) {
+ throw new Error('Text is null');
+ }
+
+ me._datasets = text;
+ return text;
+ }
+ }, {
+ key: 'calculateBox',
+ value: function calculateBox(area) {
+ var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.config.text;
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
+
+ var me = this;
+ var wxChart = me.wxChart,
+ ctx = wxChart.ctx,
+ fontSize = config.fontSize || 16;
+ var x = area.x,
+ y = area.y;
+ var padding = config.padding || 10;
+
+ var width = !!config.fullWidth ? area.width - padding * 2 : config.width,
+ outerWidth = !!config.fullWidth ? area.width : config.width,
+ height = fontSize,
+ outerHeight = height + padding * 2;
+
+ if (config.position == 'bottom') {
+ y = area.ry - outerHeight;
+ y = y < area.y ? area.y : y;
+ }
+
+ return new _layout.BoxInstance({
+ position: config.position,
+ x: x,
+ y: y,
+ width: width,
+ height: height,
+ outerWidth: outerWidth,
+ outerHeight: outerHeight
+ });
}
- } else if (fraction <= 1.0) {
- niceFraction = 1;
- } else if (fraction <= 2) {
- niceFraction = 2;
- } else if (fraction <= 5) {
- niceFraction = 5;
- } else {
- niceFraction = 10;
- }
+ }, {
+ key: 'draw',
+ value: function draw() {
+ var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config.text;
+ var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;
+ var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;
- return niceFraction * Math.pow(10, exponent);
- }
+ var me = this,
+ ctx = me.wxChart.ctx;
+ var x = box.x,
+ y = box.y,
+ width = box.width,
+ outerWidth = box.outerWidth,
+ height = box.height,
+ outerHeight = box.outerHeight;
- function almostEquals(a, b, epsilon) {
- return Math.abs(a - b) < epsilon;
- }
+ if (_helper.is.Undefined(text) || _helper.is.Null(text)) {
+ throw new Error('Text is null');
+ }
- function splineCurve(firstPoint, middlePoint, afterPoint) {
- var t = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.4;
+ var fontColor = config.fontColor,
+ fontSize = config.fontSize;
+ // Clear the area of legend
- // Props to Rob Spencer at scaled innovation for his post on splining between points
- // http://scaledinnovation.com/analytics/splines/aboutSplines.html
+ me.clear();
+ // Begin a new sub-context
+ ctx.save();
- // This function must also respect "skipped" points
+ ctx.textBaseline = 'top';
+ ctx.textAlign = 'start';
+ ctx.fillStyle = fontColor;
+ ctx.fontSize = fontSize;
- var previous = !firstPoint ? middlePoint : firstPoint,
- current = middlePoint,
- next = !afterPoint ? middlePoint : afterPoint;
+ var textLen = ctx.measureText(text).width;
+ x += (width - textLen) / 2;
+ ctx.fillText(text, x, y);
- var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));
- var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));
+ ctx.restore();
+ ctx.draw();
+ }
+ }]);
- var s01 = d01 / (d01 + d12);
- var s12 = d12 / (d01 + d12);
+ return WxTitle;
+ }(_base2.default);
- // If all points are the same, s01 & s02 will be inf
- s01 = isNaN(s01) ? 0 : s01;
- s12 = isNaN(s12) ? 0 : s12;
+ exports.default = WxTitle;
+ ;
+ }, { "../util/helper": 25, "./base": 16, "./layout": 17 }], 21: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
+ 'use strict';
- var fa = t * s01; // scaling factor for triangle Ta
- var fb = t * s12;
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
- return {
- previous: {
- x: current.x - fa * (next.x - previous.x),
- y: current.y - fa * (next.y - previous.y)
- },
- next: {
- x: current.x + fb * (next.x - previous.x),
- y: current.y + fb * (next.y - previous.y)
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
};
+ }();
+
+ var _scale = require('../core/scale');
+
+ var _scale2 = _interopRequireDefault(_scale);
+
+ var _helper = require('../util/helper');
+
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
}
- /**
- * Get element style
- * @param element
- */
- function getStyle(element, property) {
- return element.currentStyle ? element.currentStyle[property] : document.defaultView.getComputedStyle(element, null).getPropertyValue(property);
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
}
- /**
- * The 'used' size is the final value of a dimension property after all calculations have
- * been performed. This method uses the computed style of `element` but returns undefined
- * if the computed style is not expressed in pixels. That can happen in some cases where
- * `element` has a size relative to its parent and this last one is not yet displayed,
- * for example because of `display: none` on a parent node.
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value
- * @param element
- * @param property
- * @returns {Number} Size in pixels or undefined if unknown.
- */
- function readUsedSize(element, property) {
- var value = getStyle(element, property);
- var matches = value && value.match(/(\d+)px/);
- return matches ? Number(matches[1]) : undefined;
+
+ function _possibleConstructorReturn(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && ((typeof call === "undefined" ? "undefined" : _typeof2(call)) === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof2(superClass)));
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
+
/**
- * For retina screen
- * @param ctx
- * @param width
- * @param height
+ * @class Liner scale
*/
- function retinaScale(ctx, width, height) {
- var pixelRatio = getDPR();
- if (pixelRatio === 1) {
- return;
- }
+ var WxCategoryScale = function (_WxScale) {
+ _inherits(WxCategoryScale, _WxScale);
- var canvas = ctx.canvas;
- if (isWeiXinAPP) {
- // Do I resize the height or width?
- } else {
- canvas.height = canvas.height * pixelRatio;
- canvas.width = canvas.width * pixelRatio;
- ctx.scale(pixelRatio, pixelRatio);
+ function WxCategoryScale() {
+ _classCallCheck(this, WxCategoryScale);
- // If no style has been set on the canvas, the render size is used as display size,
- // making the chart visually bigger, so let's enforce it to the 'correct' values.
- // See https://github.com/chartjs/Chart.js/issues/3575
- canvas.style.height = height + 'px';
- canvas.style.width = width + 'px';
+ return _possibleConstructorReturn(this, (WxCategoryScale.__proto__ || Object.getPrototypeOf(WxCategoryScale)).apply(this, arguments));
}
- }
- }, {}], 25: [function (require, module, exports) {
- (function (global) {
- /* global module, wx, getApp, window: false, global:false, document: false */
- 'use strict';
-
- /**
- * Modify from RAF(https://github.com/chrisdickinson/raf)
- *
- */
-
- var _helper = require('../util/helper');
- var now = require('performance-now');
- var root = void 0,
- isWx = (0, _helper.checkWX)();
- root = isWx ? {} : typeof window === 'undefined' ? global : window;
+ _createClass(WxCategoryScale, [{
+ key: 'buildTicks',
- var vendors = ['moz', 'webkit'],
- suffix = 'AnimationFrame',
- raf = root['request' + suffix],
- caf = root['cancel' + suffix] || root['cancelRequest' + suffix];
+ /**
+ * Build a ticks array by minIndex or maxIndex
+ * Use to generator category scale ticks
+ *
+ * @param {Array} legends - The legend config of chart
+ * @param {number} maxIndex - Max index
+ * @param {number} minIndex - Min index
+ *
+ * @return {Array} The ticks data
+ */
+ value: function buildTicks(legends, maxIndex, minIndex) {
+ if (!legends || !_helper.is.Array(legends)) {
+ return legends;
+ }
+ minIndex = minIndex || 0;
+ maxIndex = maxIndex || legends.length;
- for (var i = 0; !raf && i < vendors.length; i++) {
- raf = root[vendors[i] + 'Request' + suffix];
- caf = root[vendors[i] + 'Cancel' + suffix] || root[vendors[i] + 'CancelRequest' + suffix];
- }
+ return legends.slice(minIndex, maxIndex);
+ }
+ }, {
+ key: 'buildDatasets',
+ value: function buildDatasets(legends, maxIndex, minIndex) {
+ return this.buildTicks.apply(this, arguments);
+ }
- // Some versions of FF have rAF but not cAF
- if (!raf || !caf) {
- (function () {
- var last = 0,
- id = 0,
- queue = [],
- frameDuration = 1000 / 60;
+ /**
+ * Get one point by a value
+ * @param {number} index - The index of category
+ */
- raf = function raf(callback) {
- if (queue.length === 0) {
- var _now = now(),
- next = Math.max(0, frameDuration - (_now - last));
- last = next + _now;
- setTimeout(function () {
- var cp = queue.slice(0);
- // Clear queue here to prevent
- // callbacks from appending listeners
- // to the current frame's queue
- queue.length = 0;
- for (var _i = 0; _i < cp.length; _i++) {
- if (!cp[_i].cancelled) {
- try {
- cp[_i].callback(last);
- } catch (e) {
- setTimeout(function () {
- throw e;
- }, 0);
- }
- }
- }
- }, Math.round(next));
- }
- queue.push({
- handle: ++id,
- callback: callback,
- cancelled: false
- });
- return id;
- };
+ }, {
+ key: 'getPoint',
+ value: function getPoint(index) {
+ return this.getTicksPosition(index);
+ }
+ }]);
- caf = function caf(handle) {
- for (var _i2 = 0; _i2 < queue.length; _i2++) {
- if (queue[_i2].handle === handle) {
- queue[_i2].cancelled = true;
- }
- }
- };
- })();
- }
+ return WxCategoryScale;
+ }(_scale2.default);
- module.exports = function (fn) {
- // Wrap in a new function to prevent
- // `cancel` potentially being assigned
- // to the native rAF function
- return raf.call(root, fn);
- };
- module.exports._root = root;
- module.exports.cancel = function () {
- caf.apply(root, arguments);
- };
- module.exports.polyfill = function () {
- root.requestAnimationFrame = raf;
- root.cancelAnimationFrame = caf;
- };
- }).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
- }, { "../util/helper": 24, "performance-now": 8 }], 26: [function (require, module, exports) {
+ exports.default = WxCategoryScale;
+ }, { "../core/scale": 19, "../util/helper": 25 }], 22: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
- // Modified from randomColor by David Merfield under the CC0 license
- // https://github.com/davidmerfield/randomColor/
- var seed = null;
-
- // Shared color dictionary
- var colorDictionary = {};
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
- // Populate the color dictionary
- loadColorBounds();
+ var _scale = require('../core/scale');
- var randomColor = function randomColor(options) {
+ var _scale2 = _interopRequireDefault(_scale);
- options = options || {};
+ var _layout = require('../core/layout');
- // Check if there is a seed and ensure it's an
- // integer. Otherwise, reset the seed value.
- if (options.seed !== undefined && options.seed !== null && options.seed === parseInt(options.seed, 10)) {
- seed = options.seed;
+ var _layout2 = _interopRequireDefault(_layout);
- // A string was passed as a seed
- } else if (typeof options.seed === 'string') {
- seed = stringToInteger(options.seed);
+ var _helper = require('../util/helper');
- // Something was passed as a seed but it wasn't an integer or string
- } else if (options.seed !== undefined && options.seed !== null) {
- throw new TypeError('The seed value must be an integer or string');
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+ }
- // No seed, reset the value outside.
- } else {
- seed = null;
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
}
+ }
- var H = void 0,
- S = void 0,
- B = void 0;
+ var WX_CROSSSCALE_CONFIG = {
+ xMargin: undefined, // undefined, a number or a function
+ xFirstPointSpace: 'auto' };
+ /**
+ * An cross scale helper
+ */
- // Check if we need to generate multiple colors
- if (options.count !== null && options.count !== undefined) {
+ var WxCrossScale = function () {
+ /**
+ * @constructor
+ * @param {WxScale} xScale - x-Axis instance
+ * @param {WxScale} yScale - y-Axis instance
+ * @param {Object} [config]
+ */
+ function WxCrossScale(xScale, yScale, config) {
+ _classCallCheck(this, WxCrossScale);
- var totalColors = options.count,
- colors = [];
+ if (!xScale instanceof _scale2.default && !yScale instanceof _scale2.default) {
+ throw new Error('Should be an WxScale instance');
+ }
- options.count = null;
+ var me = this;
+ me.xScale = xScale;
+ me.yScale = yScale;
- while (totalColors > colors.length) {
+ me.config = (0, _helper.extend)(true, {}, WX_CROSSSCALE_CONFIG, config);
+ }
- // Since we're generating multiple colors,
- // incremement the seed. Otherwise we'd just
- // generate the same color each time...
- if (seed && options.seed) options.seed += 1;
+ /**
+ * Draw a cross scale
+ */
- colors.push(randomColor(options));
- }
+ _createClass(WxCrossScale, [{
+ key: 'draw',
+ value: function draw(area, xScaleDatasets, yScaleDatasets) {
+ var me = this,
+ _me$config = me.config,
+ xMargin = _me$config.xMargin,
+ xFirstPointSpace = _me$config.xFirstPointSpace;
- options.count = totalColors;
+ me.yScale.init(yScaleDatasets);
+ var yBox = me.yScale.calculateBox(area, yScaleDatasets);
+ me.xScale.init(xScaleDatasets);
+ var xBox = me.xScale.calculateBox(area, xScaleDatasets);
- return colors;
- }
+ // Y-Base
+ var yMHeight = xBox.outerHeight - xBox.marginTB - me.xScale.lineSpace;
+ //yBox.y = yBox.y + yMHeight*2;
+ me.yScale.config.fixPadding = yMHeight * 2;
- // First we pick a hue (H)
- H = pickHue(options);
+ // Adjust X-BOX
+ var xMWidth = yBox.outerWidth - yBox.marginLR - me.yScale.lineSpace;
- // Then use H to determine saturation (S)
- S = pickSaturation(H, options);
+ var xOffset = xMWidth - me.xScale.fixPadding / 2;
- // Then use S and H to determine brightness (B).
- B = pickBrightness(H, S, options);
+ var xExtendLeft = void 0;
+ if (xFirstPointSpace === 'auto') {
+ xExtendLeft = me.xScale.config.extendLeft || Math.min(xBox.width / 10, me.xScale.calculateTickWidth(xScaleDatasets, xBox) / xScaleDatasets.length);
+ } else if (xFirstPointSpace === 0) {
+ // Zero y-space; The first point of Y will overlap the last point of X, so remove the last point of X
+ yScaleDatasets[yScaleDatasets.length - 1].text = '';
+ xExtendLeft = 0;
+ } else if (_helper.is.Function(xFirstPointSpace)) {
+ xExtendLeft = xFirstPointSpace(xBox, yBox, area, me.xScale, me.yScale, xScaleDatasets, yScaleDatasets);
+ } else {
+ xExtendLeft = parseFloat(xFirstPointSpace);
+ }
- // Then we return the HSB color in the desired format
- return setFormat([H, S, B], options);
- };
+ xOffset -= me.xScale.config.ticks.lineWidth || 1;
+ xOffset += xExtendLeft;
- function pickHue(options) {
+ var xAxisXPoint = area.x + xOffset;
+ if (_helper.is.Function(xMargin)) {
+ xMargin = xMargin(xBox, yBox, area, me.xScale, me.yScale, xScaleDatasets, yScaleDatasets);
+ } else if (!xMargin || !_helper.is.Number(xMargin)) {
+ xMargin = 0;
+ }
- var hueRange = getHueRange(options.hue),
- hue = randomWithin(hueRange);
+ var calXbox = new _layout.BoxInstance(xBox.position, xAxisXPoint, xBox.y, xBox.width - xOffset - xMargin, xBox.height, xBox.outerWidth - xOffset, xBox.outerHeight);
+ me.yScale.setBox(yBox, false);
+ me.yScale.update(yScaleDatasets);
- // Instead of storing red as two seperate ranges,
- // we group them, using negative numbers
- if (hue < 0) {
- hue = 360 + hue;
- }
+ me.xScale.setBox(calXbox, false);
+ me.xScale.config.extendLeft = xExtendLeft;
+ me.xScale.update(xScaleDatasets);
- return hue;
- }
+ return { xBox: calXbox, yBox: yBox };
+ }
+ }]);
- function pickSaturation(hue, options) {
+ return WxCrossScale;
+ }();
- if (options.luminosity === 'random') {
- return randomWithin([0, 100]);
- }
+ exports.default = WxCrossScale;
+ }, { "../core/layout": 17, "../core/scale": 19, "../util/helper": 25 }], 23: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
+ 'use strict';
- if (options.hue === 'monochrome') {
- return 0;
- }
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
- var saturationRange = getSaturationRange(hue);
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
- var sMin = saturationRange[0],
- sMax = saturationRange[1];
+ var _scale = require('../core/scale');
- switch (options.luminosity) {
+ var _scale2 = _interopRequireDefault(_scale);
- case 'bright':
- sMin = 55;
- break;
+ var _helper = require('../util/helper');
- case 'dark':
- sMin = sMax - 10;
- break;
+ function _interopRequireDefault(obj) {
+ return obj && obj.__esModule ? obj : { default: obj };
+ }
- case 'light':
- sMax = 55;
- break;
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
}
-
- return randomWithin([sMin, sMax]);
}
- function pickBrightness(H, S, options) {
-
- var bMin = getMinimumBrightness(H, S),
- bMax = 100;
+ function _possibleConstructorReturn(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && ((typeof call === "undefined" ? "undefined" : _typeof2(call)) === "object" || typeof call === "function") ? call : self;
+ }
- switch (options.luminosity) {
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : _typeof2(superClass)));
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
+ }
- case 'dark':
- bMax = bMin + 20;
- break;
+ /**
+ * @class Liner scale
+ */
+ var WxLinerScale = function (_WxScale) {
+ _inherits(WxLinerScale, _WxScale);
- case 'light':
- bMin = (bMax + bMin) / 2;
- break;
+ function WxLinerScale() {
+ _classCallCheck(this, WxLinerScale);
- case 'random':
- bMin = 0;
- bMax = 100;
- break;
+ return _possibleConstructorReturn(this, (WxLinerScale.__proto__ || Object.getPrototypeOf(WxLinerScale)).apply(this, arguments));
}
- return randomWithin([bMin, bMax]);
- }
+ _createClass(WxLinerScale, [{
+ key: 'buildTicks',
- function setFormat(hsv, options) {
+ /**
+ * Build a ticks array by max/min value
+ * Use to generator liner scale ticks
+ *
+ * @param {number} max - Max value
+ * @param {number} min - Min value
+ * @param {number} maxTicks - The maxinum number of ticks
+ * @param {number} [stepSize] - Special space size
+ *
+ * @return {Array} The ticks data
+ */
+ value: function buildTicks(max, min, maxTicks, stepSize) {
+ var spacing = void 0,
+ ticks = [];
+ if (!!stepSize && stepSize > 0) {
+ spacing = stepSize;
+ } else {
+ var niceRange = (0, _helper.niceNum)(max - min, false);
+ spacing = (0, _helper.niceNum)(niceRange / (maxTicks - 1), true);
+ }
- switch (options.format) {
+ var niceMin = Math.floor(min / spacing) * spacing;
+ var niceMax = Math.ceil(max / spacing) * spacing;
+ var numSpaces = (niceMax - niceMin) / spacing;
- case 'hsvArray':
- return hsv;
+ if ((0, _helper.almostEquals)(numSpaces, Math.round(numSpaces), spacing / 1000)) {
+ numSpaces = Math.round(numSpaces);
+ } else {
+ numSpaces = Math.ceil(numSpaces);
+ }
- case 'hslArray':
- return HSVtoHSL(hsv);
+ for (var j = 0; j < numSpaces; j++) {
+ ticks.push(niceMin + j * spacing);
+ }
+ ticks.push(niceMax);
- case 'hsl':
- var hsl = HSVtoHSL(hsv);
- return 'hsl(' + hsl[0] + ', ' + hsl[1] + '%, ' + hsl[2] + '%)';
+ return ticks;
+ }
- case 'hsla':
- var hslColor = HSVtoHSL(hsv);
- var alpha = options.alpha || Math.random();
- return 'hsla(' + hslColor[0] + ', ' + hslColor[1] + '%, ' + hslColor[2] + '%, ' + alpha + ')';
+ /**
+ * Build a datasets base on buildTicks
+ *
+ * @param {number} max - Max value
+ * @param {number} min - Min value
+ * @param {number} maxTicks - The maximum number of ticks
+ * @param {number} [stepSize] - Assign the space size
+ * @param {Object} [scaleOptions] - Assign the dataset item's options
+ *
+ * @return {Array} The ticks data
+ */
- case 'rgbArray':
- return HSVtoRGB(hsv);
+ }, {
+ key: 'buildDatasets',
+ value: function buildDatasets(max, min, maxTicks, stepSize, scaleOptions) {
+ var me = this;
+ var ticks = me.buildTicks(max, min, maxTicks, stepSize);
+ if (!me.isHorizontal()) ticks.reverse();
+ return ticks.map(function (val) {
+ return (0, _helper.extend)({
+ text: val + '',
+ value: val
+ }, scaleOptions);
+ });
+ }
- case 'rgb':
- var rgb = HSVtoRGB(hsv);
- return 'rgb(' + rgb.join(', ') + ')';
+ /**
+ * Calculate the maximum ticks of scale
+ *
+ * @param {BoxInstance} area - area of chart
+ * @param {WxCanvasRenderingContext2D} ctx - Content of chart
+ * @returns {number} maxTicks
+ */
- case 'rgba':
- var rgbColor = HSVtoRGB(hsv);
- var alpha = options.alpha || Math.random();
- return 'rgba(' + rgbColor.join(', ') + ', ' + alpha + ')';
+ }, {
+ key: 'calculateTickLimit',
+ value: function calculateTickLimit(area, ctx) {
+ var me = this,
+ fontSize = ctx.fontSize;
+ var maxTicks = void 0;
+ var tickOpts = me.config.ticks;
- default:
- return HSVtoHex(hsv);
- }
- }
+ if (me.isHorizontal()) {
+ maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(area.width / 50));
+ } else {
+ // The factor of 2 used to scale the font size has been experimentally determined.
+ maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(area.height / (2 * fontSize)));
+ }
- function getMinimumBrightness(H, S) {
+ return maxTicks;
+ }
- var lowerBounds = getColorInfo(H).lowerBounds;
+ /**
+ * Get one point by a value
+ * **Must** run after 'setBox' or 'update'
+ * @param {number} value
+ * @returns {object} point
+ *
+ */
- for (var i = 0; i < lowerBounds.length - 1; i++) {
+ }, {
+ key: 'getPoint',
+ value: function getPoint(value) {
+ var me = this,
+ box = this.box;
+ var pointX = void 0,
+ pointY = void 0;
- var s1 = lowerBounds[i][0],
- v1 = lowerBounds[i][1];
+ var startVal = parseInt(me.visDatasets[0].value),
+ endVal = parseInt(me.visDatasets[me.visDatasets.length - 1].value);
+ // if (!me.isHorizontal()) {
+ // [startVal,endVal] = [endVal,startVal];
+ // }
+ var range = endVal - startVal;
- var s2 = lowerBounds[i + 1][0],
- v2 = lowerBounds[i + 1][1];
+ if (me.isHorizontal()) {
+ var realWidth = me.getTicksPosition(me.visDatasets.length - 1).x - me.getTicksPosition(0).x;
+ pointX = me.getTicksPosition(0).x + realWidth / range * (value - startVal);
+ pointY = me.position === 'top' ? box.ry - me.lineSpace : box.ly + me.lineSpace;
+ } else {
+ var realHeight = me.getTicksPosition(me.visDatasets.length - 1).y - me.getTicksPosition(0).y;
+ pointX = me.position === 'left' ? box.rx - me.lineSpace : box.lx + me.lineSpace;
+ pointY = me.getTicksPosition(0).y + realHeight / range * (value - startVal);
+ }
+ return { x: Math.round(pointX), y: Math.round(pointY) };
+ }
+ }]);
- if (S >= s1 && S <= s2) {
+ return WxLinerScale;
+ }(_scale2.default);
- var m = (v2 - v1) / (s2 - s1),
- b = v1 - m * s1;
+ exports.default = WxLinerScale;
+ }, { "../core/scale": 19, "../util/helper": 25 }], 24: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
+ 'use strict';
- return m * S + b;
+ /**
+ * An mixin class(implement by es6-mixins) for stacked point
+ */
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
}
- }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
- return 0;
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
}
- function getHueRange(colorInput) {
+ var WxStackMixin = function () {
+ function WxStackMixin() {
+ _classCallCheck(this, WxStackMixin);
+ }
- if (typeof parseInt(colorInput) === 'number') {
+ _createClass(WxStackMixin, [{
+ key: 'stackYScaleAxisLimit',
- var number = parseInt(colorInput);
+ /**
+ * Calculate the yAxis data for *WxLinerScale*
+ */
+ value: function stackYScaleAxisLimit() {
+ var me = this;
+ var min = 0,
+ max = 0;
+ me.visDatasets.forEach(function (data) {
+ var sumNeg = 0,
+ sumPos = 0;
+ me.legends.forEach(function (legend) {
+ var key = legend.key;
+ var stackedVal = data[key];
+ if (stackedVal < 0) {
+ sumNeg += stackedVal || 0;
+ } else {
+ sumPos += stackedVal || 0;
+ }
+ });
+ data.__sumNeg = sumNeg;
+ data.__sumPos = sumPos;
+ if (sumNeg < min) min = sumNeg;
+ if (sumPos > max) max = sumPos;
+ });
- if (number < 360 && number > 0) {
- return [number, number];
+ return { max: max, min: min };
}
- }
+ /**
+ * Calculate the stack value
+ * @param {number} index - The index of item
+ * @param {Object} legendIndex - The index of legend
+ * @param {number} [offset=0] - The offset value of stack
+ * @param {WxScale} [yScale=this.yAxis] - Y-Axis instance
+ * @return {{sumNeg: number, sumPos: number}}
+ * @private
+ */
- if (typeof colorInput === 'string') {
+ }, {
+ key: '_getStackValue',
+ value: function _getStackValue(index, legendIndex) {
+ var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
+ var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;
- if (colorDictionary[colorInput]) {
- var color = colorDictionary[colorInput];
- if (color.hueRange) {
- return color.hueRange;
+ var me = this,
+ data = me.visDatasets[index];
+
+ var stackedVal = void 0,
+ sumNeg = 0,
+ sumPos = 0;
+ for (var j = 0; j < legendIndex; j++) {
+ stackedVal = data[me.legends[j].key];
+ if (stackedVal < 0) {
+ sumNeg += stackedVal || 0;
+ } else {
+ sumPos += stackedVal || 0;
+ }
}
+ return {
+ sumNeg: sumNeg,
+ sumPos: sumPos
+ };
}
- }
- return [0, 360];
- }
+ /**
+ * Calculate the stack bar
+ * @param {number} index - The index of item
+ * @param {Object} legendIndex - The index of legend
+ * @param {number} [offsetValue=0] - The offset value of stack
+ * @param {WxScale} [yScale=this.yAxis] - Y-Axis instance
+ * @return {Object}
+ * @private
+ */
- function getSaturationRange(hue) {
- return getColorInfo(hue).saturationRange;
- }
+ }, {
+ key: '_getStackPoint',
+ value: function _getStackPoint(index, legendIndex) {
+ var offsetValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
+ var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;
- function getColorInfo(hue) {
+ var me = this,
+ data = me.visDatasets[index],
+ value = data[me.legends[legendIndex].key];
- // Maps red colors to make picking hue easier
- if (hue >= 334 && hue <= 360) {
- hue -= 360;
- }
+ var _me$_getStackValue = me._getStackValue(index, legendIndex, offsetValue, yScale),
+ sumNeg = _me$_getStackValue.sumNeg,
+ sumPos = _me$_getStackValue.sumPos;
- for (var colorName in colorDictionary) {
- var color = colorDictionary[colorName];
- if (color.hueRange && hue >= color.hueRange[0] && hue <= color.hueRange[1]) {
- return colorDictionary[colorName];
+ return value < 0 ? yScale.getPoint(sumNeg + value + offsetValue) : yScale.getPoint(sumPos + value + offsetValue);
}
- }
- return 'Color not found';
- }
+ }]);
- function randomWithin(range) {
- if (seed === null) {
- return Math.floor(range[0] + Math.random() * (range[1] + 1 - range[0]));
- } else {
- //Seeded random algorithm from http://indiegamr.com/generate-repeatable-random-numbers-in-js/
- var max = range[1] || 1;
- var min = range[0] || 0;
- seed = (seed * 9301 + 49297) % 233280;
- var rnd = seed / 233280.0;
- return Math.floor(min + rnd * (max - min));
- }
- }
+ return WxStackMixin;
+ }();
- function HSVtoHex(hsv) {
+ exports.default = WxStackMixin;
+ }, {}], 25: [function (require, module, exports) {
+ /* global module, wx, window: false, document: false */
+ 'use strict';
- var rgb = HSVtoRGB(hsv);
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
- function componentToHex(c) {
- var hex = c.toString(16);
- return hex.length == 1 ? '0' + hex : hex;
- }
+ var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
+ return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
+ } : function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
+ };
- var hex = '#' + componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);
+ exports.sum = sum;
+ exports.checkWX = checkWX;
+ exports.wxConverToPx = wxConverToPx;
+ exports.toRadians = toRadians;
+ exports.toDegrees = toDegrees;
+ exports.getWindowSize = getWindowSize;
+ exports.getDPR = getDPR;
+ exports.niceNum = niceNum;
+ exports.almostEquals = almostEquals;
+ exports.splineCurve = splineCurve;
+ exports.getStyle = getStyle;
+ exports.readUsedSize = readUsedSize;
+ exports.retinaScale = retinaScale;
- return hex;
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
+ arr2[i] = arr[i];
+ }return arr2;
+ } else {
+ return Array.from(arr);
+ }
}
- function defineColor(name, hueRange, lowerBounds) {
+ var ObjProto = Object.prototype;
- var sMin = lowerBounds[0][0],
- sMax = lowerBounds[lowerBounds.length - 1][0],
- bMin = lowerBounds[lowerBounds.length - 1][1],
- bMax = lowerBounds[0][1];
+ // IS function, check variable's type
+ var is = exports.is = {};
- colorDictionary[name] = {
- hueRange: hueRange,
- lowerBounds: lowerBounds,
- saturationRange: [sMin, sMax],
- brightnessRange: [bMin, bMax]
+ ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'].forEach(function (name) {
+ is[name] = function (obj) {
+ return ObjProto.toString.call(obj) === '[object ' + name + ']';
};
- }
-
- function loadColorBounds() {
-
- defineColor('monochrome', null, [[0, 0], [100, 0]]);
-
- defineColor('red', [-26, 18], [[20, 100], [30, 92], [40, 89], [50, 85], [60, 78], [70, 70], [80, 60], [90, 55], [100, 50]]);
-
- defineColor('orange', [19, 46], [[20, 100], [30, 93], [40, 88], [50, 86], [60, 85], [70, 70], [100, 70]]);
-
- defineColor('yellow', [47, 62], [[25, 100], [40, 94], [50, 89], [60, 86], [70, 84], [80, 82], [90, 80], [100, 75]]);
-
- defineColor('green', [63, 178], [[30, 100], [40, 90], [50, 85], [60, 81], [70, 74], [80, 64], [90, 50], [100, 40]]);
-
- defineColor('blue', [179, 257], [[20, 100], [30, 86], [40, 80], [50, 74], [60, 60], [70, 52], [80, 44], [90, 39], [100, 35]]);
+ });
- defineColor('purple', [258, 282], [[20, 100], [30, 87], [40, 79], [50, 70], [60, 65], [70, 59], [80, 52], [90, 45], [100, 42]]);
+ // Is a given value an array?
+ // Delegates to ECMA5's native Array.isArray
+ is['Array'] = Array.isArray || function (obj) {
+ return ObjProto.toString.call(obj) === '[object Array]';
+ };
- defineColor('pink', [283, 334], [[20, 100], [30, 90], [40, 86], [60, 84], [80, 80], [90, 75], [100, 73]]);
- }
+ // Is a given variable an object?
+ is['Object'] = function (obj) {
+ var type = typeof obj === 'undefined' ? 'undefined' : _typeof(obj);
+ return type === 'function' || type === 'object' && !!obj;
+ };
- function HSVtoRGB(hsv) {
+ var class2type = {};
+ var toString = class2type.toString;
+ var hasOwn = class2type.hasOwnProperty;
+ var fnToString = hasOwn.toString;
+ var ObjectFunctionString = fnToString.call(Object);
+ // Is a given variable an object?
+ is['PureObject'] = function (obj) {
+ var proto = void 0,
+ Ctor = void 0;
- // this doesn't work for the values of 0 and 360
- // here's the hacky fix
- var h = hsv[0];
- if (h === 0) {
- h = 1;
- }
- if (h === 360) {
- h = 359;
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if (!obj || ObjProto.toString.call(obj) !== "[object Object]") {
+ return false;
}
- // Rebase the h,s,v values
- h = h / 360;
- var s = hsv[1] / 100,
- v = hsv[2] / 100;
-
- var h_i = Math.floor(h * 6),
- f = h * 6 - h_i,
- p = v * (1 - s),
- q = v * (1 - f * s),
- t = v * (1 - (1 - f) * s),
- r = 256,
- g = 256,
- b = 256;
-
- switch (h_i) {
- case 0:
- r = v;
- g = t;
- b = p;
- break;
- case 1:
- r = q;
- g = v;
- b = p;
- break;
- case 2:
- r = p;
- g = v;
- b = t;
- break;
- case 3:
- r = p;
- g = q;
- b = v;
- break;
- case 4:
- r = t;
- g = p;
- b = v;
- break;
- case 5:
- r = v;
- g = p;
- b = q;
- break;
+ proto = Object.getPrototypeOf(obj);
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if (!proto) {
+ return true;
}
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
+ };
- var result = [Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)];
- return result;
- }
+ is['Boolean'] = function (obj) {
+ return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+ };
- function HSVtoHSL(hsv) {
- var h = hsv[0],
- s = hsv[1] / 100,
- v = hsv[2] / 100,
- k = (2 - s) * v;
+ // Is a given value equal to null?
+ is['Null'] = function (obj) {
+ return obj === null;
+ };
- return [h, Math.round(s * v / (k < 1 ? k : 2 - k) * 10000) / 100, k / 2 * 100];
- }
+ // Is a given variable undefined?
+ is['Undefined'] = function (obj) {
+ return obj === void 0;
+ };
- function stringToInteger(string) {
- var total = 0;
- for (var i = 0; i !== string.length; i++) {
- if (total >= Number.MAX_SAFE_INTEGER) break;
- total += string.charCodeAt(i);
- }
- return total;
- }
+ // Is the given value `NaN`? (NaN is the only number which does not equal itself).
+ is['NaN'] = function (obj) {
+ return is.Number(obj) && obj !== +obj;
+ };
- exports.default = randomColor;
- }, {}], 27: [function (require, module, exports) {
- "use strict";
+ // Some helper function
+ function sum() {
+ var args = Array.from(arguments);
+ var res = 0;
+ return args.reduce(function (a, b) {
+ return a + b;
+ }, 0);
+ }
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
+ // Some regex
+ var REG_HANZI = exports.REG_HANZI = /[\u4e00-\u9fa5]/;
+ var REG_ALPHABET = exports.REG_ALPHABET = /[a-zA-Z]/;
+ var REG_NUMBER = exports.REG_NUMBER = /[0-9]/;
+ var REG_ALPHABET_NUMBER = exports.REG_ALPHABET_NUMBER = /[0-9a-zA-Z]/;
- var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
- return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
- } : function (obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
- };
+ // Assign function generator
+ function _assignGenerator(own) {
+ var _copy = function _copy(target) {
+ var deep = true;
- // TinyColor v1.4.1
- // https://github.com/bgrins/TinyColor
- // Brian Grinstead, MIT License
+ for (var _len = arguments.length, source = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ source[_key - 1] = arguments[_key];
+ }
+ if (is.Boolean(target)) {
+ deep = target;
+ target = 0 in source ? source.shift() : null;
+ }
- var trimLeft = /^\s+/,
- trimRight = /\s+$/,
- tinyCounter = 0,
- mathRound = Math.round,
- mathMin = Math.min,
- mathMax = Math.max,
- mathRandom = Math.random;
+ if (is.Array(target)) {
+ source.forEach(function (sc) {
+ var _target;
- function tinycolor(color, opts) {
+ (_target = target).push.apply(_target, _toConsumableArray(sc));
+ });
+ } else if (is.Object(target)) {
+ source.forEach(function (sc) {
+ for (var key in sc) {
+ if (own && !sc.hasOwnProperty(key)) continue;
+ var so = sc[key],
+ to = target[key];
+ if (is.PureObject(so)) {
+ target[key] = deep ? extend(true, is.PureObject(to) ? to : {}, so) : so;
+ } else if (is.Array(so)) {
+ target[key] = deep ? extend(true, is.Array(to) ? to : [], so) : so;
+ } else {
+ target[key] = so;
+ }
+ }
+ });
+ }
+ // Do nothing
+ return target;
+ };
+ return _copy;
+ }
- color = color ? color : '';
- opts = opts || {};
+ /**
+ *
+ * Extend a given object
+ * @param {Boolean|Object|Array} target - target object or deep mark (default is true)
+ * @param {Array|Object} source - target object if the first argument represent the deep mark, otherwise the source for merging
+ * @returns {*}
+ */
+ var extend = exports.extend = _assignGenerator(false);
+ var extendOwn = exports.extendOwn = _assignGenerator(true);
+ /**
+ * Check WeiXin environment
+ */
+ function checkWX() {
+ return false === true || typeof wx != 'undefined' && (typeof wx === 'undefined' ? 'undefined' : _typeof(wx)) === 'object';
+ }
- // If input is already a tinycolor, return itself
- if (color instanceof tinycolor) {
- return color;
- }
- // If we are called as a function, call using new instead
- if (!(this instanceof tinycolor)) {
- return new tinycolor(color, opts);
+ var isWeiXinAPP = exports.isWeiXinAPP = checkWX();
+ /**
+ * Convert (rpx/rem) to px
+ * @param unit
+ */
+ var rpxReg = /([\d.]+)rpx/,
+ remReg = /([\d.]+)rem/;
+ function wxConverToPx(val) {
+ if (!isWeiXinAPP) {
+ return Number.parseInt(val);
}
- var rgb = inputToRGB(color);
- this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = mathRound(100 * this._a) / 100, this._format = opts.format || rgb.format;
- this._gradientType = opts.gradientType;
+ var windowSize = getWindowSize();
+ if (is.String(val)) {
+ var m = val.match(rpxReg);
+ if (!!m) {
+ return +m[1] * windowSize.windowWidth / 750;
+ }
+
+ m = val.match(remReg);
+ if (!!m) {
+ return +m[1] * windowSize.windowWidth / 20;
+ }
- // Don't let the range of [0,255] come back in [0,1].
- // Potentially lose a little bit of precision here, but will fix issues where
- // .5 gets interpreted as half of the total, instead of half of 1
- // If it was supposed to be 128, this was already taken care of by `inputToRgb`
- if (this._r < 1) {
- this._r = mathRound(this._r);
+ return Number.parseInt(val);
+ } else if (is.Number(val)) {
+ return val;
+ } else {
+ throw new Error('Convert px error');
}
- if (this._g < 1) {
- this._g = mathRound(this._g);
+ }
+
+ function toRadians(degrees) {
+ return degrees * (Math.PI / 180);
+ }
+ function toDegrees(radians) {
+ return radians * (180 / Math.PI);
+ }
+ /**
+ * Get window size (px)
+ * @returns {*}
+ */
+ function getWindowSize() {
+ var windowHeight = void 0,
+ windowWidth = void 0;
+ if (isWeiXinAPP) {
+ var ret = wx.getSystemInfoSync();
+ windowWidth = ret.windowWidth;
+ windowHeight = ret.windowHeight;
+ } else {
+ windowWidth = window.innerWidth;
+ windowHeight = window.innerHeight;
}
- if (this._b < 1) {
- this._b = mathRound(this._b);
+ return { windowWidth: windowWidth, windowHeight: windowHeight };
+ };
+
+ /**
+ * Get window's Device Pixel Ratio
+ */
+ function getDPR() {
+ if (isWeiXinAPP) {
+ var ret = wx.getSystemInfoSync();
+ return ret.pixelRatio;
+ } else {
+ return window.devicePixelRatio || 1;
}
+ };
- this._ok = rgb.ok;
- this._tc_id = tinyCounter++;
- }
+ var uid = exports.uid = function () {
+ var id = 0;
+ return function () {
+ id++;
+ return 'u' + id;
+ };
+ }();
- tinycolor.prototype = {
- isDark: function isDark() {
- return this.getBrightness() < 128;
- },
- isLight: function isLight() {
- return !this.isDark();
- },
- isValid: function isValid() {
- return this._ok;
- },
- getOriginalInput: function getOriginalInput() {
- return this._originalInput;
- },
- getFormat: function getFormat() {
- return this._format;
- },
- getAlpha: function getAlpha() {
- return this._a;
- },
- getBrightness: function getBrightness() {
- //http://www.w3.org/TR/AERT#color-contrast
- var rgb = this.toRgb();
- return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
- },
- getLuminance: function getLuminance() {
- //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
- var rgb = this.toRgb();
- var RsRGB, GsRGB, BsRGB, R, G, B;
- RsRGB = rgb.r / 255;
- GsRGB = rgb.g / 255;
- BsRGB = rgb.b / 255;
-
- if (RsRGB <= 0.03928) {
- R = RsRGB / 12.92;
- } else {
- R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
- }
- if (GsRGB <= 0.03928) {
- G = GsRGB / 12.92;
- } else {
- G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
- }
- if (BsRGB <= 0.03928) {
- B = BsRGB / 12.92;
+ function niceNum(range, round) {
+ var exponent = Math.floor(Math.log10(range));
+ var fraction = range / Math.pow(10, exponent);
+ var niceFraction = void 0;
+
+ if (round) {
+ if (fraction < 1.5) {
+ niceFraction = 1;
+ } else if (fraction < 3) {
+ niceFraction = 2;
+ } else if (fraction < 7) {
+ niceFraction = 5;
} else {
- B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
- }
- return 0.2126 * R + 0.7152 * G + 0.0722 * B;
- },
- setAlpha: function setAlpha(value) {
- this._a = boundAlpha(value);
- this._roundA = mathRound(100 * this._a) / 100;
- return this;
- },
- toHsv: function toHsv() {
- var hsv = rgbToHsv(this._r, this._g, this._b);
- return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
- },
- toHsvString: function toHsvString() {
- var hsv = rgbToHsv(this._r, this._g, this._b);
- var h = mathRound(hsv.h * 360),
- s = mathRound(hsv.s * 100),
- v = mathRound(hsv.v * 100);
- return this._a == 1 ? "hsv(" + h + ", " + s + "%, " + v + "%)" : "hsva(" + h + ", " + s + "%, " + v + "%, " + this._roundA + ")";
- },
- toHsl: function toHsl() {
- var hsl = rgbToHsl(this._r, this._g, this._b);
- return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
- },
- toHslString: function toHslString() {
- var hsl = rgbToHsl(this._r, this._g, this._b);
- var h = mathRound(hsl.h * 360),
- s = mathRound(hsl.s * 100),
- l = mathRound(hsl.l * 100);
- return this._a == 1 ? "hsl(" + h + ", " + s + "%, " + l + "%)" : "hsla(" + h + ", " + s + "%, " + l + "%, " + this._roundA + ")";
- },
- toHex: function toHex(allow3Char) {
- return rgbToHex(this._r, this._g, this._b, allow3Char);
- },
- toHexString: function toHexString(allow3Char) {
- return '#' + this.toHex(allow3Char);
- },
- toHex8: function toHex8(allow4Char) {
- return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
- },
- toHex8String: function toHex8String(allow4Char) {
- return '#' + this.toHex8(allow4Char);
- },
- toRgb: function toRgb() {
- return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };
- },
- toRgbString: function toRgbString() {
- return this._a == 1 ? "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
- },
- toPercentageRgb: function toPercentageRgb() {
- return {
- r: mathRound(bound01(this._r, 255) * 100) + "%",
- g: mathRound(bound01(this._g, 255) * 100) + "%",
- b: mathRound(bound01(this._b, 255) * 100) + "%",
- a: this._a
- };
- },
- toPercentageRgbString: function toPercentageRgbString() {
- return this._a == 1 ? "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
- },
- toName: function toName() {
- if (this._a === 0) {
- return "transparent";
+ niceFraction = 10;
}
+ } else if (fraction <= 1.0) {
+ niceFraction = 1;
+ } else if (fraction <= 2) {
+ niceFraction = 2;
+ } else if (fraction <= 5) {
+ niceFraction = 5;
+ } else {
+ niceFraction = 10;
+ }
- if (this._a < 1) {
- return false;
- }
+ return niceFraction * Math.pow(10, exponent);
+ }
- return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
- },
- toFilter: function toFilter(secondColor) {
- var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);
- var secondHex8String = hex8String;
- var gradientType = this._gradientType ? "GradientType = 1, " : "";
+ function almostEquals(a, b, epsilon) {
+ return Math.abs(a - b) < epsilon;
+ }
- if (secondColor) {
- var s = tinycolor(secondColor);
- secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);
- }
+ function splineCurve(firstPoint, middlePoint, afterPoint) {
+ var t = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.4;
- return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")";
- },
- toString: function toString(format) {
- var formatSet = !!format;
- format = format || this._format;
+ // Props to Rob Spencer at scaled innovation for his post on splining between points
+ // http://scaledinnovation.com/analytics/splines/aboutSplines.html
- var formattedString = false;
- var hasAlpha = this._a < 1 && this._a >= 0;
- var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
+ // This function must also respect "skipped" points
- if (needsAlphaFormat) {
- // Special case for "transparent", all other non-alpha formats
- // will return rgba when there is transparency.
- if (format === "name" && this._a === 0) {
- return this.toName();
- }
- return this.toRgbString();
- }
- if (format === "rgb") {
- formattedString = this.toRgbString();
- }
- if (format === "prgb") {
- formattedString = this.toPercentageRgbString();
- }
- if (format === "hex" || format === "hex6") {
- formattedString = this.toHexString();
- }
- if (format === "hex3") {
- formattedString = this.toHexString(true);
- }
- if (format === "hex4") {
- formattedString = this.toHex8String(true);
- }
- if (format === "hex8") {
- formattedString = this.toHex8String();
- }
- if (format === "name") {
- formattedString = this.toName();
- }
- if (format === "hsl") {
- formattedString = this.toHslString();
- }
- if (format === "hsv") {
- formattedString = this.toHsvString();
- }
+ var previous = !firstPoint ? middlePoint : firstPoint,
+ current = middlePoint,
+ next = !afterPoint ? middlePoint : afterPoint;
- return formattedString || this.toHexString();
- },
- clone: function clone() {
- return tinycolor(this.toString());
- },
+ var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));
+ var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));
- _applyModification: function _applyModification(fn, args) {
- var color = fn.apply(null, [this].concat([].slice.call(args)));
- this._r = color._r;
- this._g = color._g;
- this._b = color._b;
- this.setAlpha(color._a);
- return this;
- },
- lighten: function lighten() {
- return this._applyModification(_lighten, arguments);
- },
- brighten: function brighten() {
- return this._applyModification(_brighten, arguments);
- },
- darken: function darken() {
- return this._applyModification(_darken, arguments);
- },
- desaturate: function desaturate() {
- return this._applyModification(_desaturate, arguments);
- },
- saturate: function saturate() {
- return this._applyModification(_saturate, arguments);
- },
- greyscale: function greyscale() {
- return this._applyModification(_greyscale, arguments);
- },
- spin: function spin() {
- return this._applyModification(_spin, arguments);
- },
+ var s01 = d01 / (d01 + d12);
+ var s12 = d12 / (d01 + d12);
- _applyCombination: function _applyCombination(fn, args) {
- return fn.apply(null, [this].concat([].slice.call(args)));
- },
- analogous: function analogous() {
- return this._applyCombination(_analogous, arguments);
- },
- complement: function complement() {
- return this._applyCombination(_complement, arguments);
- },
- monochromatic: function monochromatic() {
- return this._applyCombination(_monochromatic, arguments);
- },
- splitcomplement: function splitcomplement() {
- return this._applyCombination(_splitcomplement, arguments);
- },
- triad: function triad() {
- return this._applyCombination(_triad, arguments);
- },
- tetrad: function tetrad() {
- return this._applyCombination(_tetrad, arguments);
- }
- };
+ // If all points are the same, s01 & s02 will be inf
+ s01 = isNaN(s01) ? 0 : s01;
+ s12 = isNaN(s12) ? 0 : s12;
+
+ var fa = t * s01; // scaling factor for triangle Ta
+ var fb = t * s12;
- // If input is an object, force 1 into "1.0" to handle ratios properly
- // String input requires "1.0" as input, so 1 will be treated as 1
- tinycolor.fromRatio = function (color, opts) {
- if ((typeof color === "undefined" ? "undefined" : _typeof(color)) == "object") {
- var newColor = {};
- for (var i in color) {
- if (color.hasOwnProperty(i)) {
- if (i === "a") {
- newColor[i] = color[i];
- } else {
- newColor[i] = convertToPercentage(color[i]);
- }
- }
+ return {
+ previous: {
+ x: current.x - fa * (next.x - previous.x),
+ y: current.y - fa * (next.y - previous.y)
+ },
+ next: {
+ x: current.x + fb * (next.x - previous.x),
+ y: current.y + fb * (next.y - previous.y)
}
- color = newColor;
+ };
+ }
+
+ /**
+ * Get element style
+ * @param element
+ */
+ function getStyle(element, property) {
+ return element.currentStyle ? element.currentStyle[property] : document.defaultView.getComputedStyle(element, null).getPropertyValue(property);
+ }
+ /**
+ * The 'used' size is the final value of a dimension property after all calculations have
+ * been performed. This method uses the computed style of `element` but returns undefined
+ * if the computed style is not expressed in pixels. That can happen in some cases where
+ * `element` has a size relative to its parent and this last one is not yet displayed,
+ * for example because of `display: none` on a parent node.
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value
+ * @param element
+ * @param property
+ * @returns {Number} Size in pixels or undefined if unknown.
+ */
+ function readUsedSize(element, property) {
+ var value = getStyle(element, property);
+ var matches = value && value.match(/(\d+)px/);
+ return matches ? Number(matches[1]) : undefined;
+ }
+ /**
+ * For retina screen
+ * @param ctx
+ * @param width
+ * @param height
+ */
+ function retinaScale(ctx, width, height) {
+ var pixelRatio = getDPR();
+ if (pixelRatio === 1) {
+ return;
}
- return tinycolor(color, opts);
- };
+ var canvas = ctx.canvas;
+ if (isWeiXinAPP) {
+ // Do I resize the height or width?
+ } else {
+ canvas.height = canvas.height * pixelRatio;
+ canvas.width = canvas.width * pixelRatio;
+ ctx.scale(pixelRatio, pixelRatio);
- // Given a string or object, convert that input to RGB
- // Possible string inputs:
- //
- // "red"
- // "#f00" or "f00"
- // "#ff0000" or "ff0000"
- // "#ff000000" or "ff000000"
- // "rgb 255 0 0" or "rgb (255, 0, 0)"
- // "rgb 1.0 0 0" or "rgb (1, 0, 0)"
- // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
- // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
- // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
- // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
- // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
- //
- function inputToRGB(color) {
+ // If no style has been set on the canvas, the render size is used as display size,
+ // making the chart visually bigger, so let's enforce it to the 'correct' values.
+ // See https://github.com/chartjs/Chart.js/issues/3575
+ canvas.style.height = height + 'px';
+ canvas.style.width = width + 'px';
+ }
+ }
+ }, {}], 26: [function (require, module, exports) {
+ (function (global) {
+ /* global module, wx, getApp, window: false, global:false, document: false */
+ 'use strict';
- var rgb = { r: 0, g: 0, b: 0 };
- var a = 1;
- var s = null;
- var v = null;
- var l = null;
- var ok = false;
- var format = false;
+ /**
+ * Modify from RAF(https://github.com/chrisdickinson/raf)
+ *
+ */
- if (typeof color == "string") {
- color = stringInputToObject(color);
- }
+ var _helper = require('../util/helper');
- if ((typeof color === "undefined" ? "undefined" : _typeof(color)) == "object") {
- if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
- rgb = rgbToRgb(color.r, color.g, color.b);
- ok = true;
- format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
- } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
- s = convertToPercentage(color.s);
- v = convertToPercentage(color.v);
- rgb = hsvToRgb(color.h, s, v);
- ok = true;
- format = "hsv";
- } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
- s = convertToPercentage(color.s);
- l = convertToPercentage(color.l);
- rgb = hslToRgb(color.h, s, l);
- ok = true;
- format = "hsl";
- }
+ var now = require('performance-now');
+ var root = void 0,
+ isWx = (0, _helper.checkWX)();
+ root = isWx ? {} : typeof window === 'undefined' ? global : window;
- if (color.hasOwnProperty("a")) {
- a = color.a;
- }
- }
+ var vendors = ['moz', 'webkit'],
+ suffix = 'AnimationFrame',
+ raf = root['request' + suffix],
+ caf = root['cancel' + suffix] || root['cancelRequest' + suffix];
- a = boundAlpha(a);
+ for (var i = 0; !raf && i < vendors.length; i++) {
+ raf = root[vendors[i] + 'Request' + suffix];
+ caf = root[vendors[i] + 'Cancel' + suffix] || root[vendors[i] + 'CancelRequest' + suffix];
+ }
- return {
- ok: ok,
- format: color.format || format,
- r: mathMin(255, mathMax(rgb.r, 0)),
- g: mathMin(255, mathMax(rgb.g, 0)),
- b: mathMin(255, mathMax(rgb.b, 0)),
- a: a
- };
- }
+ // Some versions of FF have rAF but not cAF
+ if (!raf || !caf) {
+ (function () {
+ var last = 0,
+ id = 0,
+ queue = [],
+ frameDuration = 1000 / 60;
- // Conversion Functions
- // --------------------
+ raf = function raf(callback) {
+ if (queue.length === 0) {
+ var _now = now(),
+ next = Math.max(0, frameDuration - (_now - last));
+ last = next + _now;
+ setTimeout(function () {
+ var cp = queue.slice(0);
+ // Clear queue here to prevent
+ // callbacks from appending listeners
+ // to the current frame's queue
+ queue.length = 0;
+ for (var _i = 0; _i < cp.length; _i++) {
+ if (!cp[_i].cancelled) {
+ try {
+ cp[_i].callback(last);
+ } catch (e) {
+ setTimeout(function () {
+ throw e;
+ }, 0);
+ }
+ }
+ }
+ }, Math.round(next));
+ }
+ queue.push({
+ handle: ++id,
+ callback: callback,
+ cancelled: false
+ });
+ return id;
+ };
- // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
- //
+ caf = function caf(handle) {
+ for (var _i2 = 0; _i2 < queue.length; _i2++) {
+ if (queue[_i2].handle === handle) {
+ queue[_i2].cancelled = true;
+ }
+ }
+ };
+ })();
+ }
- // `rgbToRgb`
- // Handle bounds / percentage checking to conform to CSS color spec
- //
- // *Assumes:* r, g, b in [0, 255] or [0, 1]
- // *Returns:* { r, g, b } in [0, 255]
- function rgbToRgb(r, g, b) {
- return {
- r: bound01(r, 255) * 255,
- g: bound01(g, 255) * 255,
- b: bound01(b, 255) * 255
+ module.exports = function (fn) {
+ // Wrap in a new function to prevent
+ // `cancel` potentially being assigned
+ // to the native rAF function
+ return raf.call(root, fn);
};
- }
+ module.exports._root = root;
+ module.exports.cancel = function () {
+ caf.apply(root, arguments);
+ };
+ module.exports.polyfill = function () {
+ root.requestAnimationFrame = raf;
+ root.cancelAnimationFrame = caf;
+ };
+ }).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
+ }, { "../util/helper": 25, "performance-now": 8 }], 27: [function (require, module, exports) {
+ 'use strict';
- // `rgbToHsl`
- // Converts an RGB color value to HSL.
- // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
- // *Returns:* { h, s, l } in [0,1]
- function rgbToHsl(r, g, b) {
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ // Modified from randomColor by David Merfield under the CC0 license
+ // https://github.com/davidmerfield/randomColor/
- r = bound01(r, 255);
- g = bound01(g, 255);
- b = bound01(b, 255);
+ var seed = null;
- var max = mathMax(r, g, b),
- min = mathMin(r, g, b);
- var h,
- s,
- l = (max + min) / 2;
+ // Shared color dictionary
+ var colorDictionary = {};
- if (max == min) {
- h = s = 0; // achromatic
- } else {
- var d = max - min;
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
- switch (max) {
- case r:
- h = (g - b) / d + (g < b ? 6 : 0);
- break;
- case g:
- h = (b - r) / d + 2;
- break;
- case b:
- h = (r - g) / d + 4;
- break;
- }
+ // Populate the color dictionary
+ loadColorBounds();
- h /= 6;
- }
+ var randomColor = function randomColor(options) {
- return { h: h, s: s, l: l };
- }
+ options = options || {};
- // `hslToRgb`
- // Converts an HSL color value to RGB.
- // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
- // *Returns:* { r, g, b } in the set [0, 255]
- function hslToRgb(h, s, l) {
- var r, g, b;
+ // Check if there is a seed and ensure it's an
+ // integer. Otherwise, reset the seed value.
+ if (options.seed !== undefined && options.seed !== null && options.seed === parseInt(options.seed, 10)) {
+ seed = options.seed;
- h = bound01(h, 360);
- s = bound01(s, 100);
- l = bound01(l, 100);
+ // A string was passed as a seed
+ } else if (typeof options.seed === 'string') {
+ seed = stringToInteger(options.seed);
- function hue2rgb(p, q, t) {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6) return p + (q - p) * 6 * t;
- if (t < 1 / 2) return q;
- if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
- return p;
- }
+ // Something was passed as a seed but it wasn't an integer or string
+ } else if (options.seed !== undefined && options.seed !== null) {
+ throw new TypeError('The seed value must be an integer or string');
- if (s === 0) {
- r = g = b = l; // achromatic
+ // No seed, reset the value outside.
} else {
- var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- var p = 2 * l - q;
- r = hue2rgb(p, q, h + 1 / 3);
- g = hue2rgb(p, q, h);
- b = hue2rgb(p, q, h - 1 / 3);
+ seed = null;
}
- return { r: r * 255, g: g * 255, b: b * 255 };
- }
+ var H = void 0,
+ S = void 0,
+ B = void 0;
- // `rgbToHsv`
- // Converts an RGB color value to HSV
- // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
- // *Returns:* { h, s, v } in [0,1]
- function rgbToHsv(r, g, b) {
+ // Check if we need to generate multiple colors
+ if (options.count !== null && options.count !== undefined) {
- r = bound01(r, 255);
- g = bound01(g, 255);
- b = bound01(b, 255);
+ var totalColors = options.count,
+ colors = [];
- var max = mathMax(r, g, b),
- min = mathMin(r, g, b);
- var h,
- s,
- v = max;
+ options.count = null;
- var d = max - min;
- s = max === 0 ? 0 : d / max;
+ while (totalColors > colors.length) {
- if (max == min) {
- h = 0; // achromatic
- } else {
- switch (max) {
- case r:
- h = (g - b) / d + (g < b ? 6 : 0);
- break;
- case g:
- h = (b - r) / d + 2;
- break;
- case b:
- h = (r - g) / d + 4;
- break;
+ // Since we're generating multiple colors,
+ // incremement the seed. Otherwise we'd just
+ // generate the same color each time...
+ if (seed && options.seed) options.seed += 1;
+
+ colors.push(randomColor(options));
}
- h /= 6;
+
+ options.count = totalColors;
+
+ return colors;
}
- return { h: h, s: s, v: v };
- }
- // `hsvToRgb`
- // Converts an HSV color value to RGB.
- // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
- // *Returns:* { r, g, b } in the set [0, 255]
- function hsvToRgb(h, s, v) {
+ // First we pick a hue (H)
+ H = pickHue(options);
- h = bound01(h, 360) * 6;
- s = bound01(s, 100);
- v = bound01(v, 100);
+ // Then use H to determine saturation (S)
+ S = pickSaturation(H, options);
- var i = Math.floor(h),
- f = h - i,
- p = v * (1 - s),
- q = v * (1 - f * s),
- t = v * (1 - (1 - f) * s),
- mod = i % 6,
- r = [v, q, p, p, t, v][mod],
- g = [t, v, v, q, p, p][mod],
- b = [p, p, t, v, v, q][mod];
+ // Then use S and H to determine brightness (B).
+ B = pickBrightness(H, S, options);
- return { r: r * 255, g: g * 255, b: b * 255 };
- }
+ // Then we return the HSB color in the desired format
+ return setFormat([H, S, B], options);
+ };
- // `rgbToHex`
- // Converts an RGB color to hex
- // Assumes r, g, and b are contained in the set [0, 255]
- // Returns a 3 or 6 character hex
- function rgbToHex(r, g, b, allow3Char) {
+ function pickHue(options) {
- var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];
+ var hueRange = getHueRange(options.hue),
+ hue = randomWithin(hueRange);
- // Return a 3 character hex if possible
- if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
- return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
+ // Instead of storing red as two seperate ranges,
+ // we group them, using negative numbers
+ if (hue < 0) {
+ hue = 360 + hue;
}
- return hex.join("");
+ return hue;
}
- // `rgbaToHex`
- // Converts an RGBA color plus alpha transparency to hex
- // Assumes r, g, b are contained in the set [0, 255] and
- // a in [0, 1]. Returns a 4 or 8 character rgba hex
- function rgbaToHex(r, g, b, a, allow4Char) {
+ function pickSaturation(hue, options) {
- var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)), pad2(convertDecimalToHex(a))];
+ if (options.luminosity === 'random') {
+ return randomWithin([0, 100]);
+ }
- // Return a 4 character hex if possible
- if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
- return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
+ if (options.hue === 'monochrome') {
+ return 0;
}
- return hex.join("");
- }
+ var saturationRange = getSaturationRange(hue);
- // `rgbaToArgbHex`
- // Converts an RGBA color to an ARGB Hex8 string
- // Rarely used, but required for "toFilter()"
- function rgbaToArgbHex(r, g, b, a) {
+ var sMin = saturationRange[0],
+ sMax = saturationRange[1];
- var hex = [pad2(convertDecimalToHex(a)), pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];
+ switch (options.luminosity) {
- return hex.join("");
- }
+ case 'bright':
+ sMin = 55;
+ break;
- // `equals`
- // Can be called with any tinycolor input
- tinycolor.equals = function (color1, color2) {
- if (!color1 || !color2) {
- return false;
- }
- return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
- };
+ case 'dark':
+ sMin = sMax - 10;
+ break;
- tinycolor.random = function () {
- return tinycolor.fromRatio({
- r: mathRandom(),
- g: mathRandom(),
- b: mathRandom()
- });
- };
+ case 'light':
+ sMax = 55;
+ break;
+ }
- // Modification Functions
- // ----------------------
- // Thanks to less.js for some of the basics here
- //
-
- function _desaturate(color, amount) {
- amount = amount === 0 ? 0 : amount || 10;
- var hsl = tinycolor(color).toHsl();
- hsl.s -= amount / 100;
- hsl.s = clamp01(hsl.s);
- return tinycolor(hsl);
+ return randomWithin([sMin, sMax]);
}
- function _saturate(color, amount) {
- amount = amount === 0 ? 0 : amount || 10;
- var hsl = tinycolor(color).toHsl();
- hsl.s += amount / 100;
- hsl.s = clamp01(hsl.s);
- return tinycolor(hsl);
- }
+ function pickBrightness(H, S, options) {
- function _greyscale(color) {
- return tinycolor(color).desaturate(100);
- }
+ var bMin = getMinimumBrightness(H, S),
+ bMax = 100;
- function _lighten(color, amount) {
- amount = amount === 0 ? 0 : amount || 10;
- var hsl = tinycolor(color).toHsl();
- hsl.l += amount / 100;
- hsl.l = clamp01(hsl.l);
- return tinycolor(hsl);
- }
+ switch (options.luminosity) {
- function _brighten(color, amount) {
- amount = amount === 0 ? 0 : amount || 10;
- var rgb = tinycolor(color).toRgb();
- rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * -(amount / 100))));
- rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * -(amount / 100))));
- rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * -(amount / 100))));
- return tinycolor(rgb);
- }
+ case 'dark':
+ bMax = bMin + 20;
+ break;
- function _darken(color, amount) {
- amount = amount === 0 ? 0 : amount || 10;
- var hsl = tinycolor(color).toHsl();
- hsl.l -= amount / 100;
- hsl.l = clamp01(hsl.l);
- return tinycolor(hsl);
- }
+ case 'light':
+ bMin = (bMax + bMin) / 2;
+ break;
+
+ case 'random':
+ bMin = 0;
+ bMax = 100;
+ break;
+ }
- // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
- // Values outside of this range will be wrapped into this range.
- function _spin(color, amount) {
- var hsl = tinycolor(color).toHsl();
- var hue = (hsl.h + amount) % 360;
- hsl.h = hue < 0 ? 360 + hue : hue;
- return tinycolor(hsl);
+ return randomWithin([bMin, bMax]);
}
- // Combination Functions
- // ---------------------
- // Thanks to jQuery xColor for some of the ideas behind these
- //
+ function setFormat(hsv, options) {
- function _complement(color) {
- var hsl = tinycolor(color).toHsl();
- hsl.h = (hsl.h + 180) % 360;
- return tinycolor(hsl);
- }
+ switch (options.format) {
- function _triad(color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h;
- return [tinycolor(color), tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })];
- }
+ case 'hsvArray':
+ return hsv;
- function _tetrad(color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h;
- return [tinycolor(color), tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })];
- }
+ case 'hslArray':
+ return HSVtoHSL(hsv);
- function _splitcomplement(color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h;
- return [tinycolor(color), tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l })];
- }
+ case 'hsl':
+ var hsl = HSVtoHSL(hsv);
+ return 'hsl(' + hsl[0] + ', ' + hsl[1] + '%, ' + hsl[2] + '%)';
- function _analogous(color, results, slices) {
- results = results || 6;
- slices = slices || 30;
+ case 'hsla':
+ var hslColor = HSVtoHSL(hsv);
+ var alpha = options.alpha || Math.random();
+ return 'hsla(' + hslColor[0] + ', ' + hslColor[1] + '%, ' + hslColor[2] + '%, ' + alpha + ')';
- var hsl = tinycolor(color).toHsl();
- var part = 360 / slices;
- var ret = [tinycolor(color)];
+ case 'rgbArray':
+ return HSVtoRGB(hsv);
- for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {
- hsl.h = (hsl.h + part) % 360;
- ret.push(tinycolor(hsl));
- }
- return ret;
- }
+ case 'rgb':
+ var rgb = HSVtoRGB(hsv);
+ return 'rgb(' + rgb.join(', ') + ')';
- function _monochromatic(color, results) {
- results = results || 6;
- var hsv = tinycolor(color).toHsv();
- var h = hsv.h,
- s = hsv.s,
- v = hsv.v;
- var ret = [];
- var modification = 1 / results;
+ case 'rgba':
+ var rgbColor = HSVtoRGB(hsv);
+ var alpha = options.alpha || Math.random();
+ return 'rgba(' + rgbColor.join(', ') + ', ' + alpha + ')';
- while (results--) {
- ret.push(tinycolor({ h: h, s: s, v: v }));
- v = (v + modification) % 1;
+ default:
+ return HSVtoHex(hsv);
}
-
- return ret;
}
- // Utility Functions
- // ---------------------
-
- tinycolor.mix = function (color1, color2, amount) {
- amount = amount === 0 ? 0 : amount || 50;
+ function getMinimumBrightness(H, S) {
- var rgb1 = tinycolor(color1).toRgb();
- var rgb2 = tinycolor(color2).toRgb();
+ var lowerBounds = getColorInfo(H).lowerBounds;
- var p = amount / 100;
+ for (var i = 0; i < lowerBounds.length - 1; i++) {
- var rgba = {
- r: (rgb2.r - rgb1.r) * p + rgb1.r,
- g: (rgb2.g - rgb1.g) * p + rgb1.g,
- b: (rgb2.b - rgb1.b) * p + rgb1.b,
- a: (rgb2.a - rgb1.a) * p + rgb1.a
- };
+ var s1 = lowerBounds[i][0],
+ v1 = lowerBounds[i][1];
- return tinycolor(rgba);
- };
+ var s2 = lowerBounds[i + 1][0],
+ v2 = lowerBounds[i + 1][1];
- // Readability Functions
- // ---------------------
- // = s1 && S <= s2) {
- // `contrast`
- // Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)
- tinycolor.readability = function (color1, color2) {
- var c1 = tinycolor(color1);
- var c2 = tinycolor(color2);
- return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);
- };
+ var m = (v2 - v1) / (s2 - s1),
+ b = v1 - m * s1;
- // `isReadable`
- // Ensure that foreground and background color combinations meet WCAG2 guidelines.
- // The third argument is an optional Object.
- // the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';
- // the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.
- // If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}.
-
- // *Example*
- // tinycolor.isReadable("#000", "#111") => false
- // tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
- tinycolor.isReadable = function (color1, color2, wcag2) {
- var readability = tinycolor.readability(color1, color2);
- var wcag2Parms, out;
-
- out = false;
-
- wcag2Parms = validateWCAG2Parms(wcag2);
- switch (wcag2Parms.level + wcag2Parms.size) {
- case "AAsmall":
- case "AAAlarge":
- out = readability >= 4.5;
- break;
- case "AAlarge":
- out = readability >= 3;
- break;
- case "AAAsmall":
- out = readability >= 7;
- break;
+ return m * S + b;
+ }
}
- return out;
- };
- // `mostReadable`
- // Given a base color and a list of possible foreground or background
- // colors for that base, returns the most readable color.
- // Optionally returns Black or White if the most readable color is unreadable.
- // *Example*
- // tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
- // tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff"
- // tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
- // tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
- tinycolor.mostReadable = function (baseColor, colorList, args) {
- var bestColor = null;
- var bestScore = 0;
- var readability;
- var includeFallbackColors, level, size;
- args = args || {};
- includeFallbackColors = args.includeFallbackColors;
- level = args.level;
- size = args.size;
-
- for (var i = 0; i < colorList.length; i++) {
- readability = tinycolor.readability(baseColor, colorList[i]);
- if (readability > bestScore) {
- bestScore = readability;
- bestColor = tinycolor(colorList[i]);
- }
- }
-
- if (tinycolor.isReadable(baseColor, bestColor, { "level": level, "size": size }) || !includeFallbackColors) {
- return bestColor;
- } else {
- args.includeFallbackColors = false;
- return tinycolor.mostReadable(baseColor, ["#fff", "#000"], args);
- }
- };
+ return 0;
+ }
- // Big List of Colors
- // ------------------
- //
- var names = tinycolor.names = {
- aliceblue: "f0f8ff",
- antiquewhite: "faebd7",
- aqua: "0ff",
- aquamarine: "7fffd4",
- azure: "f0ffff",
- beige: "f5f5dc",
- bisque: "ffe4c4",
- black: "000",
- blanchedalmond: "ffebcd",
- blue: "00f",
- blueviolet: "8a2be2",
- brown: "a52a2a",
- burlywood: "deb887",
- burntsienna: "ea7e5d",
- cadetblue: "5f9ea0",
- chartreuse: "7fff00",
- chocolate: "d2691e",
- coral: "ff7f50",
- cornflowerblue: "6495ed",
- cornsilk: "fff8dc",
- crimson: "dc143c",
- cyan: "0ff",
- darkblue: "00008b",
- darkcyan: "008b8b",
- darkgoldenrod: "b8860b",
- darkgray: "a9a9a9",
- darkgreen: "006400",
- darkgrey: "a9a9a9",
- darkkhaki: "bdb76b",
- darkmagenta: "8b008b",
- darkolivegreen: "556b2f",
- darkorange: "ff8c00",
- darkorchid: "9932cc",
- darkred: "8b0000",
- darksalmon: "e9967a",
- darkseagreen: "8fbc8f",
- darkslateblue: "483d8b",
- darkslategray: "2f4f4f",
- darkslategrey: "2f4f4f",
- darkturquoise: "00ced1",
- darkviolet: "9400d3",
- deeppink: "ff1493",
- deepskyblue: "00bfff",
- dimgray: "696969",
- dimgrey: "696969",
- dodgerblue: "1e90ff",
- firebrick: "b22222",
- floralwhite: "fffaf0",
- forestgreen: "228b22",
- fuchsia: "f0f",
- gainsboro: "dcdcdc",
- ghostwhite: "f8f8ff",
- gold: "ffd700",
- goldenrod: "daa520",
- gray: "808080",
- green: "008000",
- greenyellow: "adff2f",
- grey: "808080",
- honeydew: "f0fff0",
- hotpink: "ff69b4",
- indianred: "cd5c5c",
- indigo: "4b0082",
- ivory: "fffff0",
- khaki: "f0e68c",
- lavender: "e6e6fa",
- lavenderblush: "fff0f5",
- lawngreen: "7cfc00",
- lemonchiffon: "fffacd",
- lightblue: "add8e6",
- lightcoral: "f08080",
- lightcyan: "e0ffff",
- lightgoldenrodyellow: "fafad2",
- lightgray: "d3d3d3",
- lightgreen: "90ee90",
- lightgrey: "d3d3d3",
- lightpink: "ffb6c1",
- lightsalmon: "ffa07a",
- lightseagreen: "20b2aa",
- lightskyblue: "87cefa",
- lightslategray: "789",
- lightslategrey: "789",
- lightsteelblue: "b0c4de",
- lightyellow: "ffffe0",
- lime: "0f0",
- limegreen: "32cd32",
- linen: "faf0e6",
- magenta: "f0f",
- maroon: "800000",
- mediumaquamarine: "66cdaa",
- mediumblue: "0000cd",
- mediumorchid: "ba55d3",
- mediumpurple: "9370db",
- mediumseagreen: "3cb371",
- mediumslateblue: "7b68ee",
- mediumspringgreen: "00fa9a",
- mediumturquoise: "48d1cc",
- mediumvioletred: "c71585",
- midnightblue: "191970",
- mintcream: "f5fffa",
- mistyrose: "ffe4e1",
- moccasin: "ffe4b5",
- navajowhite: "ffdead",
- navy: "000080",
- oldlace: "fdf5e6",
- olive: "808000",
- olivedrab: "6b8e23",
- orange: "ffa500",
- orangered: "ff4500",
- orchid: "da70d6",
- palegoldenrod: "eee8aa",
- palegreen: "98fb98",
- paleturquoise: "afeeee",
- palevioletred: "db7093",
- papayawhip: "ffefd5",
- peachpuff: "ffdab9",
- peru: "cd853f",
- pink: "ffc0cb",
- plum: "dda0dd",
- powderblue: "b0e0e6",
- purple: "800080",
- rebeccapurple: "663399",
- red: "f00",
- rosybrown: "bc8f8f",
- royalblue: "4169e1",
- saddlebrown: "8b4513",
- salmon: "fa8072",
- sandybrown: "f4a460",
- seagreen: "2e8b57",
- seashell: "fff5ee",
- sienna: "a0522d",
- silver: "c0c0c0",
- skyblue: "87ceeb",
- slateblue: "6a5acd",
- slategray: "708090",
- slategrey: "708090",
- snow: "fffafa",
- springgreen: "00ff7f",
- steelblue: "4682b4",
- tan: "d2b48c",
- teal: "008080",
- thistle: "d8bfd8",
- tomato: "ff6347",
- turquoise: "40e0d0",
- violet: "ee82ee",
- wheat: "f5deb3",
- white: "fff",
- whitesmoke: "f5f5f5",
- yellow: "ff0",
- yellowgreen: "9acd32"
- };
+ function getHueRange(colorInput) {
- // Make it easy to access colors via `hexNames[hex]`
- var hexNames = tinycolor.hexNames = flip(names);
+ if (typeof parseInt(colorInput) === 'number') {
- // Utilities
- // ---------
+ var number = parseInt(colorInput);
- // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
- function flip(o) {
- var flipped = {};
- for (var i in o) {
- if (o.hasOwnProperty(i)) {
- flipped[o[i]] = i;
+ if (number < 360 && number > 0) {
+ return [number, number];
}
}
- return flipped;
- }
- // Return a valid alpha value [0,1] with all invalid values being set to 1
- function boundAlpha(a) {
- a = parseFloat(a);
+ if (typeof colorInput === 'string') {
- if (isNaN(a) || a < 0 || a > 1) {
- a = 1;
+ if (colorDictionary[colorInput]) {
+ var color = colorDictionary[colorInput];
+ if (color.hueRange) {
+ return color.hueRange;
+ }
+ }
}
- return a;
+ return [0, 360];
}
- // Take input from [0, n] and return it as [0, 1]
- function bound01(n, max) {
- if (isOnePointZero(n)) {
- n = "100%";
- }
+ function getSaturationRange(hue) {
+ return getColorInfo(hue).saturationRange;
+ }
- var processPercent = isPercentage(n);
- n = mathMin(max, mathMax(0, parseFloat(n)));
+ function getColorInfo(hue) {
- // Automatically convert percentage into number
- if (processPercent) {
- n = parseInt(n * max, 10) / 100;
+ // Maps red colors to make picking hue easier
+ if (hue >= 334 && hue <= 360) {
+ hue -= 360;
}
- // Handle floating point rounding errors
- if (Math.abs(n - max) < 0.000001) {
- return 1;
+ for (var colorName in colorDictionary) {
+ var color = colorDictionary[colorName];
+ if (color.hueRange && hue >= color.hueRange[0] && hue <= color.hueRange[1]) {
+ return colorDictionary[colorName];
+ }
}
-
- // Convert into [0, 1] range if it isn't already
- return n % max / parseFloat(max);
+ return 'Color not found';
}
- // Force a number between 0 and 1
- function clamp01(val) {
- return mathMin(1, mathMax(0, val));
+ function randomWithin(range) {
+ if (seed === null) {
+ return Math.floor(range[0] + Math.random() * (range[1] + 1 - range[0]));
+ } else {
+ //Seeded random algorithm from http://indiegamr.com/generate-repeatable-random-numbers-in-js/
+ var max = range[1] || 1;
+ var min = range[0] || 0;
+ seed = (seed * 9301 + 49297) % 233280;
+ var rnd = seed / 233280.0;
+ return Math.floor(min + rnd * (max - min));
+ }
}
- // Parse a base-16 hex value into a base-10 integer
- function parseIntFromHex(val) {
- return parseInt(val, 16);
- }
+ function HSVtoHex(hsv) {
- // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
- //
- function isOnePointZero(n) {
- return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
- }
+ var rgb = HSVtoRGB(hsv);
- // Check to see if string passed in is a percentage
- function isPercentage(n) {
- return typeof n === "string" && n.indexOf('%') != -1;
- }
+ function componentToHex(c) {
+ var hex = c.toString(16);
+ return hex.length == 1 ? '0' + hex : hex;
+ }
+
+ var hex = '#' + componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);
- // Force a hex value to have 2 characters
- function pad2(c) {
- return c.length == 1 ? '0' + c : '' + c;
+ return hex;
}
- // Replace a decimal with it's percentage value
- function convertToPercentage(n) {
- if (n <= 1) {
- n = n * 100 + "%";
- }
+ function defineColor(name, hueRange, lowerBounds) {
- return n;
- }
+ var sMin = lowerBounds[0][0],
+ sMax = lowerBounds[lowerBounds.length - 1][0],
+ bMin = lowerBounds[lowerBounds.length - 1][1],
+ bMax = lowerBounds[0][1];
- // Converts a decimal to a hex value
- function convertDecimalToHex(d) {
- return Math.round(parseFloat(d) * 255).toString(16);
- }
- // Converts a hex value to a decimal
- function convertHexToDecimal(h) {
- return parseIntFromHex(h) / 255;
+ colorDictionary[name] = {
+ hueRange: hueRange,
+ lowerBounds: lowerBounds,
+ saturationRange: [sMin, sMax],
+ brightnessRange: [bMin, bMax]
+ };
}
- var matchers = function () {
+ function loadColorBounds() {
- //
- var CSS_INTEGER = "[-\\+]?\\d+%?";
+ defineColor('monochrome', null, [[0, 0], [100, 0]]);
- //
- var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
+ defineColor('red', [-26, 18], [[20, 100], [30, 92], [40, 89], [50, 85], [60, 78], [70, 70], [80, 60], [90, 55], [100, 50]]);
- // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
- var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
+ defineColor('orange', [19, 46], [[20, 100], [30, 93], [40, 88], [50, 86], [60, 85], [70, 70], [100, 70]]);
- // Actual matching.
- // Parentheses and commas are optional, but not required.
- // Whitespace can take the place of commas or opening paren
- var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
- var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
+ defineColor('yellow', [47, 62], [[25, 100], [40, 94], [50, 89], [60, 86], [70, 84], [80, 82], [90, 80], [100, 75]]);
- return {
- CSS_UNIT: new RegExp(CSS_UNIT),
- rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
- rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
- hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
- hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
- hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
- hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
- hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
- hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
- hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
- hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
- };
- }();
+ defineColor('green', [63, 178], [[30, 100], [40, 90], [50, 85], [60, 81], [70, 74], [80, 64], [90, 50], [100, 40]]);
- // `isValidCSSUnit`
- // Take in a single string / number and check to see if it looks like a CSS unit
- // (see `matchers` above for definition).
- function isValidCSSUnit(color) {
- return !!matchers.CSS_UNIT.exec(color);
- }
+ defineColor('blue', [179, 257], [[20, 100], [30, 86], [40, 80], [50, 74], [60, 60], [70, 52], [80, 44], [90, 39], [100, 35]]);
- // `stringInputToObject`
- // Permissive string parsing. Take in a number of formats, and output an object
- // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
- function stringInputToObject(color) {
+ defineColor('purple', [258, 282], [[20, 100], [30, 87], [40, 79], [50, 70], [60, 65], [70, 59], [80, 52], [90, 45], [100, 42]]);
- color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();
- var named = false;
- if (names[color]) {
- color = names[color];
- named = true;
- } else if (color == 'transparent') {
- return { r: 0, g: 0, b: 0, a: 0, format: "name" };
- }
+ defineColor('pink', [283, 334], [[20, 100], [30, 90], [40, 86], [60, 84], [80, 80], [90, 75], [100, 73]]);
+ }
- // Try to match string input using regular expressions.
- // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
- // Just return an object and let the conversion functions handle that.
- // This way the result will be the same whether the tinycolor is initialized with string or object.
- var match;
- if (match = matchers.rgb.exec(color)) {
- return { r: match[1], g: match[2], b: match[3] };
- }
- if (match = matchers.rgba.exec(color)) {
- return { r: match[1], g: match[2], b: match[3], a: match[4] };
- }
- if (match = matchers.hsl.exec(color)) {
- return { h: match[1], s: match[2], l: match[3] };
- }
- if (match = matchers.hsla.exec(color)) {
- return { h: match[1], s: match[2], l: match[3], a: match[4] };
- }
- if (match = matchers.hsv.exec(color)) {
- return { h: match[1], s: match[2], v: match[3] };
- }
- if (match = matchers.hsva.exec(color)) {
- return { h: match[1], s: match[2], v: match[3], a: match[4] };
- }
- if (match = matchers.hex8.exec(color)) {
- return {
- r: parseIntFromHex(match[1]),
- g: parseIntFromHex(match[2]),
- b: parseIntFromHex(match[3]),
- a: convertHexToDecimal(match[4]),
- format: named ? "name" : "hex8"
- };
- }
- if (match = matchers.hex6.exec(color)) {
- return {
- r: parseIntFromHex(match[1]),
- g: parseIntFromHex(match[2]),
- b: parseIntFromHex(match[3]),
- format: named ? "name" : "hex"
- };
+ function HSVtoRGB(hsv) {
+
+ // this doesn't work for the values of 0 and 360
+ // here's the hacky fix
+ var h = hsv[0];
+ if (h === 0) {
+ h = 1;
}
- if (match = matchers.hex4.exec(color)) {
- return {
- r: parseIntFromHex(match[1] + '' + match[1]),
- g: parseIntFromHex(match[2] + '' + match[2]),
- b: parseIntFromHex(match[3] + '' + match[3]),
- a: convertHexToDecimal(match[4] + '' + match[4]),
- format: named ? "name" : "hex8"
- };
+ if (h === 360) {
+ h = 359;
}
- if (match = matchers.hex3.exec(color)) {
- return {
- r: parseIntFromHex(match[1] + '' + match[1]),
- g: parseIntFromHex(match[2] + '' + match[2]),
- b: parseIntFromHex(match[3] + '' + match[3]),
- format: named ? "name" : "hex"
- };
+
+ // Rebase the h,s,v values
+ h = h / 360;
+ var s = hsv[1] / 100,
+ v = hsv[2] / 100;
+
+ var h_i = Math.floor(h * 6),
+ f = h * 6 - h_i,
+ p = v * (1 - s),
+ q = v * (1 - f * s),
+ t = v * (1 - (1 - f) * s),
+ r = 256,
+ g = 256,
+ b = 256;
+
+ switch (h_i) {
+ case 0:
+ r = v;
+ g = t;
+ b = p;
+ break;
+ case 1:
+ r = q;
+ g = v;
+ b = p;
+ break;
+ case 2:
+ r = p;
+ g = v;
+ b = t;
+ break;
+ case 3:
+ r = p;
+ g = q;
+ b = v;
+ break;
+ case 4:
+ r = t;
+ g = p;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = p;
+ b = q;
+ break;
}
- return false;
+ var result = [Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)];
+ return result;
}
- function validateWCAG2Parms(parms) {
- // return valid WCAG2 parms for isReadable.
- // If input parms are invalid, return {"level":"AA", "size":"small"}
- var level, size;
- parms = parms || { "level": "AA", "size": "small" };
- level = (parms.level || "AA").toUpperCase();
- size = (parms.size || "small").toLowerCase();
- if (level !== "AA" && level !== "AAA") {
- level = "AA";
- }
- if (size !== "small" && size !== "large") {
- size = "small";
+ function HSVtoHSL(hsv) {
+ var h = hsv[0],
+ s = hsv[1] / 100,
+ v = hsv[2] / 100,
+ k = (2 - s) * v;
+
+ return [h, Math.round(s * v / (k < 1 ? k : 2 - k) * 10000) / 100, k / 2 * 100];
+ }
+
+ function stringToInteger(string) {
+ var total = 0;
+ for (var i = 0; i !== string.length; i++) {
+ if (total >= Number.MAX_SAFE_INTEGER) break;
+ total += string.charCodeAt(i);
}
- return { "level": level, "size": size };
+ return total;
}
- exports.default = tinycolor;
+ exports.default = randomColor;
}, {}], 28: [function (require, module, exports) {
/* global module, wx, window: false, document: false */
'use strict';
@@ -9916,7 +9973,7 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
}();
exports.default = Tweezer;
- }, { "./raf": 25 }], 29: [function (require, module, exports) {
+ }, { "./raf": 26 }], 29: [function (require, module, exports) {
/* global module, wx, window: false, document: false */
'use strict';
@@ -10776,7 +10833,7 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
return WxCanvasRenderingContext2D;
}();
- }, { "./helper": 24 }], 30: [function (require, module, exports) {
+ }, { "./helper": 25 }], 30: [function (require, module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -10809,5 +10866,5 @@ var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbo
exports.WxDoughnut = _doughnut2.default;
exports.WxLiner = _liner2.default;
exports.WxBar = _bar2.default;
- }, { "./charts/bar": 10, "./charts/doughnut": 11, "./charts/liner": 12, "./charts/wxChart": 13 }] }, {}, [30])(30);
+ }, { "./charts/bar": 11, "./charts/doughnut": 12, "./charts/liner": 13, "./charts/wxChart": 14 }] }, {}, [30])(30);
});
\ No newline at end of file
diff --git a/dist/wx-chart.min.js b/dist/wx-chart.min.js
index 6965141..955b13a 100644
--- a/dist/wx-chart.min.js
+++ b/dist/wx-chart.min.js
@@ -7,9 +7,9 @@
* Released under the MIT license
* https://github.com/xch89820/wx-chart/blob/master/LICENSE.md
*/
-"use strict";var _typeof2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(t){if("object"===("undefined"==typeof exports?"undefined":_typeof2(exports))&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.WxChart=t()}}(function(){var t;return function t(e,n,i){function r(a,u){if(!n[a]){if(!e[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(o)return o(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return r(n?n:t)},c,c.exports,t,e,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a4){if(1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");o=!0}}else if(6!==a&&8!==a&&9!==a&&12!==a&&1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");var u=!o&&(9===a||12===a)||t&&t[0]&&"undefined"!=typeof t[0].z;this._3d=u;for(var s=[],l=0,f=u?3:2;l1e-4)return void(t._linear=!1);t._linear=!0}(this),this._t1=0,this._t2=1,this.update()};h.fromSVG=function(t){var e=t.match(/[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?/g).map(parseFloat),n=/[cq]/.test(t);return n?(e=e.map(function(t,n){return n<2?t:t+e[n%2]}),new h(e)):new h(e)},h.quadraticFromPoints=function(t,e,i,r){if("undefined"==typeof r&&(r=.5),0===r)return new h(e,e,i);if(1===r)return new h(t,e,e);var o=n(2,t,e,i,r);return new h(t,o.A,i)},h.cubicFromPoints=function(t,e,i,r,o){"undefined"==typeof r&&(r=.5);var a=n(3,t,e,i,r);"undefined"==typeof o&&(o=c.dist(e,a.C));var u=o*(1-r)/r,s=c.dist(t,i),l=(i.x-t.x)/s,f=(i.y-t.y)/s,d=o*l,p=o*f,v=u*l,y=u*f,g={x:e.x-d,y:e.y-p},x={x:e.x+v,y:e.y+y},b=a.A,m={x:b.x+(g.x-b.x)/(1-r),y:b.y+(g.y-b.y)/(1-r)},w={x:b.x+(x.x-b.x)/r,y:b.y+(x.y-b.y)/r},_={x:t.x+(m.x-t.x)/r,y:t.y+(m.y-t.y)/r},k={x:i.x+(w.x-i.x)/(1-r),y:i.y+(w.y-i.y)/(1-r)};return new h(t,_,k,i)};var d=function(){return c};h.getUtils=d,h.prototype={getUtils:d,valueOf:function(){return this.toString()},toString:function(){return c.pointsToString(this.points)},toSVG:function(t){if(this._3d)return!1;for(var e=this.points,n=e[0].x,i=e[0].y,r=["M",n,i,2===this.order?"Q":"C"],o=1,a=e.length;o1;e--,n--){for(var i,r=[],o=0;o0},length:function(){return c.length(this.derivative.bind(this))},_lut:[],getLUT:function(t){if(t=t||100,this._lut.length===t)return this._lut;this._lut=[];for(var e=0;e<=t;e++)this._lut.push(this.compute(e/t));return this._lut},on:function(t,e){e=e||5;for(var n,i=this.getLUT(),r=[],o=0,a=0;a1;){for(var h=0;h1;){for(i=[],a=0,u=n.length-1;a=0&&t<=1}),r=r.concat(i[n].sort())}.bind(this)),r=r.sort().filter(function(t,e){return r.indexOf(t)===e}),i.values=r,i},bbox:function(){var t=this.extrema(),e={};return this.dims.forEach(function(n){e[n]=c.getminmax(this,n,t[n])}.bind(this)),e},overlaps:function(t){var e=this.bbox(),n=t.bbox();return c.bboxoverlap(e,n)},offset:function(t,e){if("undefined"!=typeof e){var n=this.get(t),i=this.normal(t),r={c:n,n:i,x:n.x+i.x*e,y:n.y+i.y*e};return this._3d&&(r.z=n.z+i.z*e),r}if(this._linear){var o=this.normal(0),a=this.points.map(function(e){var n={x:e.x+t*o.x,y:e.y+t*o.y};return e.z&&i.z&&(n.z=e.z+t*o.z),n});return[new h(a)]}var u=this.reduce();return u.map(function(e){return e.scale(t)})},simple:function(){if(3===this.order){var t=c.angle(this.points[0],this.points[3],this.points[1]),e=c.angle(this.points[0],this.points[3],this.points[2]);if(t>0&&e<0||t<0&&e>0)return!1}var n=this.normal(0),r=this.normal(1),o=n.x*r.x+n.y*r.y;this._3d&&(o+=n.z*r.z);var u=i(a(o));return u1,u.endcap.virtual=o0&&(r=r.concat(e))}),r},arcs:function(t){t=t||.5;var e=[];return this._iterate(t,e)},_error:function(t,e,n,r){var o=(r-n)/4,a=this.get(n+o),u=this.get(r-o),s=c.dist(t,e),l=c.dist(t,a),f=c.dist(t,u);return i(l-s)+i(f-s)},_iterate:function(t,e){var n,i=0,r=1;do{n=0,r=1;var o,a,u,s,l,f=this.get(i),h=!1,d=!1,p=r,v=1,y=0;do{d=h,s=u,p=(i+r)/2,y++,o=this.get(p),a=this.get(r),u=c.getccenter(f,o,a),u.interval={start:i,end:r};var g=this._error(u,f,i,r);if(h=g<=t,l=d&&!h,l||(v=r),h){if(r>=1){u.interval.end=v=1,s=u;break}r+=(r-i)/2}else r=p}while(!l&&n++<100);if(n>=100)break;s=s?s:u,e.push(s),i=v}while(r<1);return e}},e.exports=h}()},{"./poly-bezier.js":3,"./utils.js":4}],3:[function(t,e,n){!function(){var n=t("./utils.js"),i=function(t){this.curves=[],this._3d=!1,t&&(this.curves=t,this._3d=this.curves[0]._3d)};i.prototype={valueOf:function(){return this.toString()},toString:function(){return"["+this.curves.map(function(t){return n.pointsToString(t.points)}).join(", ")+"]"},addCurve:function(t){this.curves.push(t),this._3d=this._3d||t._3d},length:function(){return this.curves.map(function(t){return t.length()}).reduce(function(t,e){return t+e})},curve:function(t){return this.curves[t]},bbox:function t(){for(var e=this.curves,t=e[0].bbox(),i=1;io.x.min&&(e=o.x.min),n>o.y.min&&(n=o.y.min),i0&&(a.c1=e,a.c2=i,a.s1=t,a.s2=n,o.push(a))}})}),o},makeshape:function(t,e,n){var i=e.points.length,r=t.points.length,o=y.makeline(e.points[i-1],t.points[0]),a=y.makeline(t.points[r-1],e.points[0]),u={startcap:o,forward:t,back:e,endcap:a,bbox:y.findbbox([o,t,e,a])},s=y;return u.intersections=function(t){return s.shapeintersections(u,u.bbox,t,t.bbox,n)},u},getminmax:function(t,e,n){if(!n)return{min:0,max:0};var i,r,o=p,a=v;n.indexOf(0)===-1&&(n=[0].concat(n)),n.indexOf(1)===-1&&n.push(1);for(var u=0,s=n.length;ua&&(a=r[e]);return{min:o,mid:(o+a)/2,max:a,size:a-o}},align:function(t,e){var n=e.p1.x,o=e.p1.y,u=-a(e.p2.y-o,e.p2.x-n),s=function(t){return{x:(t.x-n)*i(u)-(t.y-o)*r(u),y:(t.x-n)*r(u)+(t.y-o)*i(u)}};return t.map(s)},roots:function(t,e){e=e||{p1:{x:0,y:0},p2:{x:1,y:0}};var n=t.length-1,r=y.align(t,e),a=function(t){return 0<=t&&t<=1};if(2===n){var s=r[0].y,c=r[1].y,h=r[2].y,d=s-2*c+h;if(0!==d){var p=-u(c*c-s*h),v=-s+c,g=-(p+v)/d,x=-(-p+v)/d;return[g,x].filter(a)}return c!==h&&0===d?[(2*c-h)/2*(c-h)].filter(a):[]}var b,g,m,w,_,k=r[0].y,P=r[1].y,S=r[2].y,C=r[3].y,d=-k+3*P-3*S+C,s=(3*k-6*P+3*S)/d,c=(-3*k+3*P)/d,h=k/d,r=(3*c-s*s)/3,A=r/3,O=(2*s*s*s-9*s*c+27*h)/27,T=O/2,M=T*T+A*A*A;if(M<0){var z=-r/3,W=z*z*z,j=u(W),E=-O/(2*j),B=E<-1?-1:E>1?1:E,R=o(B),D=l(j),I=2*D;return m=I*i(R/3)-s/3,w=I*i((R+f)/3)-s/3,_=I*i((R+2*f)/3)-s/3,[m,w,_].filter(a)}if(0===M)return b=T<0?l(-T):-l(T),m=2*b-s/3,w=-b-s/3,[m,w].filter(a);var L=u(M);return b=l(-T+L),g=l(T+L),[b-g-s/3].filter(a)},droots:function(t){if(3===t.length){var e=t[0],n=t[1],i=t[2],r=e-2*n+i;if(0!==r){var o=-u(n*n-e*i),a=-e+n,s=-(o+a)/r,l=-(-o+a)/r;return[s,l]}return n!==i&&0===r?[(2*n-i)/(2*(n-i))]:[]}if(2===t.length){var e=t[0],n=t[1];return e!==n?[e/(e-n)]:[]}},inflections:function(t){if(t.length<4)return[];var e=y.align(t,{p1:t[0],p2:t.slice(-1)[0]}),n=e[2].x*e[1].y,i=e[3].x*e[1].y,r=e[1].x*e[2].y,o=e[3].x*e[2].y,a=18*(-3*n+2*i+3*r-o),u=18*(3*n-i-3*r),s=18*(r-n);if(y.approximately(a,0)){if(!y.approximately(u,0)){var l=-s/u;if(0<=l&&l<=1)return[l]}return[]}var c=u*u-4*a*s,f=Math.sqrt(c),o=2*a;return y.approximately(o,0)?[]:[(f-u)/o,-(u+f)/o].filter(function(t){return 0<=t&&t<=1})},bboxoverlap:function(t,e){var i,r,o,a,u,s=["x","y"],l=s.length;for(i=0;i=u)return!1;return!0},expandbox:function(t,e){e.x.mint.x.max&&(t.x.max=e.x.max),e.y.max>t.y.max&&(t.y.max=e.y.max),e.z&&e.z.max>t.z.max&&(t.z.max=e.z.max),t.x.mid=(t.x.min+t.x.max)/2,t.y.mid=(t.y.min+t.y.max)/2,t.z&&(t.z.mid=(t.z.min+t.z.max)/2),t.x.size=t.x.max-t.x.min,t.y.size=t.y.max-t.y.min,t.z&&(t.z.size=t.z.max-t.z.min)},pairiteration:function(t,e,n){var i=t.bbox(),r=e.bbox(),o=1e5,a=n||.5;if(i.x.size+i.y.sizeT||T>M)&&(O+=f),O>M&&(o=M,M=O,O=o)):M-1?n.extendMethod(t,i,e):(n.opt.warn&&console.warn(t+" method already exists within the "+n.context.constructor.name+" component."),n.opt.mergeDuplicates&&n.extendMethod(t,i,e)))}),this.addNewMethod(t,e)}}]),t}(),a=new o;e.exports=a.init.bind(a)},{}],6:[function(e,n,i){(function(r){!function(e){if("object"===("undefined"==typeof i?"undefined":_typeof2(i))&&"undefined"!=typeof n)n.exports=e();else if("function"==typeof t&&t.amd)t([],e);else{var o;o="undefined"!=typeof window?window:"undefined"!=typeof r?r:"undefined"!=typeof self?self:this,o.Ez=e()}}(function(){return function t(n,i,r){function o(u,s){if(!i[u]){if(!n[u]){var l="function"==typeof e&&e;if(!s&&l)return l(u,!0);if(a)return a(u,!0);var c=new Error("Cannot find module '"+u+"'");throw c.code="MODULE_NOT_FOUND",c}var f=i[u]={exports:{}};n[u][0].call(f.exports,function(t){var e=n[u][1][t];return o(e?e:t)},f,f.exports,t,n,i,r)}return i[u].exports}for(var a="function"==typeof e&&e,u=0;u>>0,1)},emit:function(e,n){(t[e]||[]).map(function(t){t(n)}),(t["*"]||[]).map(function(t){t(e,n)})}}}e.exports=i},{}],8:[function(t,e,n){(function(t){(function(){var n,i,r,o,a,u;"undefined"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:"undefined"!=typeof t&&null!==t&&t.hrtime?(e.exports=function(){return(n()-a)/1e6},i=t.hrtime,n=function(){var t;return t=i(),1e9*t[0]+t[1]},o=n(),u=1e9*t.uptime(),a=o-u):Date.now?(e.exports=function(){return Date.now()-r},r=Date.now()):(e.exports=function(){return(new Date).getTime()-r},r=(new Date).getTime())}).call(this)}).call(this,t("_process"))},{_process:9}],9:[function(t,e,n){function i(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function o(t){if(f===setTimeout)return setTimeout(t,0);if((f===i||!f)&&setTimeout)return f=setTimeout,setTimeout(t,0);try{return f(t,0)}catch(e){try{return f.call(null,t,0)}catch(e){return f.call(this,t,0)}}}function a(t){if(h===clearTimeout)return clearTimeout(t);if((h===r||!h)&&clearTimeout)return h=clearTimeout,clearTimeout(t);try{return h(t)}catch(e){try{return h.call(null,t)}catch(e){return h.call(this,t)}}}function u(){y&&p&&(y=!1,p.length?v=p.concat(v):g=-1,v.length&&s())}function s(){if(!y){var t=o(u);y=!0;for(var e=v.length;e;){for(p=v,v=[];++g1)for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:this.xAxis,e=this,n=void 0,i=e.chartConfig.barPercentage,o=e.chartConfig.pointPercentage,a=e.chartConfig.stacked,u=e.legends,s=u.length,l=t.calculateTickWidth(),c=l*o,f=(l-c)/2,d=0;if(i||(i=a?Math.max.apply(Math,r(u.map(function(t){return t.barPercentage||.8})))||.8:.8),n=Math.max.apply(Math,r([i*c].concat(u.map(function(t){return h.is.Number(t.barWidth)?t.barWidth:0})))),u.forEach(function(t){if(a)t.barWidth=n,t.barPercentage=i,t._standardPercentage=i/s;else{var e=void 0,r=t.barPercentage?t.barPercentage>1?1:t.barPercentage:i;t.barWidth?e=t.barWidth/l:(e=r/s,t.barWidth=c*e),d+=e,t._standardPercentage=e}}),d>1)throw Error("Bar's width too large!");a&&(d=i);var p=s>1?c*(1-d)/(s-1):c*(1-d);return{tickWidth:l,pointPercentage:o,pointWidth:c,pointIntervalWidth:f,legends:u,barIntervalWidth:p}}},{key:"calculateBarRect",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.xAxis,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.yAxis,r=this,o=r.chartConfig.stacked,a=r.barRuler||r.calculateBarRuler(n),u=r.legends[e];if(u){var s=r.legends.slice(0,e).reduce(function(t,e){return t+e.barWidth},0),l=r.visDatasets[t],c=u.key&&"undefined"!=typeof l[u.key]?l[u.key]:null;if(!h.is.Null(c)&&!h.is.Undefined(c)){var f=void 0,d=void 0,p=void 0,v=void 0,y=n.getPoint(t);if(o){f=y.x-a.pointWidth/2+a.barIntervalWidth/2,d=r._getStackPoint(t,e).y,p=u.barWidth;var g=i.getPoint(0).y;v=c<0?c/l.__sumNeg*(i.getPoint(l.__sumNeg).y-g):c/l.__sumPos*(g-i.getPoint(l.__sumPos).y),d=c<0?d-v:d}else f=y.x-a.pointWidth/2+s+a.barIntervalWidth/2*(e+1),d=i.getPoint(c).y,p=u.barWidth,v=y.y-d;return{x:f,y:d,barWidth:p,barHeight:v}}}}},{key:"_drawScale",value:function(){var t=void 0,e=this,n=e.wxLayout;t=n.adjustBox();var i=e.xScaleAxisDatas(),r=e.yScaleAxisDatas(t),o=e.wxCrossScale.draw(t,i,r),a=o.xBox,u=o.yBox;n.addBox(a),n.addBox(u)}},{key:"yScaleAxisDatas",value:function(t){var e=this,n=e.chartConfig.stacked,i=e.ctx,r=e.chartConfig.yScaleItemOptions,o=e.yAxis.calculateTickLimit(t,i);if(n){var a=e.stackYScaleAxisLimit(),u=a.max,s=a.min;return e.yAxis.buildDatasets(u,s,o,void 0,r)}var l=this.visDatasets.reduce(function(t,n){var i=t.max,r=t.min;if(n.display){var o=e.legends.map(function(t){if(t.key)return n[t.key]||0}).concat(i,r);i=Math.max.apply(Math,o),r=Math.min.apply(Math,o)}return{max:i,min:r}},{max:0,min:0}),c=l.max,f=l.min;return e.yAxis.buildDatasets(c,f,o,void 0,r)}},{key:"xScaleAxisDatas",value:function(){var t=this,e=t.chartConfig.xScaleItemOptions,n=t.labels.map(function(t){var n={text:t};return"undefined"!=typeof e&&(n=(0,h.extend)(n,e)),n});return t.xAxis.buildDatasets(n)}},{key:"labels",get:function(){var t=this,e=void 0;return t._labels?t._labels:(e=t.chartConfig.labels)&&h.is.Array(e)?e:(t._labels=t.visDatasets.map(function(t){return t.label}),t._labels)}},{key:"legends",get:function(){var t=this;return t._legends||(t._legends=t._getLegendConfig()),t._legends},set:function(t){this._legends=t}}]),e}(b.default);n.default=N},{"../core/animation":14,"../core/layout":16,"../core/legend":17,"../core/scale":18,"../core/title":19,"../scale/scale.category":20,"../scale/scale.crosshelp":21,"../scale/scale.liner":22,"../scale/scale.stackhelp":23,"../util/helper":24,"../util/randomColor":26,"../util/tinycolor":27,"../util/wxCanvas":29,"./wxChart":13,"es6-mixins":5}],11:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==("undefined"==typeof e?"undefined":_typeof2(e))&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":_typeof2(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n0?k:-k),M=C,z=S-o>0?T+4:T-4-O,W=M+i.fontSize/2;i.beginPath(),i.lineWidth=1,i.strokeStyle=d,i.fillStyle=d,i.fontSize=p,i.moveTo(w,_),i.lineTo(S,C),i.lineTo(T,M),i.stroke(),i.fillText(f,z,W),i.draw()}}},{key:"drawDoughnut",value:function(t,e){var n=this,i=n.chartConfig.animate;n.chartConfig.animateOptions;if(i){var r=n._getAnimationDrawDoughnut(t,e);if(!r)return;n.wxAnimation.pushActions(r)}else n._drawDoughnut(t,e)}},{key:"_getAnimationDrawDoughnut",value:function(t,e){var n=this,i=n.ctx,r=n.chartConfig.animateOptions,o=n.config.backgroundColor,a=e.pointX,u=e.pointY,s=e.totalValue,l=e.rotation,c=e.outerRadius,f=e.borderWidth,h=e.totalAngle,d=r.end-r.start;return function(p,v,y){var g=p/d,x=h*g;return i.save(),i.beginPath(),i.fillStyle=o?o:"#ffffff",i.strokeStyle=o?o:"#ffffff",i.arc(a,u,c,0,h),i.fill(),f&&(i.beginPath(),i.arc(a,u,c,0,h),i.lineJoin="bevel",i.lineWidth=f,i.stroke()),i.draw(),r.end===p?n._drawDoughnut(t,e):!function(){var i=l;t.forEach(function(t){var r=i,o=r+x*(t.value/s),a=(0,m.extend)({startAngle:r,endAngle:o},e);n.drawData(t,a),i=o})}(),i.restore(),p}}},{key:"_drawDoughnut",value:function(t,e){var n=this,i=e.totalValue,r=e.rotation,o=e.totalAngle,a=r;n.initAvoidCollision(),t.forEach(function(t){var r=a,u=r+o*(t.value/i),s=(0,m.extend)({startAngle:r,endAngle:u},e);n.drawData(t,s),n.drawLabel(t,s),a=u})}},{key:"_longestLabel",value:function(t){var e=this,n=e.visDatasets,i=e.ctx,r=0;return n.forEach(function(n){var o=n.label,a=n.value,u=n.format;o=m.is.Function(u)?u.call(e,o,a,t,0,n):o;var s=i.measureText(o).width;r=s>r?s:r}),r}},{key:"_maximalLabelFontSize",value:function(){var t=this,e=t.visDatasets,n=0;return e.forEach(function(t){var e=t.fontSize;n=e>n?e:n}),n}},{key:"initAvoidCollision",value:function(){this._lastPoint=null}},{key:"avoidCollision",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.ctx.fontSize+4,i=this,r=(i.box,e.x);e.y;if(i._lastPoint){var o=i._lastPoint.x,a=i._lastPoint.y,u=t.x,s=t.y;if((u-r)*(o-r)>0&&Math.abs(a-s)0?a+n:a-n;t.y=l}}return this._lastPoint=t,t}}]),e}(f.default);n.default=S},{"../core/animation":14,"../core/layout":16,"../core/legend":17,"../core/title":19,"../util/helper":24,"../util/randomColor":26,"../util/wxCanvas":29,"./wxChart":13}],12:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==("undefined"==typeof e?"undefined":_typeof2(e))&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":_typeof2(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:1,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return n?(t%e+i*e)/(e*n):0},this._getCurr=function(t,e){if(!(e>t.length-1))return t[e]},this._getNext=function(e,n,i){if(!(n>=e.length-1)){var r=e[n+1];return r.point?r:i?t._getNext(e,n+1,i):void 0}},this._getNextPoint=function(e,n,i){var r=t._getNext(e,n,i);return r?r.point:null},this._getPre=function(e,n,i){if(!(n<=0)){var r=e[n-1];return r.point?r:i?t._getPre(e,n-1,i):void 0}},this._getPrePoint=function(e,n,i){var r=t._getPre(e,n,i);return r?r.point:null},this._lineToPoint=function(e,n,i,r){var o=t.ctx;if(r&&0!==r){var a=(0,f.splineCurve)(e,n,i,r);e?o.bezierCurveTo(e.controlPoints.next.x,e.controlPoints.next.y,a.previous.x,a.previous.y,n.x,n.y):o.moveTo(n.x,n.y),n.controlPoints=a}else o.lineTo(n.x,n.y)},this._animateLineToPoint=function(e,n,i,r,o,a){var u=t.ctx;if(a&&0!==a){var s=void 0,l=void 0,c=void 0,h=void 0,d=(0,f.splineCurve)(e,n,i,a);if(e&&n){var p=new E({x:e.x,y:e.y},{x:e.controlPoints.next.x,y:e.controlPoints.next.y},{x:d.previous.x,y:d.previous.y},{x:n.x,y:n.y}),v=p.split(r||0,o);s=v.point(0),l=v.point(1),c=v.point(2),h=v.point(3),u.moveTo(Math.round(s.x),s.y),u.bezierCurveTo(l.x,l.y,c.x,c.y,Math.round(h.x),h.y)}return n.controlPoints=d,{startPoint:s?{x:Math.round(s.x),y:s.y}:null,endPoint:h?{x:Math.round(h.x),y:h.y}:null}}var y=e.x,g=n.x,x=e.y,b=n.y,m=Math.sqrt(Math.pow(g-y,2)+Math.pow(b-x,2)),w=(g-y)/m,_=(b-x)/m,k=y+w*o,P=x+_*o;return u.moveTo(y,x),u.lineTo(k,P),{startPoint:e,endPoint:{x:k,y:P}}},this.__fillInHere=function(e,n,i,r){var o=t.ctx;o.lineTo(n.x,i),o.lineTo(e.x,i),o.globalAlpha=r,o.fill(),o.globalAlpha=1},this._getAnimationDrawLine=function(e,n){var i=t,r=(i.chartConfig.animate,i.chartConfig.animateOptions),o=i.ctx,a=e.legend,u=e.dataset,s=a.display,l=a.spanGaps,c=a.tension,f=a.lineWidth,h=a.lineJoin,d=a.fillStyle,p=a.strokeStyle,v=(a.fillArea,a.fillAlpha,u.length),y=(r.end-r.start)/(v-1);if(s)return function(t,e,n){o.save(),o.lineWidth=f,o.lineJoin=h,o.strokeStyle=p,o.fillStyle=d;var r=e?Math.floor(t/y)+1:0,s=void 0,v=void 0,g=void 0,x=void 0,b=e?e.t:0,m=0,w=i._getCurr(u,r),_=i._getNext(u,r,l),k=i._getPre(u,r,l),P=void 0,S=e?r-e.index:0;if(w&&(v=w.point,s=w.point,g=w.index,x=w.data,m=i._animateLineTick(t,y,g-(k?k.index:0),r-(k?k.index:0)-1)),k&&(P=i._getPrePoint(u,k.index,l)),!v&&_&&(v=_.point,g=_.index,_=i._getNext(u,_.index,l)),1==S&&(k&&k.point&&(o.beginPath(),i._animateLineToPoint(P,k.point,v,b,1,c),o.stroke()),b=0),(!s&&l||s)&&v&&(o.beginPath(),i._animateLineToPoint(k?k.point:null,v,_?_.point:null,b,m,c),o.stroke()),0==b&&k&&k.point){var C=k.data,A=C.pointBorderColor,O=C.pointBorderWidth,T=C.pointRadius;C.pointStyle,C.label;T&&(o.beginPath(),o.arc(k.point.x,k.point.y,T,0,2*Math.PI),o.fill()),O&&(o.beginPath(),o.arc(k.point.x,k.point.y,T,0,2*Math.PI),o.lineWidth=O,o.strokeStyle=A||a.strokeStyle,o.stroke())}return o.draw(),o.restore(),{point:s,t:m,index:r,diffIndex:S}}}};n.default=I},{"../core/animation":14,"../core/layout":16,"../core/legend":17,"../core/scale":18,"../core/title":19,"../scale/scale.category":20,"../scale/scale.crosshelp":21,"../scale/scale.liner":22,"../scale/scale.stackhelp":23,"../util/helper":24,"../util/randomColor":26,"../util/wxCanvas":29,"./wxChart":13,"bezier-js":1,"es6-mixins":5}],13:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t){return t&&t in y?y[t]:null}Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n1?i-1:0),o=1;o=n.actions.length)){var r=void 0,o=n.actions[i],a=i+1<=n.actions.length?n.actions[i+1]:null;return n.emit("tick",{value:t,preRet:e,toNext:n.handOverAction,nextAction:a,parallel:!1}),r=o.apply(n,[t,e,n.handOverAction,a])}}},{key:"runTickParallel",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=this,i=n.actions,r=n.actions.length;return i.forEach(function(o,a){var u=e?e[a]:null,s=function(){},l=a+10&&void 0!==arguments[0]&&arguments[0],e=this;e.emit("start",{parallel:t}),e.started=!0,e.tweenzerHandler.on("tick",e.tick(t)).on("done",function(){e.currentActionIndex=0,e.started=!1,e.emit("done",{parallel:t})}).begin()}}]),t}();n.default=g},{"../util/helper":24,"../util/tweezer":28,"es6-mixins":5,"ez.js":6,mitt:7}],15:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0});var o=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},n=this;if((a.is.Undefined(t)||a.is.Null(t))&&(t=n.datasets,!t))throw new Error("Datasets is null");return a.is.Array(t)||(t=[t]),t=t.map(function(t){return(0,a.extend)({},e,t)}),n._datasets=t,n._visDatasets=null,n._datasets}},{key:"update",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this;if(i.clear(),t){if(t=i.init(t),e&&e instanceof u.BoxInstance)e=i.box=i.calculateBox(e,t,n);else{if(!i.box)return;e=i.box}i.isVisiable()&&i.draw(t,e,n)}}},{key:"calculateBox",value:function(t){arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.datasets,arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config;return t}},{key:"setBox",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this;e&&n.clear(),t&&t instanceof u.BoxInstance&&(n.box=t),e&&n.isVisiable()&&n.draw()}},{key:"draw",value:function(){arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.datasets,arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box,arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config}},{key:"clear",value:function(){var t=this;t.box&&(t.wxChart.ctx.clearRect(t.box.x,t.box.y,t.box.outerWidth,t.box.outerHeight),t.wxChart.ctx.draw())}},{key:"isVisiable",value:function(){return!!this.config.display}},{key:"isHorizontal",value:function(){return"top"==this.position||"bottom"==this.position}},{key:"datasets",get:function(){return this._datasets},set:function(t){return this.update(t)}},{key:"visDatasets",get:function(){return this._visDatasets?this._visDatasets:this._visDatasets=this.datasets.filter(function(t){return!!t.display})},set:function(t){}},{key:"position",get:function(){return this.config.position},set:function(t){return this.config.position=t,this.update()}}]),t}());n.default=f},{"../charts/wxChart":13,"../util/helper":24,"../util/wxCanvas":29,"./layout":16}],16:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0}),n.BoxInstance=void 0;var o=function(){function t(t,e){for(var n=0;nt.ex||e.ey1&&void 0!==arguments[1]?arguments[1]:v,i=this,r=i.config;return t=l(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"init",this).call(this,t,n),t=i.calculateLegendItem(t,r),i._datasets=t,t}},{key:"calculateLegendItem",value:function(t,e){var n=this,i=e.labels||{},r=n.wxChart.ctx,o=i.boxWidth,a=i.fontSize;return!h.is.Array(t)&&h.is.PureObject(t)&&(t=[t]),t=t.map(function(t){var e=r.measureText(t.text).width,n=o+a/2+e;return t._prop={fontSize:a,boxHeight:a,boxWidth:o,textWidth:e,width:n},t})}},{key:"calculateBox",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.datasets,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this,r=void 0,o=void 0,a=void 0,s=void 0,l=i.wxChart,c=l.ctx,f=c.fontSize,h=t.x,p=t.y,v=n.labels.padding||10;if(i.isHorizontal())!function(){a=n.fullWidth?t.width-2*v:n.width,r=n.fullWidth?t.width:n.width,s=f,o=s+2*v;var u=0,l=0,c=0;e.forEach(function(t){var e=t._prop,n=e.width+v,i=l+n;i>a?(c=ca&&(console.warn("The width options is too small! width=",a,".The chart will set to ",i),a=n)):l+=n,e.padding=v,e.lineNum=u,e.outerWidth=n}),c=c0&&(s=f*(u+1)+u*f/2,o=s+2*v),h+=(a-c)/2,"bottom"==i.position&&(p=t.ry-o,p=p0&&void 0!==arguments[0]?arguments[0]:this.datasets,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box,n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,this),i=n.wxChart.ctx,r=e.x,o=e.y;e.width,e.outerWidth,e.height,e.outerHeight;n.clear(),i.save();var a=-1,u=r,s=o;t.forEach(function(t){var e=t.text,n=t.display,l=t.fillStyle,c=t.fillAlpha,f=t.strokeStyle,h=t.lineCap,d=t.lineJoin,p=t.lineWidth,v=t._prop,y=v.width,g=v.fontSize,x=v.textWidth,b=v.padding,m=v.lineNum,w=v.boxWidth,_=v.boxHeight,k=v.outerWidth;if(y){i.textBaseline="top",i.textAlign="start",i.fillStyle=l,i.fontSize=g,i.strokeStyle=f,i.lineCap=h,i.lineJoin=d,i.lineWidth=p,a0&&void 0!==arguments[0]?arguments[0]:this.wxChart.ctx,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.datasets,n=this,i=0;return e.forEach(function(e){if(e.display){var r=void 0;if(e.textWidth)r=e.textWidth;else{var o=n.getTicksText(e);r=t.measureText(o).width,e.textWidth=r}i=i1&&void 0!==arguments[1]?arguments[1]:v,i=this,r=i.config;return t=s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"init",this).call(this,t,n),i.visDatasets=null,i._datasets=t,i.fixPadding=i.calculateFixPadding(t,r),t}},{key:"calculateBox",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.datasets,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this,r=i.wxChart.ctx,o=r.fontSize,a=i.calculateTickWidth(e,t,n),u=void 0,s=void 0,c=void 0,h=void 0,d=void 0,p=void 0,v=(0,l.toRadians)(n.ticks.minRotation||0),y=(0,l.toRadians)(n.ticks.maxRotation||90),g=v,x=i.lineSpace,b=1,m=i.longestText();if(i.isHorizontal())m>a?a<=r.fontSize?g=y:(g=Math.acos(a/m),h=Math.sin(g)*m+b+x+o/2,h>t.height?(h=t.height,g=Math.asin((h-b-x-o/2)/m)):g>y&&(g=y,h=Math.sin(g)*m+b+x+o/2)):h=1.5*o+b+x,c=t.width,d=t.outerWidth,p=h;else{var w=0;n.title&&(w=r.measureText(n.title,n.titleFontSize).width-b-x-o/2),c=m+b+x+o/2,c=c>w?c:w,c>t.width&&(c=t.width,g=Math.acos((c-b-x-o/2)/m),g=g>y?y:g),h=t.height,d=c,p=t.outerHeight}switch(i.position){case"left":case"top":u=t.x,s=t.y;break;case"right":u=t.x+t.width-d,s=t.y;break;case"bottom":u=t.x,s=t.y+t.height-p}return i.fontRadians=g,new f.BoxInstance(i.position,u,s,c,h,d,p)}},{key:"calculateTickWidth",value:function(){var t=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.datasets,arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box),e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,n=this,i=void 0,r=n.visDatasets,o=e.ticks.lineWidth,a=l.sum.apply(null,r.map(function(t){return t.lineWidth||o})),u=n.fixPadding;if(n.isHorizontal()){var s=t.width,c=t.marginLR,f=n.calculateTitleWidth(),h=n.config.extendLeft;0!==c?a+=2*o:0!==h&&(a+=o),i=(s-f-a-u)/(r.length-1)}else{var d=t.height,p=t.marginTB,v=n.calculateTitleWidth(),y=e.extendTop;0!==p?a+=2*o:0!==y&&(a+=o),i=(d-v-a-u)/(r.length-1)}return i}},{key:"calculateTitleWidth",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.config,e=void 0,n=this,i=n.wxChart.ctx;return e=n.isHorizontal()?t.title?i.measureText(t.title,t.titleFontSize).width:0:t.title?t.titleFontSize:0}},{key:"_getTicksLineWidthOffset",value:function(t,e){var n=0,i=this;e||(e=i.visDatasets);var r=this.config.ticks.lineWidth;return e.map(function(e,i){t>=i&&(n+=e.lineWidth||r)}),n}},{key:"getTicksPosition",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.box,i=this,r=(i.wxChart.ctx,i.fixPadding);e||(e=i.calculateTickWidth());var o=i.visDatasets,a=void 0,u=void 0;return i.isHorizontal()?(a=t===-1?n.x-i.config.extendLeft+r/2+(i.config.extendLeft?i.config.ticks.lineWidth:0):n.lx+i._getTicksLineWidthOffset(t,o)+e*t+r/2,u="top"===i.position?n.ry-i.lineSpace:n.ly+i.lineSpace):(u=t===-1?n.y-i.config.extendTop+r/2+(i.config.extendTop?i.config.ticks.lineWidth:0):n.ly+i.calculateTitleWidth()+i._getTicksLineWidthOffset(t,o)+e*t+r/2,a="left"===i.position?n.rx-i.lineSpace:n.lx+i.lineSpace),{x:a,y:u}}},{key:"_initDrawATickText",value:function(){var t=this,e=t.wxChart.ctx;switch(t.position){case"left":e.textAlign="end",e.textBaseline="middle";break;case"right":e.textAlign="start",e.textBaseline="middle";break;case"top":e.textAlign="center",e.textBaseline="alphabetic";break;case"bottom":e.textAlign="center",e.textBaseline="top"}}},{key:"_drawATickLine",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,r=this,o=r.wxChart.ctx,a=r.lineSpace,u=t,s=e;switch(r.position){case"left":u+=a;break;case"right":u-=a;break;case"top":s+=a;break;case"bottom":s-=a}o.beginPath(),o.moveTo(u,s),o.lineTo(t,e),o.stroke();var c=void 0;if(i&&i.text&&l.is.String(i.text)){o.save(),r._initDrawATickText(),c=i.format?i.format.call(r,i.text,i,t,e,r.fontRadians):i.text;var f=i.textWidth?i.textWidth:o.measureText(c).width;switch(r.position){case"left":o.translate(t-n/2,e+Math.sin(r.fontRadians)*f/2),o.rotate(r.fontRadians);break;case"right":o.translate(t+n/2,e+Math.sin(r.fontRadians)*f/2),o.rotate(-r.fontRadians);break;case"top":o.translate(t,e-n/2),o.rotate(-r.fontRadians);break;case"bottom":o.translate(t,e+n/2),o.rotate(r.fontRadians)}o.fillText(c,0,0),o.restore()}}},{key:"draw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.datasets,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this,r=i.wxChart.ctx,o=r.fontSize,a=i.fixPadding,u=i.calculateTickWidth(t,e,n),s=n.ticks,l=(e.x,e.y,e.width,e.outerWidth,e.height,e.outerHeight,i.visDatasets),c=i.getTicksPosition(-1,u),f=c.x,h=c.y,d=c.x,p=c.y;r.save(),r.fillStyle=s.fontColor,r.fontSize=s.fontSize,r.lineWidth=s.lineWidth;var v=i.calculateTitleWidth();i.isHorizontal()?((i.box.marginLR||n.extendLeft)&&(f+=s.lineWidth,i._drawATickLine(f,h,o)),f=i.box.lx+a/2,l.map(function(t){f+=t.lineWidth,r.fillStyle=t.fontColor,r.lineWidth=t.lineWidth,r.fontSize=t.fontSize||r.fontSize,i._drawATickLine(f,h,o,t),f+=u}),f=i.box.ex-a/2-v,i.box.marginLR&&i._drawATickLine(f,h,o),r.fillStyle=s.fontColor,r.lineWidth=n.lineWidth,r.beginPath(),r.moveTo(d,h),r.lineTo(f,h),r.stroke(),n.title&&(r.save(),f+=o/2,r.fontSize=n.titleFontSize,r.textAlign="start",r.textBaseline="bottom",r.fillStyle=n.titleFontColor,r.fillText(n.title,f,h),r.restore())):(n.title&&(r.save(),r.fontSize=n.titleFontSize,r.textAlign="center",r.textBaseline="bottom",r.fillStyle=n.titleFontColor,r.fillText(n.title,f,h),r.restore()),(i.box.marginTB||n.extendTop)&&(h+=v,i._drawATickLine(f,h,o)),h=i.box.ly+a/2+v,l.map(function(t){h+=t.lineWidth,r.fillStyle=t.fontColor,r.lineWidth=t.lineWidth,r.fontSize=t.fontSize||r.fontSize,i._drawATickLine(f,h,o,t),h+=u}),h=i.box.ey-a/2,i.box.marginTB&&i._drawATickLine(f,h,o),r.fillStyle=s.fontColor,r.lineWidth=n.lineWidth,r.beginPath(),r.moveTo(f,p+v),r.lineTo(f,h),r.stroke()),r.draw(),r.restore()}},{key:"getPoint",value:function(t){return null}},{key:"lineSpace",get:function(){var t=this;return t._lineSpace?t._lineSpace:(t._lineSpace=this.config.lineSpace||.5*this.wxChart.ctx.fontSize,t._lineSpace)}}]),e}(d.default);n.default=y},{"../util/helper":24,"../util/wxCanvas":29,"./base":15,"./layout":16}],19:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==("undefined"==typeof e?"undefined":_typeof2(e))&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":_typeof2(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},this),n=e.config;if(t=t?t:n.text,c.is.Undefined(t)||c.is.Null(t))throw new Error("Text is null");return e._datasets=t,t}},{key:"calculateBox",value:function(t){var e=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.config.text,arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config),n=this,i=n.wxChart,r=(i.ctx,e.fontSize||16),o=t.x,a=t.y,u=e.padding||10,s=e.fullWidth?t.width-2*u:e.width,l=e.fullWidth?t.width:e.width,c=r,h=c+2*u;return"bottom"==e.position&&(a=t.ry-h,a=a0&&void 0!==arguments[0]?arguments[0]:this.config.text,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this,r=i.wxChart.ctx,o=e.x,a=e.y,u=e.width;e.outerWidth,e.height,e.outerHeight;if(c.is.Undefined(t)||c.is.Null(t))throw new Error("Text is null");var s=n.fontColor,l=n.fontSize;i.clear(),r.save(),r.textBaseline="top",r.textAlign="start",r.fillStyle=s,r.fontSize=l;var f=r.measureText(t).width;o+=(u-f)/2,r.fillText(t,o,a),r.restore(),r.draw()}}]),e}(l.default);n.default=d},{"../util/helper":24,"./base":15,"./layout":16}],20:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==("undefined"==typeof e?"undefined":_typeof2(e))&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":_typeof2(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n0)r=i;else{var a=(0,c.niceNum)(t-e,!1);r=(0,c.niceNum)(a/(n-1),!0)}var u=Math.floor(e/r)*r,s=Math.ceil(t/r)*r,l=(s-u)/r;l=(0,c.almostEquals)(l,Math.round(l),r/1e3)?Math.round(l):Math.ceil(l);for(var f=0;fn&&(n=o)}),{max:n,min:e}}},{key:"_getStackValue",value:function(t,e){for(var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.yAxis,this),i=n.visDatasets[t],r=void 0,o=0,a=0,u=0;u2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.yAxis,r=this,o=r.visDatasets[t],a=o[r.legends[e].key],u=r._getStackValue(t,e,n,i),s=u.sumNeg,l=u.sumPos;return a<0?i.getPoint(s+a+n):i.getPoint(l+a+n)}}]),t}();n.default=o},{}],24:[function(t,e,n){function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1?r-1:0),a=1;a3&&void 0!==arguments[3]?arguments[3]:.4,r=t?t:e,o=e,a=n?n:e,u=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),s=Math.sqrt(Math.pow(a.x-o.x,2)+Math.pow(a.y-o.y,2)),l=u/(u+s),c=s/(u+s);l=isNaN(l)?0:l,c=isNaN(c)?0:c;var f=i*l,h=i*c;return{previous:{x:o.x-f*(a.x-r.x),y:o.y-f*(a.y-r.y)},next:{x:o.x+h*(a.x-r.x),y:o.y+h*(a.y-r.y)}}}function v(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)}function y(t,e){var n=v(t,e),i=n&&n.match(/(\d+)px/);return i?Number(i[1]):void 0}function g(t,e,n){var i=f();if(1!==i){var r=t.canvas;A||(r.height=r.height*i,r.width=r.width*i,t.scale(i,i),r.style.height=n+"px",r.style.width=e+"px")}}Object.defineProperty(n,"__esModule",{value:!0});var x="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(t){return"undefined"==typeof t?"undefined":_typeof2(t)}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":"undefined"==typeof t?"undefined":_typeof2(t)};n.sum=r,n.checkWX=a,n.wxConverToPx=u,n.toRadians=s,n.toDegrees=l,n.getWindowSize=c,n.getDPR=f,n.niceNum=h,n.almostEquals=d,n.splineCurve=p,n.getStyle=v,n.readUsedSize=y,n.retinaScale=g;var b=Object.prototype,m=n.is={};["Arguments","Function","String","Number","Date","RegExp","Error","Symbol","Map","WeakMap","Set","WeakSet"].forEach(function(t){m[t]=function(e){return b.toString.call(e)==="[object "+t+"]"}}),m.Array=Array.isArray||function(t){return"[object Array]"===b.toString.call(t)},m.Object=function(t){var e="undefined"==typeof t?"undefined":x(t);return"function"===e||"object"===e&&!!t};var w={},_=w.toString,k=w.hasOwnProperty,P=k.toString,S=P.call(Object);m.PureObject=function(t){var e=void 0,n=void 0;return!(!t||"[object Object]"!==b.toString.call(t))&&(!(e=Object.getPrototypeOf(t))||(n=k.call(e,"constructor")&&e.constructor,"function"==typeof n&&P.call(n)===S))},m.Boolean=function(t){return t===!0||t===!1||"[object Boolean]"===_.call(t)},m.Null=function(t){return null===t},m.Undefined=function(t){return void 0===t},m.NaN=function(t){return m.Number(t)&&t!==+t};var C=(n.REG_HANZI=/[\u4e00-\u9fa5]/,n.REG_ALPHABET=/[a-zA-Z]/,n.REG_NUMBER=/[0-9]/,n.REG_ALPHABET_NUMBER=/[0-9a-zA-Z]/,n.extend=o(!1)),A=(n.extendOwn=o(!0),n.isWeiXinAPP=a()),O=/([\d.]+)rpx/,T=/([\d.]+)rem/;n.uid=function(){var t=0;return function(){return t++,"u"+t}}()},{}],25:[function(t,e,n){(function(n){var i=t("../util/helper"),r=t("performance-now"),o=void 0,a=(0,i.checkWX)();o=a?{}:"undefined"==typeof window?n:window;for(var u=["moz","webkit"],s="AnimationFrame",l=o["request"+s],c=o["cancel"+s]||o["cancelRequest"+s],f=0;!l&&f=r&&e<=a){var s=(u-o)/(a-r),l=o-s*r;return s*e+l}}return 0}function s(t){if("number"==typeof parseInt(t)){var e=parseInt(t);if(e<360&&e>0)return[e,e]}if("string"==typeof t&&b[t]){var n=b[t];if(n.hueRange)return n.hueRange}return[0,360]}function l(t){return c(t).saturationRange}function c(t){t>=334&&t<=360&&(t-=360);for(var e in b){var n=b[e];if(n.hueRange&&t>=n.hueRange[0]&&t<=n.hueRange[1])return b[e]}return"Color not found"}function f(t){if(null===x)return Math.floor(t[0]+Math.random()*(t[1]+1-t[0]));var e=t[1]||1,n=t[0]||0;x=(9301*x+49297)%233280;var i=x/233280;return Math.floor(n+i*(e-n))}function h(t){function e(t){var e=t.toString(16);return 1==e.length?"0"+e:e}var n=v(t),i="#"+e(n[0])+e(n[1])+e(n[2]);return i}function d(t,e,n){var i=n[0][0],r=n[n.length-1][0],o=n[n.length-1][1],a=n[0][1];b[t]={hueRange:e,lowerBounds:n,saturationRange:[i,r],brightnessRange:[o,a]}}function p(){d("monochrome",null,[[0,0],[100,0]]),d("red",[-26,18],[[20,100],[30,92],[40,89],[50,85],[60,78],[70,70],[80,60],[90,55],[100,50]]),d("orange",[19,46],[[20,100],[30,93],[40,88],[50,86],[60,85],[70,70],[100,70]]),d("yellow",[47,62],[[25,100],[40,94],[50,89],[60,86],[70,84],[80,82],[90,80],[100,75]]),d("green",[63,178],[[30,100],[40,90],[50,85],[60,81],[70,74],[80,64],[90,50],[100,40]]),d("blue",[179,257],[[20,100],[30,86],[40,80],[50,74],[60,60],[70,52],[80,44],[90,39],[100,35]]),d("purple",[258,282],[[20,100],[30,87],[40,79],[50,70],[60,65],[70,59],[80,52],[90,45],[100,42]]),d("pink",[283,334],[[20,100],[30,90],[40,86],[60,84],[80,80],[90,75],[100,73]])}function v(t){var e=t[0];0===e&&(e=1),360===e&&(e=359),e/=360;var n=t[1]/100,i=t[2]/100,r=Math.floor(6*e),o=6*e-r,a=i*(1-n),u=i*(1-o*n),s=i*(1-(1-o)*n),l=256,c=256,f=256;switch(r){case 0:l=i,c=s,f=a;break;case 1:l=u,c=i,f=a;break;case 2:l=a,c=i,f=s;break;case 3:l=a,c=u,f=i;break;case 4:l=s,c=a,f=i;break;case 5:l=i,c=a,f=u}var h=[Math.floor(255*l),Math.floor(255*c),Math.floor(255*f)];return h}function y(t){var e=t[0],n=t[1]/100,i=t[2]/100,r=(2-n)*i;return[e,Math.round(n*i/(r<1?r:2-r)*1e4)/100,r/2*100]}function g(t){for(var e=0,n=0;n!==t.length&&!(e>=Number.MAX_SAFE_INTEGER);n++)e+=t.charCodeAt(n);return e}Object.defineProperty(n,"__esModule",{value:!0});var x=null,b={};p();var m=function t(e){if(e=e||{},void 0!==e.seed&&null!==e.seed&&e.seed===parseInt(e.seed,10))x=e.seed;else if("string"==typeof e.seed)x=g(e.seed);else{if(void 0!==e.seed&&null!==e.seed)throw new TypeError("The seed value must be an integer or string");x=null}var n=void 0,u=void 0,s=void 0;if(null!==e.count&&void 0!==e.count){var l=e.count,c=[];for(e.count=null;l>c.length;)x&&e.seed&&(e.seed+=1),c.push(t(e));return e.count=l,c}return n=i(e),u=r(n,e),s=o(n,u,e),a([n,u,s],e)};n.default=m},{}],27:[function(t,e,n){function i(t,e){if(t=t?t:"",e=e||{},t instanceof i)return t;if(!(this instanceof i))return new i(t,e);var n=r(t);this._originalInput=t,this._r=n.r,this._g=n.g,this._b=n.b,this._a=n.a,this._roundA=q(100*this._a)/100,this._format=e.format||n.format,this._gradientType=e.gradientType,this._r<1&&(this._r=q(this._r)),this._g<1&&(this._g=q(this._g)),this._b<1&&(this._b=q(this._b)),this._ok=n.ok,this._tc_id=X++}function r(t){var e={r:0,g:0,b:0},n=1,i=null,r=null,a=null,s=!1,c=!1;return"string"==typeof t&&(t=I(t)),"object"==("undefined"==typeof t?"undefined":N(t))&&(D(t.r)&&D(t.g)&&D(t.b)?(e=o(t.r,t.g,t.b),s=!0,c="%"===String(t.r).substr(-1)?"prgb":"rgb"):D(t.h)&&D(t.s)&&D(t.v)?(i=E(t.s),r=E(t.v),e=l(t.h,i,r),s=!0,c="hsv"):D(t.h)&&D(t.s)&&D(t.l)&&(i=E(t.s),a=E(t.l),e=u(t.h,i,a),s=!0,c="hsl"),t.hasOwnProperty("a")&&(n=t.a)),n=A(n),{ok:s,format:t.format||c,r:U(255,G(e.r,0)),g:U(255,G(e.g,0)),b:U(255,G(e.b,0)),a:n}}function o(t,e,n){return{r:255*O(t,255),g:255*O(e,255),b:255*O(n,255)}}function a(t,e,n){t=O(t,255),e=O(e,255),n=O(n,255);var i,r,o=G(t,e,n),a=U(t,e,n),u=(o+a)/2;if(o==a)i=r=0;else{var s=o-a;switch(r=u>.5?s/(2-o-a):s/(o+a),o){case t:i=(e-n)/s+(e1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}var r,o,a;if(t=O(t,360),e=O(e,100),n=O(n,100),0===e)r=o=a=n;else{var u=n<.5?n*(1+e):n+e-n*e,s=2*n-u;r=i(s,u,t+1/3),o=i(s,u,t),a=i(s,u,t-1/3)}return{r:255*r,g:255*o,b:255*a}}function s(t,e,n){t=O(t,255),e=O(e,255),n=O(n,255);var i,r,o=G(t,e,n),a=U(t,e,n),u=o,s=o-a;if(r=0===o?0:s/o,o==a)i=0;else{switch(o){case t:i=(e-n)/s+(e>1)+720)%360;--e;)r.h=(r.h+o)%360,a.push(i(r));return a}function S(t,e){e=e||6;for(var n=i(t).toHsv(),r=n.h,o=n.s,a=n.v,u=[],s=1/e;e--;)u.push(i({h:r,s:o,v:a})),a=(a+s)%1;return u}function C(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=n);return e}function A(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function O(t,e){z(t)&&(t="100%");var n=W(t);return t=U(e,G(0,parseFloat(t))),n&&(t=parseInt(t*e,10)/100),Math.abs(t-e)<1e-6?1:t%e/parseFloat(e)}function T(t){return U(1,G(0,t))}function M(t){return parseInt(t,16)}function z(t){return"string"==typeof t&&t.indexOf(".")!=-1&&1===parseFloat(t)}function W(t){return"string"==typeof t&&t.indexOf("%")!=-1}function j(t){return 1==t.length?"0"+t:""+t}function E(t){return t<=1&&(t=100*t+"%"),t}function B(t){return Math.round(255*parseFloat(t)).toString(16)}function R(t){return M(t)/255}function D(t){return!!Q.CSS_UNIT.exec(t)}function I(t){t=t.replace(H,"").replace(F,"").toLowerCase();var e=!1;if(J[t])t=J[t],e=!0;else if("transparent"==t)return{r:0,g:0,b:0,a:0,format:"name"};var n;return(n=Q.rgb.exec(t))?{r:n[1],g:n[2],b:n[3]}:(n=Q.rgba.exec(t))?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=Q.hsl.exec(t))?{h:n[1],s:n[2],l:n[3]}:(n=Q.hsla.exec(t))?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=Q.hsv.exec(t))?{h:n[1],s:n[2],v:n[3]}:(n=Q.hsva.exec(t))?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=Q.hex8.exec(t))?{r:M(n[1]),g:M(n[2]),b:M(n[3]),a:R(n[4]),format:e?"name":"hex8"}:(n=Q.hex6.exec(t))?{r:M(n[1]),g:M(n[2]),b:M(n[3]),format:e?"name":"hex"}:(n=Q.hex4.exec(t))?{r:M(n[1]+""+n[1]),g:M(n[2]+""+n[2]),b:M(n[3]+""+n[3]),a:R(n[4]+""+n[4]),format:e?"name":"hex8"}:!!(n=Q.hex3.exec(t))&&{r:M(n[1]+""+n[1]),g:M(n[2]+""+n[2]),b:M(n[3]+""+n[3]),format:e?"name":"hex"}}function L(t){var e,n;return t=t||{level:"AA",size:"small"},e=(t.level||"AA").toUpperCase(),n=(t.size||"small").toLowerCase(),"AA"!==e&&"AAA"!==e&&(e="AA"),"small"!==n&&"large"!==n&&(n="small"),{level:e,size:n}}Object.defineProperty(n,"__esModule",{value:!0});var N="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(t){return"undefined"==typeof t?"undefined":_typeof2(t)}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":"undefined"==typeof t?"undefined":_typeof2(t)},H=/^\s+/,F=/\s+$/,X=0,q=Math.round,U=Math.min,G=Math.max,V=Math.random;i.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,e,n,i,r,o,a=this.toRgb();return t=a.r/255,e=a.g/255,n=a.b/255,i=t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4),r=e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4),o=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4),.2126*i+.7152*r+.0722*o},setAlpha:function(t){return this._a=A(t),this._roundA=q(100*this._a)/100,this},toHsv:function(){var t=s(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=s(this._r,this._g,this._b),e=q(360*t.h),n=q(100*t.s),i=q(100*t.v);return 1==this._a?"hsv("+e+", "+n+"%, "+i+"%)":"hsva("+e+", "+n+"%, "+i+"%, "+this._roundA+")"},toHsl:function(){var t=a(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=a(this._r,this._g,this._b),e=q(360*t.h),n=q(100*t.s),i=q(100*t.l);return 1==this._a?"hsl("+e+", "+n+"%, "+i+"%)":"hsla("+e+", "+n+"%, "+i+"%, "+this._roundA+")"},toHex:function(t){return c(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(t){return f(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:q(this._r),g:q(this._g),b:q(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+q(this._r)+", "+q(this._g)+", "+q(this._b)+")":"rgba("+q(this._r)+", "+q(this._g)+", "+q(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:q(100*O(this._r,255))+"%",g:q(100*O(this._g,255))+"%",b:q(100*O(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+q(100*O(this._r,255))+"%, "+q(100*O(this._g,255))+"%, "+q(100*O(this._b,255))+"%)":"rgba("+q(100*O(this._r,255))+"%, "+q(100*O(this._g,255))+"%, "+q(100*O(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(Y[c(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e="#"+h(this._r,this._g,this._b,this._a),n=e,r=this._gradientType?"GradientType = 1, ":"";if(t){var o=i(t);n="#"+h(o._r,o._g,o._b,o._a)}return"progid:DXImageTransform.Microsoft.gradient("+r+"startColorstr="+e+",endColorstr="+n+")"},toString:function(t){var e=!!t;t=t||this._format;var n=!1,i=this._a<1&&this._a>=0,r=!e&&i&&("hex"===t||"hex6"===t||"hex3"===t||"hex4"===t||"hex8"===t||"name"===t);return r?"name"===t&&0===this._a?this.toName():this.toRgbString():("rgb"===t&&(n=this.toRgbString()),"prgb"===t&&(n=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(n=this.toHexString()),"hex3"===t&&(n=this.toHexString(!0)),"hex4"===t&&(n=this.toHex8String(!0)),"hex8"===t&&(n=this.toHex8String()),"name"===t&&(n=this.toName()),"hsl"===t&&(n=this.toHslString()),"hsv"===t&&(n=this.toHsvString()),n||this.toHexString())},clone:function(){return i(this.toString())},_applyModification:function(t,e){var n=t.apply(null,[this].concat([].slice.call(e)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(y,arguments)},brighten:function(){return this._applyModification(g,arguments)},darken:function(){return this._applyModification(x,arguments)},desaturate:function(){return this._applyModification(d,arguments)},saturate:function(){return this._applyModification(p,arguments)},greyscale:function(){return this._applyModification(v,arguments)},spin:function(){return this._applyModification(b,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(P,arguments)},complement:function(){return this._applyCombination(m,arguments)},monochromatic:function(){return this._applyCombination(S,arguments)},splitcomplement:function(){return this._applyCombination(k,arguments)},triad:function(){return this._applyCombination(w,arguments)},tetrad:function(){return this._applyCombination(_,arguments)}},i.fromRatio=function(t,e){if("object"==("undefined"==typeof t?"undefined":N(t))){var n={};for(var r in t)t.hasOwnProperty(r)&&("a"===r?n[r]=t[r]:n[r]=E(t[r]));t=n}return i(t,e)},i.equals=function(t,e){return!(!t||!e)&&i(t).toRgbString()==i(e).toRgbString()},i.random=function(){return i.fromRatio({r:V(),g:V(),b:V()})},i.mix=function(t,e,n){n=0===n?0:n||50;var r=i(t).toRgb(),o=i(e).toRgb(),a=n/100,u={r:(o.r-r.r)*a+r.r,g:(o.g-r.g)*a+r.g,b:(o.b-r.b)*a+r.b,a:(o.a-r.a)*a+r.a};return i(u)},i.readability=function(t,e){var n=i(t),r=i(e);return(Math.max(n.getLuminance(),r.getLuminance())+.05)/(Math.min(n.getLuminance(),r.getLuminance())+.05)},i.isReadable=function(t,e,n){var r,o,a=i.readability(t,e);switch(o=!1,r=L(n),r.level+r.size){case"AAsmall":case"AAAlarge":o=a>=4.5;break;case"AAlarge":o=a>=3;break;case"AAAsmall":o=a>=7}return o},i.mostReadable=function(t,e,n){var r,o,a,u,s=null,l=0;n=n||{},o=n.includeFallbackColors,a=n.level,u=n.size;for(var c=0;cl&&(l=r,s=i(e[c]));return i.isReadable(t,s,{level:a,size:u})||!o?s:(n.includeFallbackColors=!1,i.mostReadable(t,["#fff","#000"],n))};var J=i.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},Y=i.hexNames=C(J),Q=function(){var t="[-\\+]?\\d+%?",e="[-\\+]?\\d*\\.\\d+%?",n="(?:"+e+")|(?:"+t+")",i="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?",r="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?";return{CSS_UNIT:new RegExp(n),rgb:new RegExp("rgb"+i),rgba:new RegExp("rgba"+r),hsl:new RegExp("hsl"+i),hsla:new RegExp("hsla"+r),hsv:new RegExp("hsv"+i),hsva:new RegExp("hsva"+r),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();n.default=i},{}],28:[function(t,e,n){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.duration=e.duration||1e3,this.ease=e.easing||this._defaultEase,this.start=e.start,this.end=e.end,this.frame=null,this.next=null,this.isRunning=!1,this.events={},this.direction=this.startthis.end&&t>=this.next}[this.direction]}},{key:"_defaultEase",value:function(t,e,n,i){return(t/=i/2)<1?n/2*t*t+e:-n/2*(--t*(t-2)-1)+e}}]),t}();n.default=a},{"./raf":25}],29:[function(t,e,n){function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1&&(t._propertyCache.pop(),t.cp=t._propertyCache[t._propertyCache.length-1]),t.cp}},{key:"_wxSetPropertyCallable",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"set"+e.replace(/(\w)/,function(t){return t.toUpperCase()}),i=this;return a.is.Null(t)||a.is.Undefined(t)?t:i.cp[e]===t?t:(i.isWeiXinAPP?(i._ctx[n](t),i.cp[e]=t):(i._ctx[e]=t,i.cp[e]=i._ctx[e]),t)}},{key:"_wxSetProperty",value:function(t,e){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=this;return a.is.Null(t)||a.is.Undefined(t)?t:i.cp[e]===t?t:(i.isWeiXinAPP?(i.cp[e]=t,n?i._ctx[e]=t:null):(i._ctx[e]=t,i.cp[e]=i._ctx[e]),t)}},{key:"createStyleProperty",value:function(){var t=this,e=["fillStyle","strokeStyle"];e.forEach(function(e){Object.defineProperty(t,e,{get:function(){return t.cp[e]},set:function(n){if(n)return t._wxSetPropertyCallable(n.toLowerCase(),e)}})})}},{key:"createShadowsProperty",value:function(){var t=this,e=this;["shadowBlur","shadowOffsetX","shadowOffsetY","shadowColor"].forEach(function(n){Object.defineProperty(e,n,{get:function(){return e.cp[n]},set:function(e){var i=t;if(i.cp[n]!==e)return i.isWeiXinAPP?(i.cp[n]=e,i._ctx.setShadow(i.cp.shadowOffsetX||0,i.cp.shadowOffsetY||0,i.cp.shadowBlur||0,i.cp.shadowColor||"#000000")):a.is.Null(e)||a.is.Undefined(e)||(i._ctx[n]=e,i.cp[n]=e),e}})})}},{key:"createTextProperty",value:function(){var t=this;["textAlign","textBaseline"].forEach(function(e){Object.defineProperty(t,e,{get:function(){return t.cp[e]},set:function(n){return t._wxSetProperty(n,e)}})}),Object.defineProperty(t,"font",{get:function(){return t.cp.font},set:function(e){if(t.isWeiXinAPP){var n=e.match(c);if(n&&t.cp.font!==e){var i=+n[1];t._ctx.setFontSize(i),t.cp.font=e}}else t.cp.font!==e&&(t._ctx.font=e,t.cp.font=e);return t.cp.font}}),Object.defineProperty(t,"fontSize",{get:function(){return parseInt(t.cp.font)},set:function(e){var n=parseInt(e);if(!a.is.NaN(n)){var i=t.isWeiXinAPP?t.cp.font:t._ctx.font;return i=i.replace(c,n+"px"),i===t.cp.font?t.cp.font:(t.isWeiXinAPP?(t._ctx.setFontSize(n),t.cp.font=i):(t._ctx.font=i,t.cp.font=i),t.cp.font)}}})}},{key:"measureText",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.fontSize,n=this;if(n.isWeiXinAPP){if(!t)return 0;var i=t.length,r=t.match(new RegExp(a.REG_HANZI,"g")),o=r?r.length:0,u=i-o;return{width:e*(u+2*o)/2+e/4}}return n._ctx.measureText(t)}},{key:"_calculateYForTextBaseline",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:l,i=this,r=t;if(!i.isWeiXinAPP)return r;var o=i.fontSize,a=i.textBaseline;switch(a){case"top":r=o*n/10+t;break;case"middle":r=o*n/20+t;break;case"alphabetic":}return r}},{key:"_calculateXFortextAlign",value:function(t,e){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:l,this),i=t;if(!n.isWeiXinAPP)return i;var r=n.textAlign;switch(r){case"end":i=t-n.measureText(e).width;break;case"center":i=t-n.measureText(e).width/2;break;case"start":}return i}},{key:"fillText",value:function(t,e,n){for(var i=arguments.length,r=Array(i>3?i-3:0),o=3;o3?r-3:0),a=3;a0&&void 0!==arguments[0])||arguments[0];this.isWeiXinAPP&&this._ctx.draw(t)}}]),t}()},{"./helper":24}],30:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0}),n.WxBar=n.WxLiner=n.WxDoughnut=n.WxChart=n.getChartInstances=void 0;var r=t("./charts/wxChart"),o=i(r),a=t("./charts/doughnut"),u=i(a),s=t("./charts/liner"),l=i(s),c=t("./charts/bar"),f=i(c);n.getChartInstances=r.getChartInstances,n.WxChart=o.default,n.WxDoughnut=u.default,n.WxLiner=l.default,n.WxBar=f.default},{"./charts/bar":10,"./charts/doughnut":11,"./charts/liner":12,"./charts/wxChart":13}]},{},[30])(30)});
+"use strict";var _typeof2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(t){if("object"===("undefined"==typeof exports?"undefined":_typeof2(exports))&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.WxChart=t()}}(function(){var t;return function t(e,n,i){function r(a,u){if(!n[a]){if(!e[a]){var s="function"==typeof require&&require;if(!u&&s)return s(a,!0);if(o)return o(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return r(n?n:t)},c,c.exports,t,e,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a4){if(1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");o=!0}}else if(6!==a&&8!==a&&9!==a&&12!==a&&1!==arguments.length)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");var u=!o&&(9===a||12===a)||t&&t[0]&&"undefined"!=typeof t[0].z;this._3d=u;for(var s=[],l=0,f=u?3:2;l1e-4)return void(t._linear=!1);t._linear=!0}(this),this._t1=0,this._t2=1,this.update()};h.fromSVG=function(t){var e=t.match(/[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?/g).map(parseFloat),n=/[cq]/.test(t);return n?(e=e.map(function(t,n){return n<2?t:t+e[n%2]}),new h(e)):new h(e)},h.quadraticFromPoints=function(t,e,i,r){if("undefined"==typeof r&&(r=.5),0===r)return new h(e,e,i);if(1===r)return new h(t,e,e);var o=n(2,t,e,i,r);return new h(t,o.A,i)},h.cubicFromPoints=function(t,e,i,r,o){"undefined"==typeof r&&(r=.5);var a=n(3,t,e,i,r);"undefined"==typeof o&&(o=c.dist(e,a.C));var u=o*(1-r)/r,s=c.dist(t,i),l=(i.x-t.x)/s,f=(i.y-t.y)/s,d=o*l,p=o*f,v=u*l,y=u*f,g={x:e.x-d,y:e.y-p},x={x:e.x+v,y:e.y+y},b=a.A,m={x:b.x+(g.x-b.x)/(1-r),y:b.y+(g.y-b.y)/(1-r)},w={x:b.x+(x.x-b.x)/r,y:b.y+(x.y-b.y)/r},_={x:t.x+(m.x-t.x)/r,y:t.y+(m.y-t.y)/r},k={x:i.x+(w.x-i.x)/(1-r),y:i.y+(w.y-i.y)/(1-r)};return new h(t,_,k,i)};var d=function(){return c};h.getUtils=d,h.prototype={getUtils:d,valueOf:function(){return this.toString()},toString:function(){return c.pointsToString(this.points)},toSVG:function(t){if(this._3d)return!1;for(var e=this.points,n=e[0].x,i=e[0].y,r=["M",n,i,2===this.order?"Q":"C"],o=1,a=e.length;o1;e--,n--){for(var i,r=[],o=0;o0},length:function(){return c.length(this.derivative.bind(this))},_lut:[],getLUT:function(t){if(t=t||100,this._lut.length===t)return this._lut;this._lut=[];for(var e=0;e<=t;e++)this._lut.push(this.compute(e/t));return this._lut},on:function(t,e){e=e||5;for(var n,i=this.getLUT(),r=[],o=0,a=0;a1;){for(var h=0;h1;){for(i=[],a=0,u=n.length-1;a=0&&t<=1}),r=r.concat(i[n].sort())}.bind(this)),r=r.sort().filter(function(t,e){return r.indexOf(t)===e}),i.values=r,i},bbox:function(){var t=this.extrema(),e={};return this.dims.forEach(function(n){e[n]=c.getminmax(this,n,t[n])}.bind(this)),e},overlaps:function(t){var e=this.bbox(),n=t.bbox();return c.bboxoverlap(e,n)},offset:function(t,e){if("undefined"!=typeof e){var n=this.get(t),i=this.normal(t),r={c:n,n:i,x:n.x+i.x*e,y:n.y+i.y*e};return this._3d&&(r.z=n.z+i.z*e),r}if(this._linear){var o=this.normal(0),a=this.points.map(function(e){var n={x:e.x+t*o.x,y:e.y+t*o.y};return e.z&&i.z&&(n.z=e.z+t*o.z),n});return[new h(a)]}var u=this.reduce();return u.map(function(e){return e.scale(t)})},simple:function(){if(3===this.order){var t=c.angle(this.points[0],this.points[3],this.points[1]),e=c.angle(this.points[0],this.points[3],this.points[2]);if(t>0&&e<0||t<0&&e>0)return!1}var n=this.normal(0),r=this.normal(1),o=n.x*r.x+n.y*r.y;this._3d&&(o+=n.z*r.z);var u=i(a(o));return u1,u.endcap.virtual=o0&&(r=r.concat(e))}),r},arcs:function(t){t=t||.5;var e=[];return this._iterate(t,e)},_error:function(t,e,n,r){var o=(r-n)/4,a=this.get(n+o),u=this.get(r-o),s=c.dist(t,e),l=c.dist(t,a),f=c.dist(t,u);return i(l-s)+i(f-s)},_iterate:function(t,e){var n,i=0,r=1;do{n=0,r=1;var o,a,u,s,l,f=this.get(i),h=!1,d=!1,p=r,v=1,y=0;do{d=h,s=u,p=(i+r)/2,y++,o=this.get(p),a=this.get(r),u=c.getccenter(f,o,a),u.interval={start:i,end:r};var g=this._error(u,f,i,r);if(h=g<=t,l=d&&!h,l||(v=r),h){if(r>=1){u.interval.end=v=1,s=u;break}r+=(r-i)/2}else r=p}while(!l&&n++<100);if(n>=100)break;s=s?s:u,e.push(s),i=v}while(r<1);return e}},e.exports=h}()},{"./poly-bezier.js":3,"./utils.js":4}],3:[function(t,e,n){!function(){var n=t("./utils.js"),i=function(t){this.curves=[],this._3d=!1,t&&(this.curves=t,this._3d=this.curves[0]._3d)};i.prototype={valueOf:function(){return this.toString()},toString:function(){return"["+this.curves.map(function(t){return n.pointsToString(t.points)}).join(", ")+"]"},addCurve:function(t){this.curves.push(t),this._3d=this._3d||t._3d},length:function(){return this.curves.map(function(t){return t.length()}).reduce(function(t,e){return t+e})},curve:function(t){return this.curves[t]},bbox:function t(){for(var e=this.curves,t=e[0].bbox(),i=1;io.x.min&&(e=o.x.min),n>o.y.min&&(n=o.y.min),i0&&(a.c1=e,a.c2=i,a.s1=t,a.s2=n,o.push(a))}})}),o},makeshape:function(t,e,n){var i=e.points.length,r=t.points.length,o=y.makeline(e.points[i-1],t.points[0]),a=y.makeline(t.points[r-1],e.points[0]),u={startcap:o,forward:t,back:e,endcap:a,bbox:y.findbbox([o,t,e,a])},s=y;return u.intersections=function(t){return s.shapeintersections(u,u.bbox,t,t.bbox,n)},u},getminmax:function(t,e,n){if(!n)return{min:0,max:0};var i,r,o=p,a=v;n.indexOf(0)===-1&&(n=[0].concat(n)),n.indexOf(1)===-1&&n.push(1);for(var u=0,s=n.length;ua&&(a=r[e]);return{min:o,mid:(o+a)/2,max:a,size:a-o}},align:function(t,e){var n=e.p1.x,o=e.p1.y,u=-a(e.p2.y-o,e.p2.x-n),s=function(t){return{x:(t.x-n)*i(u)-(t.y-o)*r(u),y:(t.x-n)*r(u)+(t.y-o)*i(u)}};return t.map(s)},roots:function(t,e){e=e||{p1:{x:0,y:0},p2:{x:1,y:0}};var n=t.length-1,r=y.align(t,e),a=function(t){return 0<=t&&t<=1};if(2===n){var s=r[0].y,c=r[1].y,h=r[2].y,d=s-2*c+h;if(0!==d){var p=-u(c*c-s*h),v=-s+c,g=-(p+v)/d,x=-(-p+v)/d;return[g,x].filter(a)}return c!==h&&0===d?[(2*c-h)/2*(c-h)].filter(a):[]}var b,g,m,w,_,k=r[0].y,P=r[1].y,S=r[2].y,A=r[3].y,d=-k+3*P-3*S+A,s=(3*k-6*P+3*S)/d,c=(-3*k+3*P)/d,h=k/d,r=(3*c-s*s)/3,C=r/3,O=(2*s*s*s-9*s*c+27*h)/27,T=O/2,M=T*T+C*C*C;if(M<0){var z=-r/3,W=z*z*z,j=u(W),E=-O/(2*j),R=E<-1?-1:E>1?1:E,B=o(R),D=l(j),I=2*D;return m=I*i(B/3)-s/3,w=I*i((B+f)/3)-s/3,_=I*i((B+2*f)/3)-s/3,[m,w,_].filter(a)}if(0===M)return b=T<0?l(-T):-l(T),m=2*b-s/3,w=-b-s/3,[m,w].filter(a);var L=u(M);return b=l(-T+L),g=l(T+L),[b-g-s/3].filter(a)},droots:function(t){if(3===t.length){var e=t[0],n=t[1],i=t[2],r=e-2*n+i;if(0!==r){var o=-u(n*n-e*i),a=-e+n,s=-(o+a)/r,l=-(-o+a)/r;return[s,l]}return n!==i&&0===r?[(2*n-i)/(2*(n-i))]:[]}if(2===t.length){var e=t[0],n=t[1];return e!==n?[e/(e-n)]:[]}},inflections:function(t){if(t.length<4)return[];var e=y.align(t,{p1:t[0],p2:t.slice(-1)[0]}),n=e[2].x*e[1].y,i=e[3].x*e[1].y,r=e[1].x*e[2].y,o=e[3].x*e[2].y,a=18*(-3*n+2*i+3*r-o),u=18*(3*n-i-3*r),s=18*(r-n);if(y.approximately(a,0)){if(!y.approximately(u,0)){var l=-s/u;if(0<=l&&l<=1)return[l]}return[]}var c=u*u-4*a*s,f=Math.sqrt(c),o=2*a;return y.approximately(o,0)?[]:[(f-u)/o,-(u+f)/o].filter(function(t){return 0<=t&&t<=1})},bboxoverlap:function(t,e){var i,r,o,a,u,s=["x","y"],l=s.length;for(i=0;i=u)return!1;return!0},expandbox:function(t,e){e.x.mint.x.max&&(t.x.max=e.x.max),e.y.max>t.y.max&&(t.y.max=e.y.max),e.z&&e.z.max>t.z.max&&(t.z.max=e.z.max),t.x.mid=(t.x.min+t.x.max)/2,t.y.mid=(t.y.min+t.y.max)/2,t.z&&(t.z.mid=(t.z.min+t.z.max)/2),t.x.size=t.x.max-t.x.min,t.y.size=t.y.max-t.y.min,t.z&&(t.z.size=t.z.max-t.z.min)},pairiteration:function(t,e,n){var i=t.bbox(),r=e.bbox(),o=1e5,a=n||.5;if(i.x.size+i.y.sizeT||T>M)&&(O+=f),O>M&&(o=M,M=O,O=o)):M-1?n.extendMethod(t,i,e):(n.opt.warn&&console.warn(t+" method already exists within the "+n.context.constructor.name+" component."),n.opt.mergeDuplicates&&n.extendMethod(t,i,e)))}),this.addNewMethod(t,e)}}]),t}(),a=new o;e.exports=a.init.bind(a)},{}],6:[function(e,n,i){(function(r){!function(e){if("object"===("undefined"==typeof i?"undefined":_typeof2(i))&&"undefined"!=typeof n)n.exports=e();else if("function"==typeof t&&t.amd)t([],e);else{var o;o="undefined"!=typeof window?window:"undefined"!=typeof r?r:"undefined"!=typeof self?self:this,o.Ez=e()}}(function(){return function t(n,i,r){function o(u,s){if(!i[u]){if(!n[u]){var l="function"==typeof e&&e;if(!s&&l)return l(u,!0);if(a)return a(u,!0);var c=new Error("Cannot find module '"+u+"'");throw c.code="MODULE_NOT_FOUND",c}var f=i[u]={exports:{}};n[u][0].call(f.exports,function(t){var e=n[u][1][t];return o(e?e:t)},f,f.exports,t,n,i,r)}return i[u].exports}for(var a="function"==typeof e&&e,u=0;u>>0,1)},emit:function(e,n){(t[e]||[]).map(function(t){t(n)}),(t["*"]||[]).map(function(t){t(e,n)})}}}e.exports=i},{}],8:[function(t,e,n){(function(t){(function(){var n,i,r,o,a,u;"undefined"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:"undefined"!=typeof t&&null!==t&&t.hrtime?(e.exports=function(){return(n()-a)/1e6},i=t.hrtime,n=function(){var t;return t=i(),1e9*t[0]+t[1]},o=n(),u=1e9*t.uptime(),a=o-u):Date.now?(e.exports=function(){return Date.now()-r},r=Date.now()):(e.exports=function(){return(new Date).getTime()-r},r=(new Date).getTime())}).call(this)}).call(this,t("_process"))},{_process:9}],9:[function(t,e,n){function i(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function o(t){if(f===setTimeout)return setTimeout(t,0);if((f===i||!f)&&setTimeout)return f=setTimeout,setTimeout(t,0);try{return f(t,0)}catch(e){try{return f.call(null,t,0)}catch(e){return f.call(this,t,0)}}}function a(t){if(h===clearTimeout)return clearTimeout(t);if((h===r||!h)&&clearTimeout)return h=clearTimeout,clearTimeout(t);try{return h(t)}catch(e){try{return h.call(null,t)}catch(e){return h.call(this,t)}}}function u(){y&&p&&(y=!1,p.length?v=p.concat(v):g=-1,v.length&&s())}function s(){if(!y){var t=o(u);y=!0;for(var e=v.length;e;){for(p=v,v=[];++g1)for(var n=1;n.5?s/(2-o-a):s/(o+a),o){case t:i=(e-n)/s+(e1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}var r,o,a;if(t=O(t,360),e=O(e,100),n=O(n,100),0===e)r=o=a=n;else{var u=n<.5?n*(1+e):n+e-n*e,s=2*n-u;r=i(s,u,t+1/3),o=i(s,u,t),a=i(s,u,t-1/3)}return{r:255*r,g:255*o,b:255*a}}function s(t,e,n){t=O(t,255),e=O(e,255),n=O(n,255);var i,r,o=U(t,e,n),a=q(t,e,n),u=o,s=o-a;if(r=0===o?0:s/o,o==a)i=0;else{switch(o){case t:i=(e-n)/s+(e>1)+720)%360;--e;)r.h=(r.h+o)%360,a.push(i(r));return a}function S(t,e){e=e||6;for(var n=i(t).toHsv(),r=n.h,o=n.s,a=n.v,u=[],s=1/e;e--;)u.push(i({h:r,s:o,v:a})),a=(a+s)%1;return u}function A(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=n);return e}function C(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function O(t,n){z(t)&&(t="100%");var i=W(t);return t=q(n,U(0,parseFloat(t))),i&&(t=parseInt(t*n,10)/100),e.abs(t-n)<1e-6?1:t%n/parseFloat(n)}function T(t){return q(1,U(0,t))}function M(t){return parseInt(t,16)}function z(t){return"string"==typeof t&&t.indexOf(".")!=-1&&1===parseFloat(t)}function W(t){return"string"==typeof t&&t.indexOf("%")!=-1}function j(t){return 1==t.length?"0"+t:""+t}function E(t){return t<=1&&(t=100*t+"%"),t}function R(t){return e.round(255*parseFloat(t)).toString(16)}function B(t){return M(t)/255}function D(t){return!!Y.CSS_UNIT.exec(t)}function I(t){t=t.replace(N,"").replace(H,"").toLowerCase();var e=!1;if(V[t])t=V[t],e=!0;else if("transparent"==t)return{r:0,g:0,b:0,a:0,format:"name"};var n;return(n=Y.rgb.exec(t))?{r:n[1],g:n[2],b:n[3]}:(n=Y.rgba.exec(t))?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=Y.hsl.exec(t))?{h:n[1],s:n[2],l:n[3]}:(n=Y.hsla.exec(t))?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=Y.hsv.exec(t))?{h:n[1],s:n[2],v:n[3]}:(n=Y.hsva.exec(t))?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=Y.hex8.exec(t))?{r:M(n[1]),g:M(n[2]),b:M(n[3]),a:B(n[4]),format:e?"name":"hex8"}:(n=Y.hex6.exec(t))?{r:M(n[1]),g:M(n[2]),b:M(n[3]),format:e?"name":"hex"}:(n=Y.hex4.exec(t))?{r:M(n[1]+""+n[1]),g:M(n[2]+""+n[2]),b:M(n[3]+""+n[3]),a:B(n[4]+""+n[4]),format:e?"name":"hex8"}:!!(n=Y.hex3.exec(t))&&{r:M(n[1]+""+n[1]),g:M(n[2]+""+n[2]),b:M(n[3]+""+n[3]),format:e?"name":"hex"}}function L(t){var e,n;return t=t||{level:"AA",size:"small"},e=(t.level||"AA").toUpperCase(),n=(t.size||"small").toLowerCase(),"AA"!==e&&"AAA"!==e&&(e="AA"),"small"!==n&&"large"!==n&&(n="small"),{level:e,size:n}}var N=/^\s+/,H=/\s+$/,F=0,X=e.round,q=e.min,U=e.max,G=e.random;i.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,n,i,r,o,a,u=this.toRgb();return t=u.r/255,n=u.g/255,i=u.b/255,r=t<=.03928?t/12.92:e.pow((t+.055)/1.055,2.4),o=n<=.03928?n/12.92:e.pow((n+.055)/1.055,2.4),a=i<=.03928?i/12.92:e.pow((i+.055)/1.055,2.4),.2126*r+.7152*o+.0722*a},setAlpha:function(t){return this._a=C(t),this._roundA=X(100*this._a)/100,this},toHsv:function(){var t=s(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=s(this._r,this._g,this._b),e=X(360*t.h),n=X(100*t.s),i=X(100*t.v);return 1==this._a?"hsv("+e+", "+n+"%, "+i+"%)":"hsva("+e+", "+n+"%, "+i+"%, "+this._roundA+")"},toHsl:function(){var t=a(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=a(this._r,this._g,this._b),e=X(360*t.h),n=X(100*t.s),i=X(100*t.l);return 1==this._a?"hsl("+e+", "+n+"%, "+i+"%)":"hsla("+e+", "+n+"%, "+i+"%, "+this._roundA+")"},toHex:function(t){return c(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(t){return f(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:X(this._r),g:X(this._g),b:X(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+X(this._r)+", "+X(this._g)+", "+X(this._b)+")":"rgba("+X(this._r)+", "+X(this._g)+", "+X(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:X(100*O(this._r,255))+"%",g:X(100*O(this._g,255))+"%",b:X(100*O(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+X(100*O(this._r,255))+"%, "+X(100*O(this._g,255))+"%, "+X(100*O(this._b,255))+"%)":"rgba("+X(100*O(this._r,255))+"%, "+X(100*O(this._g,255))+"%, "+X(100*O(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(J[c(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e="#"+h(this._r,this._g,this._b,this._a),n=e,r=this._gradientType?"GradientType = 1, ":"";if(t){var o=i(t);n="#"+h(o._r,o._g,o._b,o._a)}return"progid:DXImageTransform.Microsoft.gradient("+r+"startColorstr="+e+",endColorstr="+n+")"},toString:function(t){var e=!!t;t=t||this._format;var n=!1,i=this._a<1&&this._a>=0,r=!e&&i&&("hex"===t||"hex6"===t||"hex3"===t||"hex4"===t||"hex8"===t||"name"===t);return r?"name"===t&&0===this._a?this.toName():this.toRgbString():("rgb"===t&&(n=this.toRgbString()),"prgb"===t&&(n=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(n=this.toHexString()),"hex3"===t&&(n=this.toHexString(!0)),"hex4"===t&&(n=this.toHex8String(!0)),"hex8"===t&&(n=this.toHex8String()),"name"===t&&(n=this.toName()),"hsl"===t&&(n=this.toHslString()),"hsv"===t&&(n=this.toHsvString()),n||this.toHexString())},clone:function(){return i(this.toString())},_applyModification:function(t,e){var n=t.apply(null,[this].concat([].slice.call(e)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(y,arguments)},brighten:function(){return this._applyModification(g,arguments)},darken:function(){return this._applyModification(x,arguments)},desaturate:function(){return this._applyModification(d,arguments)},saturate:function(){return this._applyModification(p,arguments)},greyscale:function(){return this._applyModification(v,arguments)},spin:function(){return this._applyModification(b,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(P,arguments)},complement:function(){return this._applyCombination(m,arguments)},monochromatic:function(){return this._applyCombination(S,arguments)},splitcomplement:function(){return this._applyCombination(k,arguments)},triad:function(){return this._applyCombination(w,arguments)},tetrad:function(){return this._applyCombination(_,arguments)}},i.fromRatio=function(t,e){if("object"==("undefined"==typeof t?"undefined":_typeof2(t))){var n={};for(var r in t)t.hasOwnProperty(r)&&("a"===r?n[r]=t[r]:n[r]=E(t[r]));t=n}return i(t,e)},i.equals=function(t,e){return!(!t||!e)&&i(t).toRgbString()==i(e).toRgbString()},i.random=function(){return i.fromRatio({r:G(),g:G(),b:G()})},i.mix=function(t,e,n){n=0===n?0:n||50;var r=i(t).toRgb(),o=i(e).toRgb(),a=n/100,u={r:(o.r-r.r)*a+r.r,g:(o.g-r.g)*a+r.g,b:(o.b-r.b)*a+r.b,a:(o.a-r.a)*a+r.a};return i(u)},i.readability=function(t,n){var r=i(t),o=i(n);return(e.max(r.getLuminance(),o.getLuminance())+.05)/(e.min(r.getLuminance(),o.getLuminance())+.05)},i.isReadable=function(t,e,n){var r,o,a=i.readability(t,e);switch(o=!1,r=L(n),r.level+r.size){case"AAsmall":case"AAAlarge":o=a>=4.5;break;case"AAlarge":o=a>=3;break;case"AAAsmall":o=a>=7}return o},i.mostReadable=function(t,e,n){var r,o,a,u,s=null,l=0;n=n||{},o=n.includeFallbackColors,a=n.level,u=n.size;for(var c=0;cl&&(l=r,s=i(e[c]));return i.isReadable(t,s,{level:a,size:u})||!o?s:(n.includeFallbackColors=!1,i.mostReadable(t,["#fff","#000"],n))};var V=i.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},J=i.hexNames=A(V),Y=function(){var t="[-\\+]?\\d+%?",e="[-\\+]?\\d*\\.\\d+%?",n="(?:"+e+")|(?:"+t+")",i="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?",r="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?";return{CSS_UNIT:new RegExp(n),rgb:new RegExp("rgb"+i),rgba:new RegExp("rgba"+r),hsl:new RegExp("hsl"+i),hsla:new RegExp("hsla"+r),hsv:new RegExp("hsv"+i),hsva:new RegExp("hsva"+r),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();"undefined"!=typeof n&&n.exports?n.exports=i:"function"==typeof t&&t.amd?t(function(){return i}):window.tinycolor=i}(Math)},{}],11:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e0&&void 0!==arguments[0]?arguments[0]:this.xAxis,e=this,n=void 0,i=e.chartConfig.barPercentage,o=e.chartConfig.pointPercentage,a=e.chartConfig.stacked,u=e.legends,s=u.length,l=t.calculateTickWidth(),c=l*o,f=(l-c)/2,d=0;if(i||(i=a?Math.max.apply(Math,r(u.map(function(t){return t.barPercentage||.8})))||.8:.8),n=Math.max.apply(Math,r([i*c].concat(u.map(function(t){return h.is.Number(t.barWidth)?t.barWidth:0})))),u.forEach(function(t){if(a)t.barWidth=n,t.barPercentage=i,t._standardPercentage=i/s;else{var e=void 0,r=t.barPercentage?t.barPercentage>1?1:t.barPercentage:i;t.barWidth?e=t.barWidth/l:(e=r/s,t.barWidth=c*e),d+=e,t._standardPercentage=e}}),d>1)throw Error("Bar's width too large!");a&&(d=i);var p=s>1?c*(1-d)/(s-1):c*(1-d);return{tickWidth:l,pointPercentage:o,pointWidth:c,pointIntervalWidth:f,legends:u,barIntervalWidth:p}}},{key:"calculateBarRect",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.xAxis,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.yAxis,r=this,o=r.chartConfig.stacked,a=r.barRuler||r.calculateBarRuler(n),u=r.legends[e];if(u){var s=r.legends.slice(0,e).reduce(function(t,e){return t+e.barWidth},0),l=r.visDatasets[t],c=u.key&&"undefined"!=typeof l[u.key]?l[u.key]:null;if(!h.is.Null(c)&&!h.is.Undefined(c)){var f=void 0,d=void 0,p=void 0,v=void 0,y=n.getPoint(t);if(o){f=y.x-a.pointWidth/2+a.barIntervalWidth/2,d=r._getStackPoint(t,e).y,p=u.barWidth;var g=i.getPoint(0).y;v=c<0?c/l.__sumNeg*(i.getPoint(l.__sumNeg).y-g):c/l.__sumPos*(g-i.getPoint(l.__sumPos).y),d=c<0?d-v:d}else f=y.x-a.pointWidth/2+s+a.barIntervalWidth/2*(e+1),d=i.getPoint(c).y,p=u.barWidth,v=y.y-d;return{x:f,y:d,barWidth:p,barHeight:v}}}}},{key:"_drawScale",value:function(t){var e=void 0,n=this;e=t.adjustBox();var i=n.xScaleAxisDatas(),r=n.yScaleAxisDatas(e),o=n.wxCrossScale.draw(e,i,r),a=o.xBox,u=o.yBox;t.addBox(a),t.addBox(u)}},{key:"yScaleAxisDatas",value:function(t){var e=this,n=e.chartConfig.stacked,i=e.ctx,r=e.chartConfig.yScaleItemOptions,o=e.yAxis.calculateTickLimit(t,i);if(n){var a=e.stackYScaleAxisLimit(),u=a.max,s=a.min;return e.yAxis.buildDatasets(u,s,o,void 0,r)}var l=this.visDatasets.reduce(function(t,n){var i=t.max,r=t.min;if(n.display){var o=e.legends.map(function(t){if(t.key)return n[t.key]||0}).concat(i,r);i=Math.max.apply(Math,o),r=Math.min.apply(Math,o)}return{max:i,min:r}},{max:0,min:0}),c=l.max,f=l.min;return e.yAxis.buildDatasets(c,f,o,void 0,r)}},{key:"xScaleAxisDatas",value:function(){var t=this,e=t.chartConfig.xScaleItemOptions,n=t.labels.map(function(t){var n={text:t};return"undefined"!=typeof e&&(n=(0,h.extend)(n,e)),n});return t.xAxis.buildDatasets(n)}},{key:"labels",get:function(){var t=this,e=void 0;return t._labels?t._labels:(e=t.chartConfig.labels)&&h.is.Array(e)?e:(t._labels=t.visDatasets.map(function(t){return t.label}),t._labels)}},{key:"legends",get:function(){var t=this;return t._legends||(t._legends=t._getLegendConfig()),t._legends},set:function(t){this._legends=t}}]),e}(g.default);n.default=L},{"../core/animation":15,"../core/layout":17,"../core/legend":18,"../core/scale":19,"../core/title":20,"../scale/scale.category":21,"../scale/scale.crosshelp":22,"../scale/scale.liner":23,"../scale/scale.stackhelp":24,"../util/helper":25,"../util/randomColor":27,"../util/wxCanvas":29,"./wxChart":14,"es6-mixins":5,tinycolor2:10}],12:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==("undefined"==typeof e?"undefined":_typeof2(e))&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":_typeof2(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n0?P:-P),z=C,W=A-o>0?M+4:M-4-T,j=z+i.fontSize/2;i.beginPath(),i.lineWidth=1,i.strokeStyle=d,i.fillStyle=d,i.fontSize=p,i.moveTo(_,k),i.lineTo(A,C),i.lineTo(M,z),i.stroke(),i.fillText(f,W,j),i.draw()}}},{key:"drawDoughnut",value:function(t,e){var n=this,i=n.chartConfig.animate;n.chartConfig.animateOptions;if(i){var r=n._getAnimationDrawDoughnut(t,e);if(!r)return;n.wxAnimation.pushActions(r)}else n._drawDoughnut(t,e)}},{key:"_getAnimationDrawDoughnut",value:function(t,e){var n=this,i=n.ctx,r=n.chartConfig.animateOptions,o=n.config.backgroundColor,a=e.box,u=(e.pointX,e.pointY,e.totalValue),s=e.rotation,l=(e.outerRadius,e.borderWidth,e.totalAngle),c=r.end-r.start;return function(f,h,d){var p=f/c,v=l*p;i.save(),i.beginPath();return o?(i.fillStyle=o,i.strokeStyle=o,i.fillRect(a.x,a.y,a.outerWidth,a.outerHeight)):i.clearRect(a.x,a.y,a.outerWidth,a.outerHeight),i.draw(),r.end===f?n._drawDoughnut(t,e):!function(){var i=s;t.forEach(function(t){var r=i,o=r+v*(t.value/u),a=(0,m.extend)({startAngle:r,endAngle:o},e);n.drawData(t,a),i=o})}(),i.restore(),f}}},{key:"_drawDoughnut",value:function(t,e){var n=this,i=e.totalValue,r=e.rotation,o=e.totalAngle,a=r;n.initAvoidCollision(),t.forEach(function(t){var r=a,u=r+o*(t.value/i),s=(0,m.extend)({startAngle:r,endAngle:u},e);n.drawData(t,s),n.drawLabel(t,s),a=u})}},{key:"_longestLabel",value:function(t){var e=this,n=e.visDatasets,i=e.ctx,r=0;return n.forEach(function(n){var o=n.label,a=n.value,u=n.format;o=m.is.Function(u)?u.call(e,o,a,t,0,n):o;var s=i.measureText(o).width;r=s>r?s:r}),r}},{key:"_maximalLabelFontSize",value:function(){var t=this,e=t.visDatasets,n=0;return e.forEach(function(t){var e=t.fontSize;n=e>n?e:n}),n}},{key:"initAvoidCollision",value:function(){this._lastPoint=null}},{key:"avoidCollision",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.ctx.fontSize+4,i=this,r=(i.box,e.x);e.y;if(i._lastPoint){var o=i._lastPoint.x,a=i._lastPoint.y,u=t.x,s=t.y;if((u-r)*(o-r)>0&&Math.abs(a-s)0?a+n:a-n;t.y=l}}return this._lastPoint=t,t}}]),e}(f.default);n.default=S},{"../core/animation":15,"../core/layout":17,"../core/legend":18,"../core/title":20,"../util/helper":25,"../util/randomColor":27,"../util/wxCanvas":29,"./wxChart":14}],13:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==("undefined"==typeof e?"undefined":_typeof2(e))&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":_typeof2(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:1,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return n?(t%e+i*e)/(e*n):0},this._getCurr=function(t,e){if(!(e>t.length-1))return t[e]},this._getNext=function(e,n,i){if(!(n>=e.length-1)){var r=e[n+1];return r.point?r:i?t._getNext(e,n+1,i):void 0}},this._getNextPoint=function(e,n,i){var r=t._getNext(e,n,i);return r?r.point:null},this._getPre=function(e,n,i){if(!(n<=0)){var r=e[n-1];return r.point?r:i?t._getPre(e,n-1,i):void 0}},this._getPrePoint=function(e,n,i){var r=t._getPre(e,n,i);return r?r.point:null},this._lineToPoint=function(e,n,i,r){var o=t.ctx;if(r&&0!==r){var a=(0,f.splineCurve)(e,n,i,r);e?o.bezierCurveTo(e.controlPoints.next.x,e.controlPoints.next.y,a.previous.x,a.previous.y,n.x,n.y):o.moveTo(n.x,n.y),n.controlPoints=a}else o.lineTo(n.x,n.y)},this._animateLineToPoint=function(e,n,i,r,o,a){var u=t.ctx;if(a&&0!==a){var s=void 0,l=void 0,c=void 0,h=void 0,d=(0,f.splineCurve)(e,n,i,a);if(e&&n){var p=new E({x:e.x,y:e.y},{x:e.controlPoints.next.x,y:e.controlPoints.next.y},{x:d.previous.x,y:d.previous.y},{x:n.x,y:n.y}),v=p.split(r||0,o);s=v.point(0),l=v.point(1),c=v.point(2),h=v.point(3),u.moveTo(Math.round(s.x),s.y),u.bezierCurveTo(l.x,l.y,c.x,c.y,Math.round(h.x),h.y)}return n.controlPoints=d,{startPoint:s?{x:Math.round(s.x),y:s.y}:null,endPoint:h?{x:Math.round(h.x),y:h.y}:null}}var y=e.x,g=n.x,x=e.y,b=n.y,m=Math.sqrt(Math.pow(g-y,2)+Math.pow(b-x,2)),w=(g-y)/m,_=(b-x)/m,k=y+w*o,P=x+_*o;return u.moveTo(y,x),u.lineTo(k,P),{startPoint:e,endPoint:{x:k,y:P}}},this.__fillInHere=function(e,n,i,r){var o=t.ctx;o.lineTo(n.x,i),o.lineTo(e.x,i),o.globalAlpha=r,o.fill(),o.globalAlpha=1},this._drawPoint=function(e,n,i){if(i&&i.point){var r=i.data,o=r.pointBorderColor,a=r.pointBorderWidth,u=r.pointRadius,s=(r.pointStyle,r.label),l=r.showItem,c=r.format,h=i.point,d=h.x,p=h.y;if(u&&(e.beginPath(),e.arc(d,p,u,0,2*Math.PI),e.fill()),l){var v=e.fillStyle;e.textBaseline="bottom",e.fillStyle=R(v).darken(15).toString(),e.fillStyle=v;var y=f.is.Function(c)?c.call(t,s,i.value,i.index):i.value+"",g=(n.x,n.y,d-e.measureText(y).width/2),x=p-e.fontSize/6-(u||0)-(a||0);g1?i-1:0),o=1;o=n.actions.length)){var r=void 0,o=n.actions[i],a=i+1<=n.actions.length?n.actions[i+1]:null;return n.emit("tick",{value:t,preRet:e,toNext:n.handOverAction,nextAction:a,parallel:!1}),r=o.apply(n,[t,e,n.handOverAction,a])}}},{key:"runTickParallel",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=this,i=n.actions,r=n.actions.length;return i.forEach(function(o,a){var u=e?e[a]:null,s=function(){},l=a+10&&void 0!==arguments[0]&&arguments[0],e=this;e.emit("start",{parallel:t}),e.started=!0,e.tweenzerHandler.on("tick",e.tick(t)).on("done",function(){e.currentActionIndex=0,e.started=!1,e.emit("done",{parallel:t})}).begin()}}]),t}();n.default=g},{"../util/helper":25,"../util/tweezer":28,"es6-mixins":5,"ez.js":6,mitt:7}],16:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0});var o=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},n=this;if((a.is.Undefined(t)||a.is.Null(t))&&(t=n.datasets,!t))throw new Error("Datasets is null");return a.is.Array(t)||(t=[t]),t=t.map(function(t){return(0,a.extend)({},e,t)}),n._datasets=t,n._visDatasets=null,n._datasets}},{key:"update",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this;if(i.clear(),t){if(t=i.init(t),e&&e instanceof u.BoxInstance)e=i.box=i.calculateBox(e,t,n);else{if(!i.box)return;e=i.box}i.isVisiable()&&i.draw(t,e,n)}}},{key:"calculateBox",value:function(t){arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.datasets,arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config;return t}},{key:"setBox",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this;e&&n.clear(),t&&t instanceof u.BoxInstance&&(n.box=t),e&&n.isVisiable()&&n.draw()}},{key:"draw",value:function(){arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.datasets,arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box,arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config}},{key:"clear",value:function(){var t=this;t.box&&(t.wxChart.ctx.clearRect(t.box.x,t.box.y,t.box.outerWidth,t.box.outerHeight),t.wxChart.ctx.draw())}},{key:"isVisiable",value:function(){return!!this.config.display}},{key:"isHorizontal",value:function(){return"top"==this.position||"bottom"==this.position}},{key:"datasets",get:function(){return this._datasets},set:function(t){return this.update(t)}},{key:"visDatasets",get:function(){return this._visDatasets?this._visDatasets:this._visDatasets=this.datasets.filter(function(t){return!!t.display})},set:function(t){}},{key:"position",get:function(){return this.config.position},set:function(t){return this.config.position=t,this.update()}}]),t}());n.default=f},{"../charts/wxChart":14,"../util/helper":25,"../util/wxCanvas":29,"./layout":17}],17:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0}),n.BoxInstance=void 0;var o=function(){function t(t,e){for(var n=0;nt.ex||e.ey1&&void 0!==arguments[1]?arguments[1]:v,i=this,r=i.config;return t=l(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"init",this).call(this,t,n),t=i.calculateLegendItem(t,r),i._datasets=t,t}},{key:"calculateLegendItem",value:function(t,e){var n=this,i=e.labels||{},r=n.wxChart.ctx,o=i.boxWidth,a=i.fontSize;return!h.is.Array(t)&&h.is.PureObject(t)&&(t=[t]),t=t.map(function(t){var e=r.measureText(t.text).width,n=o+a/2+e;return t._prop={fontSize:a,boxHeight:a,boxWidth:o,textWidth:e,width:n},t})}},{key:"calculateBox",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.datasets,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this,r=void 0,o=void 0,a=void 0,s=void 0,l=i.wxChart,c=l.ctx,f=c.fontSize,h=t.x,p=t.y,v=n.labels.padding||10;if(i.isHorizontal())!function(){a=n.fullWidth?t.width-2*v:n.width,r=n.fullWidth?t.width:n.width,s=f,o=s+2*v;var u=0,l=0,c=0;e.forEach(function(t){var e=t._prop,n=e.width+v,i=l+n;i>a?(c=ca&&(console.warn("The width options is too small! width=",a,".The chart will set to ",i),a=n)):l+=n,e.padding=v,e.lineNum=u,e.outerWidth=n}),c=c0&&(s=f*(u+1)+u*f/2,o=s+2*v),h+=(a-c)/2,"bottom"==i.position&&(p=t.ry-o,p=p0&&void 0!==arguments[0]?arguments[0]:this.datasets,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box,n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,this),i=n.wxChart.ctx,r=e.x,o=e.y;e.width,e.outerWidth,e.height,e.outerHeight;n.clear(),i.save();var a=-1,u=r,s=o;t.forEach(function(t){var e=t.text,n=t.display,l=t.fillStyle,c=t.fillAlpha,f=t.strokeStyle,h=t.lineCap,d=t.lineJoin,p=t.lineWidth,v=t._prop,y=v.width,g=v.fontSize,x=v.textWidth,b=v.padding,m=v.lineNum,w=v.boxWidth,_=v.boxHeight,k=v.outerWidth;if(y){i.textBaseline="top",i.textAlign="start",i.fillStyle=l,i.fontSize=g,i.strokeStyle=f,i.lineCap=h,i.lineJoin=d,i.lineWidth=p,a0&&void 0!==arguments[0]?arguments[0]:this.wxChart.ctx,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.datasets,n=this,i=0;return e.forEach(function(e){if(e.display){var r=void 0;if(e.textWidth)r=e.textWidth;else{var o=n.getTicksText(e);r=t.measureText(o).width,e.textWidth=r}i=i1&&void 0!==arguments[1]?arguments[1]:v,i=this,r=i.config;return t=s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"init",this).call(this,t,n),i.visDatasets=null,i._datasets=t,i.fixPadding=i.calculateFixPadding(t,r),t}},{key:"calculateBox",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.datasets,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this,r=i.wxChart.ctx,o=r.fontSize,a=i.calculateTickWidth(e,t,n),u=void 0,s=void 0,c=void 0,h=void 0,d=void 0,p=void 0,v=(0,l.toRadians)(n.ticks.minRotation||0),y=(0,l.toRadians)(n.ticks.maxRotation||90),g=v,x=i.lineSpace,b=1,m=i.longestText();if(i.isHorizontal())m>a?a<=r.fontSize?g=y:(g=Math.acos(a/m),h=Math.sin(g)*m+b+x+o/2,h>t.height?(h=t.height,g=Math.asin((h-b-x-o/2)/m)):g>y&&(g=y,h=Math.sin(g)*m+b+x+o/2)):h=1.5*o+b+x,c=t.width,d=t.outerWidth,p=h;else{var w=0;n.title&&(w=r.measureText(n.title,n.titleFontSize).width-b-x-o/2),c=m+b+x+o/2,c=c>w?c:w,c>t.width&&(c=t.width,g=Math.acos((c-b-x-o/2)/m),g=g>y?y:g),h=t.height,d=c,p=t.outerHeight}switch(i.position){case"left":case"top":u=t.x,s=t.y;break;case"right":u=t.x+t.width-d,s=t.y;break;case"bottom":u=t.x,s=t.y+t.height-p}return i.fontRadians=g,new f.BoxInstance(i.position,u,s,c,h,d,p)}},{key:"calculateTickWidth",value:function(){var t=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.datasets,arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box),e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,n=this,i=void 0,r=n.visDatasets,o=e.ticks.lineWidth,a=l.sum.apply(null,r.map(function(t){return t.lineWidth||o})),u=n.fixPadding;if(n.isHorizontal()){var s=t.width,c=t.marginLR,f=n.calculateTitleWidth(),h=n.config.extendLeft;0!==c?a+=2*o:0!==h&&(a+=o),i=(s-f-a-u)/(r.length-1)}else{var d=t.height,p=t.marginTB,v=n.calculateTitleWidth(),y=e.extendTop;0!==p?a+=2*o:0!==y&&(a+=o),i=(d-v-a-u)/(r.length-1)}return i}},{key:"calculateTitleWidth",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.config,e=void 0,n=this,i=n.wxChart.ctx;return e=n.isHorizontal()?t.title?i.measureText(t.title,t.titleFontSize).width:0:t.title?t.titleFontSize:0;
+}},{key:"_getTicksLineWidthOffset",value:function(t,e){var n=0,i=this;e||(e=i.visDatasets);var r=this.config.ticks.lineWidth;return e.map(function(e,i){t>=i&&(n+=e.lineWidth||r)}),n}},{key:"getTicksPosition",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.box,i=this,r=(i.wxChart.ctx,i.fixPadding);e||(e=i.calculateTickWidth());var o=i.visDatasets,a=void 0,u=void 0;return i.isHorizontal()?(a=t===-1?n.x-i.config.extendLeft+r/2+(i.config.extendLeft?i.config.ticks.lineWidth:0):n.lx+i._getTicksLineWidthOffset(t,o)+e*t+r/2,u="top"===i.position?n.ry-i.lineSpace:n.ly+i.lineSpace):(u=t===-1?n.y-i.config.extendTop+r/2+(i.config.extendTop?i.config.ticks.lineWidth:0):n.ly+i.calculateTitleWidth()+i._getTicksLineWidthOffset(t,o)+e*t+r/2,a="left"===i.position?n.rx-i.lineSpace:n.lx+i.lineSpace),{x:a,y:u}}},{key:"_initDrawATickText",value:function(){var t=this,e=t.wxChart.ctx;switch(t.position){case"left":e.textAlign="end",e.textBaseline="middle";break;case"right":e.textAlign="start",e.textBaseline="middle";break;case"top":e.textAlign="center",e.textBaseline="alphabetic";break;case"bottom":e.textAlign="center",e.textBaseline="top"}}},{key:"_drawATickLine",value:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,r=this,o=r.wxChart.ctx,a=r.lineSpace,u=t,s=e;switch(r.position){case"left":u+=a;break;case"right":u-=a;break;case"top":s+=a;break;case"bottom":s-=a}o.beginPath(),o.moveTo(u,s),o.lineTo(t,e),o.stroke();var c=void 0;if(i&&i.text&&l.is.String(i.text)){o.save(),r._initDrawATickText(),c=i.format?i.format.call(r,i.text,i,t,e,r.fontRadians):i.text;var f=i.textWidth?i.textWidth:o.measureText(c).width;switch(r.position){case"left":o.translate(t-n/2,e+Math.sin(r.fontRadians)*f/2),o.rotate(r.fontRadians);break;case"right":o.translate(t+n/2,e+Math.sin(r.fontRadians)*f/2),o.rotate(-r.fontRadians);break;case"top":o.translate(t,e-n/2),o.rotate(-r.fontRadians);break;case"bottom":o.translate(t,e+n/2),o.rotate(r.fontRadians)}o.fillText(c,0,0),o.restore()}}},{key:"draw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.datasets,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this,r=i.wxChart.ctx,o=r.fontSize,a=i.fixPadding,u=i.calculateTickWidth(t,e,n),s=n.ticks,l=(e.x,e.y,e.width,e.outerWidth,e.height,e.outerHeight,i.visDatasets),c=i.getTicksPosition(-1,u),f=c.x,h=c.y,d=c.x,p=c.y;r.save(),r.fillStyle=s.fontColor,r.fontSize=s.fontSize,r.lineWidth=s.lineWidth;var v=i.calculateTitleWidth();i.isHorizontal()?((i.box.marginLR||n.extendLeft)&&(f+=s.lineWidth,i._drawATickLine(f,h,o)),f=i.box.lx+a/2,l.map(function(t){f+=t.lineWidth,r.fillStyle=t.fontColor,r.lineWidth=t.lineWidth,r.fontSize=t.fontSize||r.fontSize,i._drawATickLine(f,h,o,t),f+=u}),f=i.box.ex-a/2-v,i.box.marginLR&&i._drawATickLine(f,h,o),r.fillStyle=s.fontColor,r.lineWidth=n.lineWidth,r.beginPath(),r.moveTo(d,h),r.lineTo(f,h),r.stroke(),n.title&&(r.save(),f+=o/2,r.fontSize=n.titleFontSize,r.textAlign="start",r.textBaseline="bottom",r.fillStyle=n.titleFontColor,r.fillText(n.title,f,h),r.restore())):(n.title&&(r.save(),r.fontSize=n.titleFontSize,r.textAlign="center",r.textBaseline="bottom",r.fillStyle=n.titleFontColor,r.fillText(n.title,f,h),r.restore()),(i.box.marginTB||n.extendTop)&&(h+=v,i._drawATickLine(f,h,o)),h=i.box.ly+a/2+v,l.map(function(t){h+=t.lineWidth,r.fillStyle=t.fontColor,r.lineWidth=t.lineWidth,r.fontSize=t.fontSize||r.fontSize,i._drawATickLine(f,h,o,t),h+=u}),h=i.box.ey-a/2,i.box.marginTB&&i._drawATickLine(f,h,o),r.fillStyle=s.fontColor,r.lineWidth=n.lineWidth,r.beginPath(),r.moveTo(f,p+v),r.lineTo(f,h),r.stroke()),r.draw(),r.restore()}},{key:"getPoint",value:function(t){return null}},{key:"lineSpace",get:function(){var t=this;return t._lineSpace?t._lineSpace:(t._lineSpace=this.config.lineSpace||.5*this.wxChart.ctx.fontSize,t._lineSpace)}}]),e}(d.default);n.default=y},{"../util/helper":25,"../util/wxCanvas":29,"./base":16,"./layout":17}],20:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==("undefined"==typeof e?"undefined":_typeof2(e))&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":_typeof2(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},this),n=e.config;if(t=t?t:n.text,c.is.Undefined(t)||c.is.Null(t))throw new Error("Text is null");return e._datasets=t,t}},{key:"calculateBox",value:function(t){var e=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.config.text,arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config),n=this,i=n.wxChart,r=(i.ctx,e.fontSize||16),o=t.x,a=t.y,u=e.padding||10,s=e.fullWidth?t.width-2*u:e.width,l=e.fullWidth?t.width:e.width,c=r,h=c+2*u;return"bottom"==e.position&&(a=t.ry-h,a=a0&&void 0!==arguments[0]?arguments[0]:this.config.text,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.box,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.config,i=this,r=i.wxChart.ctx,o=e.x,a=e.y,u=e.width;e.outerWidth,e.height,e.outerHeight;if(c.is.Undefined(t)||c.is.Null(t))throw new Error("Text is null");var s=n.fontColor,l=n.fontSize;i.clear(),r.save(),r.textBaseline="top",r.textAlign="start",r.fillStyle=s,r.fontSize=l;var f=r.measureText(t).width;o+=(u-f)/2,r.fillText(t,o,a),r.restore(),r.draw()}}]),e}(l.default);n.default=d},{"../util/helper":25,"./base":16,"./layout":17}],21:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==("undefined"==typeof e?"undefined":_typeof2(e))&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":_typeof2(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n0)r=i;else{var a=(0,c.niceNum)(t-e,!1);r=(0,c.niceNum)(a/(n-1),!0)}var u=Math.floor(e/r)*r,s=Math.ceil(t/r)*r,l=(s-u)/r;l=(0,c.almostEquals)(l,Math.round(l),r/1e3)?Math.round(l):Math.ceil(l);for(var f=0;fn&&(n=o)}),{max:n,min:e}}},{key:"_getStackValue",value:function(t,e){for(var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.yAxis,this),i=n.visDatasets[t],r=void 0,o=0,a=0,u=0;u2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:this.yAxis,r=this,o=r.visDatasets[t],a=o[r.legends[e].key],u=r._getStackValue(t,e,n,i),s=u.sumNeg,l=u.sumPos;return a<0?i.getPoint(s+a+n):i.getPoint(l+a+n)}}]),t}();n.default=o},{}],25:[function(t,e,n){function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1?r-1:0),a=1;a3&&void 0!==arguments[3]?arguments[3]:.4,r=t?t:e,o=e,a=n?n:e,u=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),s=Math.sqrt(Math.pow(a.x-o.x,2)+Math.pow(a.y-o.y,2)),l=u/(u+s),c=s/(u+s);l=isNaN(l)?0:l,c=isNaN(c)?0:c;var f=i*l,h=i*c;return{previous:{x:o.x-f*(a.x-r.x),y:o.y-f*(a.y-r.y)},next:{x:o.x+h*(a.x-r.x),y:o.y+h*(a.y-r.y)}}}function v(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)}function y(t,e){var n=v(t,e),i=n&&n.match(/(\d+)px/);return i?Number(i[1]):void 0}function g(t,e,n){var i=f();if(1!==i){var r=t.canvas;C||(r.height=r.height*i,r.width=r.width*i,t.scale(i,i),r.style.height=n+"px",r.style.width=e+"px")}}Object.defineProperty(n,"__esModule",{value:!0});var x="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(t){return"undefined"==typeof t?"undefined":_typeof2(t)}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":"undefined"==typeof t?"undefined":_typeof2(t)};n.sum=r,n.checkWX=a,n.wxConverToPx=u,n.toRadians=s,n.toDegrees=l,n.getWindowSize=c,n.getDPR=f,n.niceNum=h,n.almostEquals=d,n.splineCurve=p,n.getStyle=v,n.readUsedSize=y,n.retinaScale=g;var b=Object.prototype,m=n.is={};["Arguments","Function","String","Number","Date","RegExp","Error","Symbol","Map","WeakMap","Set","WeakSet"].forEach(function(t){m[t]=function(e){return b.toString.call(e)==="[object "+t+"]"}}),m.Array=Array.isArray||function(t){return"[object Array]"===b.toString.call(t)},m.Object=function(t){var e="undefined"==typeof t?"undefined":x(t);return"function"===e||"object"===e&&!!t};var w={},_=w.toString,k=w.hasOwnProperty,P=k.toString,S=P.call(Object);m.PureObject=function(t){var e=void 0,n=void 0;return!(!t||"[object Object]"!==b.toString.call(t))&&(!(e=Object.getPrototypeOf(t))||(n=k.call(e,"constructor")&&e.constructor,"function"==typeof n&&P.call(n)===S))},m.Boolean=function(t){return t===!0||t===!1||"[object Boolean]"===_.call(t)},m.Null=function(t){return null===t},m.Undefined=function(t){return void 0===t},m.NaN=function(t){return m.Number(t)&&t!==+t};var A=(n.REG_HANZI=/[\u4e00-\u9fa5]/,n.REG_ALPHABET=/[a-zA-Z]/,n.REG_NUMBER=/[0-9]/,n.REG_ALPHABET_NUMBER=/[0-9a-zA-Z]/,n.extend=o(!1)),C=(n.extendOwn=o(!0),n.isWeiXinAPP=a()),O=/([\d.]+)rpx/,T=/([\d.]+)rem/;n.uid=function(){var t=0;return function(){return t++,"u"+t}}()},{}],26:[function(t,e,n){(function(n){var i=t("../util/helper"),r=t("performance-now"),o=void 0,a=(0,i.checkWX)();o=a?{}:"undefined"==typeof window?n:window;for(var u=["moz","webkit"],s="AnimationFrame",l=o["request"+s],c=o["cancel"+s]||o["cancelRequest"+s],f=0;!l&&f=r&&e<=a){var s=(u-o)/(a-r),l=o-s*r;return s*e+l}}return 0}function s(t){if("number"==typeof parseInt(t)){var e=parseInt(t);if(e<360&&e>0)return[e,e]}if("string"==typeof t&&b[t]){var n=b[t];if(n.hueRange)return n.hueRange}return[0,360]}function l(t){return c(t).saturationRange}function c(t){t>=334&&t<=360&&(t-=360);for(var e in b){var n=b[e];if(n.hueRange&&t>=n.hueRange[0]&&t<=n.hueRange[1])return b[e]}return"Color not found"}function f(t){if(null===x)return Math.floor(t[0]+Math.random()*(t[1]+1-t[0]));var e=t[1]||1,n=t[0]||0;x=(9301*x+49297)%233280;var i=x/233280;return Math.floor(n+i*(e-n))}function h(t){function e(t){var e=t.toString(16);return 1==e.length?"0"+e:e}var n=v(t),i="#"+e(n[0])+e(n[1])+e(n[2]);return i}function d(t,e,n){var i=n[0][0],r=n[n.length-1][0],o=n[n.length-1][1],a=n[0][1];b[t]={hueRange:e,lowerBounds:n,saturationRange:[i,r],brightnessRange:[o,a]}}function p(){d("monochrome",null,[[0,0],[100,0]]),d("red",[-26,18],[[20,100],[30,92],[40,89],[50,85],[60,78],[70,70],[80,60],[90,55],[100,50]]),d("orange",[19,46],[[20,100],[30,93],[40,88],[50,86],[60,85],[70,70],[100,70]]),d("yellow",[47,62],[[25,100],[40,94],[50,89],[60,86],[70,84],[80,82],[90,80],[100,75]]),d("green",[63,178],[[30,100],[40,90],[50,85],[60,81],[70,74],[80,64],[90,50],[100,40]]),d("blue",[179,257],[[20,100],[30,86],[40,80],[50,74],[60,60],[70,52],[80,44],[90,39],[100,35]]),d("purple",[258,282],[[20,100],[30,87],[40,79],[50,70],[60,65],[70,59],[80,52],[90,45],[100,42]]),d("pink",[283,334],[[20,100],[30,90],[40,86],[60,84],[80,80],[90,75],[100,73]])}function v(t){var e=t[0];0===e&&(e=1),360===e&&(e=359),e/=360;var n=t[1]/100,i=t[2]/100,r=Math.floor(6*e),o=6*e-r,a=i*(1-n),u=i*(1-o*n),s=i*(1-(1-o)*n),l=256,c=256,f=256;switch(r){case 0:l=i,c=s,f=a;break;case 1:l=u,c=i,f=a;break;case 2:l=a,c=i,f=s;break;case 3:l=a,c=u,f=i;break;case 4:l=s,c=a,f=i;break;case 5:l=i,c=a,f=u}var h=[Math.floor(255*l),Math.floor(255*c),Math.floor(255*f)];return h}function y(t){var e=t[0],n=t[1]/100,i=t[2]/100,r=(2-n)*i;return[e,Math.round(n*i/(r<1?r:2-r)*1e4)/100,r/2*100]}function g(t){for(var e=0,n=0;n!==t.length&&!(e>=Number.MAX_SAFE_INTEGER);n++)e+=t.charCodeAt(n);return e}Object.defineProperty(n,"__esModule",{value:!0});var x=null,b={};p();var m=function t(e){if(e=e||{},void 0!==e.seed&&null!==e.seed&&e.seed===parseInt(e.seed,10))x=e.seed;else if("string"==typeof e.seed)x=g(e.seed);else{if(void 0!==e.seed&&null!==e.seed)throw new TypeError("The seed value must be an integer or string");x=null}var n=void 0,u=void 0,s=void 0;if(null!==e.count&&void 0!==e.count){var l=e.count,c=[];for(e.count=null;l>c.length;)x&&e.seed&&(e.seed+=1),c.push(t(e));return e.count=l,c}return n=i(e),u=r(n,e),s=o(n,u,e),a([n,u,s],e)};n.default=m},{}],28:[function(t,e,n){function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,t),this.duration=e.duration||1e3,this.ease=e.easing||this._defaultEase,this.start=e.start,this.end=e.end,this.frame=null,this.next=null,this.isRunning=!1,this.events={},this.direction=this.startthis.end&&t>=this.next}[this.direction]}},{key:"_defaultEase",value:function(t,e,n,i){return(t/=i/2)<1?n/2*t*t+e:-n/2*(--t*(t-2)-1)+e}}]),t}();n.default=a},{"./raf":26}],29:[function(t,e,n){function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1&&(t._propertyCache.pop(),t.cp=t._propertyCache[t._propertyCache.length-1]),t.cp}},{key:"_wxSetPropertyCallable",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"set"+e.replace(/(\w)/,function(t){return t.toUpperCase()}),i=this;return a.is.Null(t)||a.is.Undefined(t)?t:i.cp[e]===t?t:(i.isWeiXinAPP?(i._ctx[n](t),i.cp[e]=t):(i._ctx[e]=t,i.cp[e]=i._ctx[e]),t)}},{key:"_wxSetProperty",value:function(t,e){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=this;return a.is.Null(t)||a.is.Undefined(t)?t:i.cp[e]===t?t:(i.isWeiXinAPP?(i.cp[e]=t,n?i._ctx[e]=t:null):(i._ctx[e]=t,i.cp[e]=i._ctx[e]),t)}},{key:"createStyleProperty",value:function(){var t=this,e=["fillStyle","strokeStyle"];e.forEach(function(e){Object.defineProperty(t,e,{get:function(){return t.cp[e]},set:function(n){if(n)return t._wxSetPropertyCallable(n.toLowerCase(),e)}})})}},{key:"createShadowsProperty",value:function(){var t=this,e=this;["shadowBlur","shadowOffsetX","shadowOffsetY","shadowColor"].forEach(function(n){Object.defineProperty(e,n,{get:function(){return e.cp[n]},set:function(e){var i=t;if(i.cp[n]!==e)return i.isWeiXinAPP?(i.cp[n]=e,i._ctx.setShadow(i.cp.shadowOffsetX||0,i.cp.shadowOffsetY||0,i.cp.shadowBlur||0,i.cp.shadowColor||"#000000")):a.is.Null(e)||a.is.Undefined(e)||(i._ctx[n]=e,i.cp[n]=e),e}})})}},{key:"createTextProperty",value:function(){var t=this;["textAlign","textBaseline"].forEach(function(e){Object.defineProperty(t,e,{get:function(){return t.cp[e]},set:function(n){return t._wxSetProperty(n,e)}})}),Object.defineProperty(t,"font",{get:function(){return t.cp.font},set:function(e){if(t.isWeiXinAPP){var n=e.match(c);if(n&&t.cp.font!==e){var i=+n[1];t._ctx.setFontSize(i),t.cp.font=e}}else t.cp.font!==e&&(t._ctx.font=e,t.cp.font=e);return t.cp.font}}),Object.defineProperty(t,"fontSize",{get:function(){return parseInt(t.cp.font)},set:function(e){var n=parseInt(e);if(!a.is.NaN(n)){var i=t.isWeiXinAPP?t.cp.font:t._ctx.font;return i=i.replace(c,n+"px"),i===t.cp.font?t.cp.font:(t.isWeiXinAPP?(t._ctx.setFontSize(n),t.cp.font=i):(t._ctx.font=i,t.cp.font=i),t.cp.font)}}})}},{key:"measureText",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.fontSize,n=this;if(n.isWeiXinAPP){if(!t)return 0;var i=t.length,r=t.match(new RegExp(a.REG_HANZI,"g")),o=r?r.length:0,u=i-o;return{width:e*(u+2*o)/2+e/4}}return n._ctx.measureText(t)}},{key:"_calculateYForTextBaseline",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:l,i=this,r=t;if(!i.isWeiXinAPP)return r;var o=i.fontSize,a=i.textBaseline;switch(a){case"top":r=o*n/10+t;break;case"middle":r=o*n/20+t;break;case"alphabetic":}return r}},{key:"_calculateXFortextAlign",value:function(t,e){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:l,this),i=t;if(!n.isWeiXinAPP)return i;
+var r=n.textAlign;switch(r){case"end":i=t-n.measureText(e).width;break;case"center":i=t-n.measureText(e).width/2;break;case"start":}return i}},{key:"fillText",value:function(t,e,n){for(var i=arguments.length,r=Array(i>3?i-3:0),o=3;o3?r-3:0),a=3;a0&&void 0!==arguments[0])||arguments[0];this.isWeiXinAPP&&this._ctx.draw(t)}}]),t}()},{"./helper":25}],30:[function(t,e,n){function i(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0}),n.WxBar=n.WxLiner=n.WxDoughnut=n.WxChart=n.getChartInstances=void 0;var r=t("./charts/wxChart"),o=i(r),a=t("./charts/doughnut"),u=i(a),s=t("./charts/liner"),l=i(s),c=t("./charts/bar"),f=i(c);n.getChartInstances=r.getChartInstances,n.WxChart=o.default,n.WxDoughnut=u.default,n.WxLiner=l.default,n.WxBar=f.default},{"./charts/bar":11,"./charts/doughnut":12,"./charts/liner":13,"./charts/wxChart":14}]},{},[30])(30)});
//# sourceMappingURL=wx-chart.min.js.map
diff --git a/dist/wx-chart.min.js.map b/dist/wx-chart.min.js.map
index a03f744..21d2732 100644
--- a/dist/wx-chart.min.js.map
+++ b/dist/wx-chart.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["/dist/wx-chart.min.js"],"names":["_typeof2","Symbol","iterator","obj","constructor","prototype","f","exports","module","define","amd","g","window","global","self","this","WxChart","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","./lib/bezier","2","getABC","S","B","E","utils","projectionratio","um","C","x","y","abcratio","A","abs","Math","min","max","acos","sqrt","pi","PI","ZERO","z","PolyBezier","Bezier","coords","args","forEach","slice","arguments","coordlen","newargs","point","d","push","higher","len","_3d","points","idx","step","order","dims","dimlen","curve","align","p1","p2","_linear","_t1","_t2","update","fromSVG","svgString","list","match","map","parseFloat","relative","test","v","quadraticFromPoints","p3","abc","cubicFromPoints","d1","dist","d2","selen","lx","ly","bx1","by1","bx2","by2","e1","e2","v1","v2","nc1","nc2","getUtils","valueOf","toString","pointsToString","toSVG","p","last","join","dpoints","c","dpt","j","computedirection","angle","clockwise","derivative","bind","_lut","getLUT","steps","compute","on","error","lut","hits","project","LUT","closest","mdist","mpos","pt","ft","t1","t2","get","mt","ret","b","mt2","dCpts","JSON","parse","stringify","splice","raise","pim","np","k","inflections","normal","__normal3","__normal2","q","r1","r2","q1","q2","m","R","hull","_p","lerp","split","left","right","result","span","subsplit","extrema","mfn","roots","dim","droots","concat","filter","sort","indexOf","values","bbox","getminmax","overlaps","lbbox","tbbox","bboxoverlap","offset","nv","reduced","reduce","scale","simple","a1","a2","n1","n2","segment","pass1","pass2","distanceFn","lli4","copy","ov","rc","outline","d3","d4","linearDistanceFunction","tlen","alen","slen","f1","f2","fcurves","bcurves","graduated","reverse","fs","fe","bs","be","ls","makeline","le","segments","outlineshapes","curveIntersectionThreshold","curves","shapes","shape","makeshape","startcap","virtual","endcap","intersects","lineIntersects","curveintersects","selfintersects","line","mx","my","MX","MY","between","results","c1","c2","pairs","intersections","pair","pairiteration","arcs","errorThreshold","circles","_iterate","_error","pc","np1","ref","safety","np2","np3","arc","prev_arc","done","curr_good","prev_good","prev_e","getccenter","interval","start","end","./poly-bezier.js","./utils.js","3","addCurve","expandbox","4","cos","sin","atan2","pow","crt","tau","quart","epsilon","nMax","Number","MAX_SAFE_INTEGER","nMin","MIN_SAFE_INTEGER","Tvalues","Cvalues","arcfn","derivativeFn","M","approximately","precision","sum","ds","de","ts","te","pointToString","dx1","dy1","dx2","dy2","cross","dot","round","pos","substring","dx","dy","bottom","top","lli8","x1","y1","x2","y2","x3","y3","x4","y4","nx","ny","p4","lli","findbbox","sections","mid","size","shapeintersections","s1","bbox1","s2","bbox2","forward","back","l1","l2","iss","bpl","fpl","tx","ty","m1","m2","u1","pa","pb","pd","discriminant","mp3","mp33","cosphi","phi","crtr","sd","v3","trm","sq","b1","b2","_bbox","c1b","c2b","threshold","cc1","cc2","_","dx1p","dy1p","dx2p","dy2p","mx1","my1","mx2","my2","mx1n","my1n","mx2n","my2n","./bezier","5","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","Mixins","value","mixins","context","options","opt","warn","mergeDuplicates","contextMethods","getOwnPropertyNames","reactMethods","undefined","Array","mixin","grabMethods","mm","currentMixin","cm","orig","newMethod","_this","mixinMethods","method","checkForMatch","_this2","ctxMethod","extendMethod","console","name","addNewMethod","mix","init","6","Ez","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","7","create","off","emit","8","process","getNanoSeconds","hrtime","loadTime","moduleLoadTime","nodeLoadTime","upTime","performance","now","hr","uptime","Date","getTime","_process","9","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","setTimeout","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","queue","queueIndex","drainQueue","timeout","run","Item","array","noop","nextTick","apply","title","browser","env","argv","version","versions","addListener","once","removeListener","removeAllListeners","binding","cwd","chdir","dir","umask","10","_interopRequireDefault","__esModule","default","_toConsumableArray","arr","isArray","arr2","from","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","setPrototypeOf","__proto__","_get","object","property","receiver","Function","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","_es6Mixins","_es6Mixins2","_helper","_tinycolor","_tinycolor2","_randomColor","_randomColor2","_wxCanvas","_wxChart","_wxChart2","_title","_title2","_scale","_scale3","_scale4","_scale5","_scale6","_scale7","_scale8","_scale9","_scale10","_legend","_legend2","_layout","_layout2","_animation","_animation2","WX_BAR_LEGEND_DEFAULT_CONFIG","borderWidth","fillArea","fillAlpha","display","barPercentage","WX_BAR_DEFAULT_CONFIG","minBetweenPixel","pointPercentage","stacked","zeroLine","xScaleOptions","position","xScaleItemOptions","yScaleOptions","yScaleItemOptions","crossScaleOptions","xMargin","xBox","yBox","area","xScale","yScale","xScaleDatasets","calculateTickWidth","xFirstPointSpace","legends","legendOptions","color","hue","luminosity","defaultKey","animate","animateOptions","duration","WX_BAR_ITEM_DEFAULT_CONFIG","WxBar","_WxChart","id","config","__drawBar","percent","legend","hasNeg","ctx","fillStyle","strokeStyle","px","py","width","height","barWidth","barHeight","save","lineWidth","beginPath","globalAlpha","rect","fill","moveTo","lineTo","stroke","draw","restore","me","chartConfig","extend","is","PureObject","titleText","String","text","yAxis","xAxis","wxCrossScale","wxLayout","wxAnimation","legendsConfig","labels","label","datasets","_labels","_legends","removeAllBox","reset","box","_me$chartConfig","adjustBox","addBox","rColors","count","index","borderColor","darken","_drawScale","barRuler","calculateBarRuler","barConfigs","legendIndex","dataset","visDatasets","data","calculateBarRect","bar","drawBar","animation","_darwZeroLine","baseY","getPoint","ex","barData","backgroundColor","animateOpt","dataLen","categoryTicks","lastData","toNext","dataIndex","floor","_ref","lastDataIndex","lastPercent","lastx","lasty","lastWidth","lastHeight","fillRect","_ref2","lastPoint","_me$__drawBar","actionAnimation","_getAnimationDrawBar","pushActions","_drawBar","globalBarWidth","globalBarPercentage","legendLen","tickWidth","pointWidth","pointIntervalWidth","totalStandardPercentage","_standardPercentage","standardPercentage","barIntervalWidth","legendOpt","frontBarWidth","acc","cur","Null","Undefined","xPoint","yPoint","xPointInstance","_getStackPoint","__sumNeg","__sumPos","xDatasets","xScaleAxisDatas","yDatasets","yScaleAxisDatas","_me$wxCrossScale$draw","tickLimits","calculateTickLimit","_me$stackYScaleAxisLi","stackYScaleAxisLimit","buildDatasets","_visDatasets$reduce","pre","curValue","_max","_min","xScaleConfig","item","tmp","_getLegendConfig","set","../core/animation","../core/layout","../core/legend","../core/scale","../core/title","../scale/scale.category","../scale/scale.crosshelp","../scale/scale.liner","../scale/scale.stackhelp","../util/helper","../util/randomColor","../util/tinycolor","../util/wxCanvas","./wxChart","es6-mixins","11","WX_DOUGHNUT_DEFAULT_CONFIG","cutoutPercentage","rotation","padding","labelDistancePercentage","WX_DOUGHNUT_ITEM_DEFAULT_CONFIG","fontSize","percentage","WxDoughnut","rBorderColor","legendDatasets","hidden","_box","outerWidth","outerHeight","minSize","outerRadius","totalValue","calculateTotal","longestLabelWidth","_longestLabel","maximalFontSize","_maximalLabelFontSize","shouldSpace","widthSpace","innerRadius","pointX","pointY","totalAngle","drawDoughnut","startAngle","endAngle","currentRadius","closePath","lineJoin","format","centerAngle","startX","startY","offsetRadius","turnRadius","turnX","turnY","adjustPoint","avoidCollision","textLen","measureText","endX","endY","textX","textY","fillText","_getAnimationDrawDoughnut","_drawDoughnut","aniTotal","lastt","currTotalAngle","drawAngle","drawData","initAvoidCollision","drawLabel","maxLabelWidth","_lastPoint","newPoint","centerPoint","avoidUnit","cpx","lpx","lpy","npx","npy","12","WX_LINE_LEGEND_DEFAULT_CONFIG","spanGaps","tension","WX_LINER_DEFAULT_CONFIG","discardNeg","WX_LINER_ITEM_DEFAULT_CONFIG","pointRadius","pointStyle","pointBorderWidth","pointBorderColor","WxLiner","_initialiseProps","lineConfigs","yAxisPoint","xAxisPoint","_me$_getStackValue","_getStackValue","sumPos","curr","drawLine","lineData","preData","total","xAxisY","firstPoint","currPoint","_lineToPoint","_getNextPoint","__fillInHere","prePoint","pointStack","_getAnimationDrawLine","_drawLine","_this3","_animateLineTick","ln","sp","bp","_getCurr","_getNext","nextDate","next","_getPre","preDate","_getPrePoint","controlPoints","splineCurve","bezierCurveTo","previous","_animateLineToPoint","pert","curt","p0","bz","sbz","startPoint","endPoint","totalPath","cosAngle","sinAngle","drawCurrPoint","pret","ppPoint","diffIndex","_pre$data","bezier-js","13","getChartInstances","wxChartInstances","_wxCanvas2","_mitt","_mitt2","wxChartDefaultConfig","chartConf","canvas","getContext","isWeiXinAPP","checkWX","_id","uid","_config","initConfig","initContext","cvWidth","cvHeight","aspectRatio","toFixed","retinaScale","innerBox","BoxInstance","clearRect","clear","releaseContext","defaultItemOpt","_datasets","_visDatasets","NaN","val","mitt","14","_interopRequireWildcard","newObj","hasOwnProperty","wxAnimationActLinker","actions","action","_arguments","_len","_key","WxAnimation","_tweezer","_tweezer2","_ez","ez","currentActionIndex","handOverAction","stop","tweenzerHandler","started","resetActions","easeFun","easeType","easing","mit","preRet","caindex","nextAction","parallel","tickRet","actionsLen","rets","runTickParallel","runTick","tick","begin","../util/tweezer","ez.js","15","WxBaseComponent","wxChart","defaultOptions","calculateBox","isVisiable","redraw","../charts/wxChart","./layout","16","_base","_base2","margin","boxInstance","ey","rx","ry","marginLR","marginTB","WxLayout","_boxs","parseInt","boxId","clone","./base","17","_typeof","WX_LEGEND_DEFAULT_CONFIG","fullWidth","boxWidth","WX_LEGEND_DEFAULT_ITEM_CONFIG","WxLegend","_WxBaseComponent","calculateLegendItem","labelsConfig","textWidth","_prop","boxHeight","isHorizontal","lineNum","currentLineWidth","maxLineWidth","prop","_ret2","wh","currentLineNum","currentX","currentY","lineCap","_dataset$_prop","textBaseline","textAlign","thisX","strokeRect","18","WX_SCALE_DEFAULT_CONFIG","extendLeft","extendTop","titleFontSize","titleFontColor","gridLines","ticks","autoSkip","fontColor","minRotation","maxRotation","WX_SCALE_DEFAULT_ITEM_CONFIG","WxScale","maxTextLen","getTicksText","fixPadding","visTicks","firstTickText","lastTickText","calculateFixPadding","minWidth","minHeight","maxWidth","maxHeight","minFontRotation","toRadians","maxFontRotation","fontRadians","lineSpace","longestText","titleWidth","ticketWidth","defaultLineWidth","totalLineWidth","innerWidth","calculateTitleWidth","innerHeight","titleHeight","baseX","_getTicksLineWidthOffset","sx","sy","_initDrawATickText","translate","rotate","tickConfig","_me$getTicksPosition","getTicksPosition","currX","currY","_drawATickLine","_lineSpace","19","WX_TITLE_DEFAULT_CONFIG","WxTitle","20","_scale2","WxCategoryScale","_WxScale","maxIndex","minIndex","buildTicks","21","WX_CROSSSCALE_CONFIG","WxCrossScale","yScaleDatasets","_me$config","yMHeight","xMWidth","xOffset","xExtendLeft","xAxisXPoint","calXbox","setBox","22","WxLinerScale","maxTicks","stepSize","spacing","niceRange","niceNum","niceMin","niceMax","ceil","numSpaces","almostEquals","scaleOptions","tickOpts","maxTicksLimit","startVal","endVal","range","realWidth","realHeight","23","WxStackMixin","sumNeg","stackedVal","offsetValue","24","_assignGenerator","own","_copy","deep","source","Boolean","shift","sc","_target","so","to","wx","wxConverToPx","windowSize","getWindowSize","rpxReg","windowWidth","remReg","degrees","toDegrees","radians","windowHeight","getSystemInfoSync","getDPR","pixelRatio","devicePixelRatio","exponent","log10","fraction","niceFraction","middlePoint","afterPoint","current","d01","d12","s01","s12","isNaN","fa","fb","getStyle","element","currentStyle","document","defaultView","getComputedStyle","getPropertyValue","readUsedSize","matches","style","ObjProto","type","class2type","hasOwn","fnToString","ObjectFunctionString","proto","Ctor","REG_HANZI","REG_ALPHABET","REG_NUMBER","REG_ALPHABET_NUMBER","extendOwn","25","root","isWx","vendors","suffix","raf","caf","frameDuration","callback","_now","cp","_i","cancelled","handle","_i2","fn","_root","cancel","polyfill","requestAnimationFrame","cancelAnimationFrame","performance-now","26","pickHue","hueRange","getHueRange","randomWithin","pickSaturation","saturationRange","getSaturationRange","sMin","sMax","pickBrightness","H","bMin","getMinimumBrightness","bMax","setFormat","hsv","HSVtoHSL","hsl","hslColor","alpha","random","HSVtoRGB","rgb","rgbColor","HSVtoHex","lowerBounds","getColorInfo","colorInput","number","colorDictionary","colorName","seed","rnd","componentToHex","hex","defineColor","brightnessRange","loadColorBounds","h","h_i","stringToInteger","string","charCodeAt","randomColor","totalColors","colors","27","tinycolor","opts","inputToRGB","_originalInput","_r","_g","_b","_a","_roundA","mathRound","_format","_gradientType","gradientType","_ok","ok","_tc_id","tinyCounter","stringInputToObject","isValidCSSUnit","rgbToRgb","substr","convertToPercentage","hsvToRgb","hslToRgb","boundAlpha","mathMin","mathMax","bound01","rgbToHsl","hue2rgb","rgbToHsv","mod","rgbToHex","allow3Char","pad2","charAt","rgbaToHex","allow4Char","convertDecimalToHex","rgbaToArgbHex","_desaturate","amount","toHsl","clamp01","_saturate","_greyscale","desaturate","_lighten","_brighten","toRgb","_darken","_spin","_complement","_triad","_tetrad","_splitcomplement","_analogous","slices","part","_monochromatic","toHsv","modification","flip","flipped","isOnePointZero","processPercent","isPercentage","parseIntFromHex","convertHexToDecimal","matchers","CSS_UNIT","exec","replace","trimLeft","trimRight","toLowerCase","named","names","rgba","hsla","hsva","hex8","hex6","hex4","hex3","validateWCAG2Parms","parms","level","toUpperCase","mathRandom","isDark","getBrightness","isLight","isValid","getOriginalInput","getFormat","getAlpha","getLuminance","RsRGB","GsRGB","BsRGB","G","setAlpha","toHsvString","toHslString","toHex","toHexString","toHex8","toHex8String","toRgbString","toPercentageRgb","toPercentageRgbString","toName","hexNames","toFilter","secondColor","hex8String","secondHex8String","formatSet","formattedString","hasAlpha","needsAlphaFormat","_applyModification","lighten","brighten","saturate","greyscale","spin","_applyCombination","analogous","complement","monochromatic","splitcomplement","triad","tetrad","fromRatio","newColor","equals","color1","color2","rgb1","rgb2","readability","isReadable","wcag2","wcag2Parms","out","mostReadable","baseColor","colorList","includeFallbackColors","bestColor","bestScore","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","burntsienna","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","CSS_INTEGER","CSS_NUMBER","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","RegExp","28","Tweezer","ease","_defaultEase","frame","isRunning","events","direction","_tick","timeStart","handler","query","findIndex","currentTime","lastTick","timeElapsed","_shouldTick","up","down","./raf","29","WxCanvasRenderingContext2D","WX_CANVAS_DEFAULT_PROPERTY","WX_CANVAS_CTX_DEFAULT_PROPERTY","miterLimit","shadowBlur","shadowOffsetX","shadowOffsetY","shadowColor","font","WX_BASE_TEXT_SIZE","pxReg","WxCanvas","contextOptions","_acquireContext","acquireContext","_canvas","_ctx","wxCanvasRenderingContext2D","handlerCanvas","createCanvasContext","getElementById","HTMLCanvasElement","initCanvas","renderHeight","renderWidth","getAttribute","displayWidth","displayHeight","initial","removeAttribute","setAttribute","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","keys","err","return","str","_ctxOptions","_propertyCache","createStyleProperty","createShadowsProperty","createTextProperty","createLineProperty","createRectProperty","createGradientProperty","createPathProperty","createTransformationProperty","createGlobalAlphaProperty","nProperty","pop","propertyName","wxSetName","setWX","styleProperty","_wxSetPropertyCallable","setShadow","_wxSetProperty","setFontSize","currentFont","hanzi","hanziNum","otherNum","baseNum","culY","culX","_calculateYForTextBaseline","_calculateXFortextAlign","_len2","_key2","_me$_ctx","strokeText","smProperty","functionName","_me$_ctx2","_me$_ctx3","x0","y0","r0","createCircularGradient","createRadialGradient","_me$_ctx4","_me$_ctx5","_me$_ctx6","clip","_me$_ctx7","_me$_ctx8","transform","ctu","./helper","30","_doughnut","_doughnut2","_liner","_liner2","_bar","_bar2","./charts/bar","./charts/doughnut","./charts/liner","./charts/wxChart"],"mappings":"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","file":"wx-chart.min.js","sourcesContent":["\"use strict\";\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (f) {\n if ((typeof exports === \"undefined\" ? \"undefined\" : _typeof2(exports)) === \"object\" && typeof module !== \"undefined\") {\n module.exports = f();\n } else if (typeof define === \"function\" && define.amd) {\n define([], f);\n } else {\n var g;if (typeof window !== \"undefined\") {\n g = window;\n } else if (typeof global !== \"undefined\") {\n g = global;\n } else if (typeof self !== \"undefined\") {\n g = self;\n } else {\n g = this;\n }g.WxChart = f();\n }\n})(function () {\n var define, module, exports;return function e(t, n, r) {\n function s(o, u) {\n if (!n[o]) {\n if (!t[o]) {\n var a = typeof require == \"function\" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);var f = new Error(\"Cannot find module '\" + o + \"'\");throw f.code = \"MODULE_NOT_FOUND\", f;\n }var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) {\n var n = t[o][1][e];return s(n ? n : e);\n }, l, l.exports, e, t, n, r);\n }return n[o].exports;\n }var i = typeof require == \"function\" && require;for (var o = 0; o < r.length; o++) {\n s(r[o]);\n }return s;\n }({ 1: [function (require, module, exports) {\n module.exports = require('./lib/bezier');\n }, { \"./lib/bezier\": 2 }], 2: [function (require, module, exports) {\n /**\n A javascript Bezier curve library by Pomax.\n \n Based on http://pomax.github.io/bezierinfo\n \n This code is MIT licensed.\n **/\n (function () {\n \"use strict\";\n\n // math-inlining.\n\n var abs = Math.abs,\n min = Math.min,\n max = Math.max,\n acos = Math.acos,\n sqrt = Math.sqrt,\n pi = Math.PI,\n\n // a zero coordinate, which is surprisingly useful\n ZERO = { x: 0, y: 0, z: 0 };\n\n // quite needed\n var utils = require('./utils.js');\n\n // not quite needed, but eventually this'll be useful...\n var PolyBezier = require('./poly-bezier.js');\n\n /**\n * Bezier curve constructor. The constructor argument can be one of three things:\n *\n * 1. array/4 of {x:..., y:..., z:...}, z optional\n * 2. numerical array/8 ordered x1,y1,x2,y2,x3,y3,x4,y4\n * 3. numerical array/12 ordered x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4\n *\n */\n var Bezier = function Bezier(coords) {\n var args = coords && coords.forEach ? coords : [].slice.call(arguments);\n var coordlen = false;\n if (_typeof2(args[0]) === \"object\") {\n coordlen = args.length;\n var newargs = [];\n args.forEach(function (point) {\n ['x', 'y', 'z'].forEach(function (d) {\n if (typeof point[d] !== \"undefined\") {\n newargs.push(point[d]);\n }\n });\n });\n args = newargs;\n }\n var higher = false;\n var len = args.length;\n if (coordlen) {\n if (coordlen > 4) {\n if (arguments.length !== 1) {\n throw new Error(\"Only new Bezier(point[]) is accepted for 4th and higher order curves\");\n }\n higher = true;\n }\n } else {\n if (len !== 6 && len !== 8 && len !== 9 && len !== 12) {\n if (arguments.length !== 1) {\n throw new Error(\"Only new Bezier(point[]) is accepted for 4th and higher order curves\");\n }\n }\n }\n var _3d = !higher && (len === 9 || len === 12) || coords && coords[0] && typeof coords[0].z !== \"undefined\";\n this._3d = _3d;\n var points = [];\n for (var idx = 0, step = _3d ? 3 : 2; idx < len; idx += step) {\n var point = {\n x: args[idx],\n y: args[idx + 1]\n };\n if (_3d) {\n point.z = args[idx + 2];\n };\n points.push(point);\n }\n this.order = points.length - 1;\n this.points = points;\n var dims = ['x', 'y'];\n if (_3d) dims.push('z');\n this.dims = dims;\n this.dimlen = dims.length;\n\n (function (curve) {\n var order = curve.order;\n var points = curve.points;\n var a = utils.align(points, { p1: points[0], p2: points[order] });\n for (var i = 0; i < a.length; i++) {\n if (abs(a[i].y) > 0.0001) {\n curve._linear = false;\n return;\n }\n }\n curve._linear = true;\n })(this);\n\n this._t1 = 0;\n this._t2 = 1;\n this.update();\n };\n\n Bezier.fromSVG = function (svgString) {\n var list = svgString.match(/[-+]?\\d*\\.?\\d+(?:[eE][-+]?\\d+)?/g).map(parseFloat);\n var relative = /[cq]/.test(svgString);\n if (!relative) return new Bezier(list);\n list = list.map(function (v, i) {\n return i < 2 ? v : v + list[i % 2];\n });\n return new Bezier(list);\n };\n\n function getABC(n, S, B, E, t) {\n if (typeof t === \"undefined\") {\n t = 0.5;\n }\n var u = utils.projectionratio(t, n),\n um = 1 - u,\n C = {\n x: u * S.x + um * E.x,\n y: u * S.y + um * E.y\n },\n s = utils.abcratio(t, n),\n A = {\n x: B.x + (B.x - C.x) / s,\n y: B.y + (B.y - C.y) / s\n };\n return { A: A, B: B, C: C };\n }\n\n Bezier.quadraticFromPoints = function (p1, p2, p3, t) {\n if (typeof t === \"undefined\") {\n t = 0.5;\n }\n // shortcuts, although they're really dumb\n if (t === 0) {\n return new Bezier(p2, p2, p3);\n }\n if (t === 1) {\n return new Bezier(p1, p2, p2);\n }\n // real fitting.\n var abc = getABC(2, p1, p2, p3, t);\n return new Bezier(p1, abc.A, p3);\n };\n\n Bezier.cubicFromPoints = function (S, B, E, t, d1) {\n if (typeof t === \"undefined\") {\n t = 0.5;\n }\n var abc = getABC(3, S, B, E, t);\n if (typeof d1 === \"undefined\") {\n d1 = utils.dist(B, abc.C);\n }\n var d2 = d1 * (1 - t) / t;\n\n var selen = utils.dist(S, E),\n lx = (E.x - S.x) / selen,\n ly = (E.y - S.y) / selen,\n bx1 = d1 * lx,\n by1 = d1 * ly,\n bx2 = d2 * lx,\n by2 = d2 * ly;\n // derivation of new hull coordinates\n var e1 = { x: B.x - bx1, y: B.y - by1 },\n e2 = { x: B.x + bx2, y: B.y + by2 },\n A = abc.A,\n v1 = { x: A.x + (e1.x - A.x) / (1 - t), y: A.y + (e1.y - A.y) / (1 - t) },\n v2 = { x: A.x + (e2.x - A.x) / t, y: A.y + (e2.y - A.y) / t },\n nc1 = { x: S.x + (v1.x - S.x) / t, y: S.y + (v1.y - S.y) / t },\n nc2 = { x: E.x + (v2.x - E.x) / (1 - t), y: E.y + (v2.y - E.y) / (1 - t) };\n // ...done\n return new Bezier(S, nc1, nc2, E);\n };\n\n var getUtils = function getUtils() {\n return utils;\n };\n\n Bezier.getUtils = getUtils;\n\n Bezier.prototype = {\n getUtils: getUtils,\n valueOf: function valueOf() {\n return this.toString();\n },\n toString: function toString() {\n return utils.pointsToString(this.points);\n },\n toSVG: function toSVG(relative) {\n if (this._3d) return false;\n var p = this.points,\n x = p[0].x,\n y = p[0].y,\n s = [\"M\", x, y, this.order === 2 ? \"Q\" : \"C\"];\n for (var i = 1, last = p.length; i < last; i++) {\n s.push(p[i].x);\n s.push(p[i].y);\n }\n return s.join(\" \");\n },\n update: function update() {\n // one-time compute derivative coordinates\n this.dpoints = [];\n for (var p = this.points, d = p.length, c = d - 1; d > 1; d--, c--) {\n var list = [];\n for (var j = 0, dpt; j < c; j++) {\n dpt = {\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y)\n };\n if (this._3d) {\n dpt.z = c * (p[j + 1].z - p[j].z);\n }\n list.push(dpt);\n }\n this.dpoints.push(list);\n p = list;\n };\n this.computedirection();\n },\n computedirection: function computedirection() {\n var points = this.points;\n var angle = utils.angle(points[0], points[this.order], points[1]);\n this.clockwise = angle > 0;\n },\n length: function length() {\n return utils.length(this.derivative.bind(this));\n },\n _lut: [],\n getLUT: function getLUT(steps) {\n steps = steps || 100;\n if (this._lut.length === steps) {\n return this._lut;\n }\n this._lut = [];\n for (var t = 0; t <= steps; t++) {\n this._lut.push(this.compute(t / steps));\n }\n return this._lut;\n },\n on: function on(point, error) {\n error = error || 5;\n var lut = this.getLUT(),\n hits = [],\n c,\n t = 0;\n for (var i = 0; i < lut.length; i++) {\n c = lut[i];\n if (utils.dist(c, point) < error) {\n hits.push(c);\n t += i / lut.length;\n }\n }\n if (!hits.length) return false;\n return t /= hits.length;\n },\n project: function project(point) {\n // step 1: coarse check\n var LUT = this.getLUT(),\n l = LUT.length - 1,\n closest = utils.closest(LUT, point),\n mdist = closest.mdist,\n mpos = closest.mpos;\n if (mpos === 0 || mpos === l) {\n var t = mpos / l,\n pt = this.compute(t);\n pt.t = t;\n pt.d = mdist;\n return pt;\n }\n\n // step 2: fine check\n var ft,\n t,\n p,\n d,\n t1 = (mpos - 1) / l,\n t2 = (mpos + 1) / l,\n step = 0.1 / l;\n mdist += 1;\n for (t = t1, ft = t; t < t2 + step; t += step) {\n p = this.compute(t);\n d = utils.dist(point, p);\n if (d < mdist) {\n mdist = d;\n ft = t;\n }\n }\n p = this.compute(ft);\n p.t = ft;\n p.d = mdist;\n return p;\n },\n get: function get(t) {\n return this.compute(t);\n },\n point: function point(idx) {\n return this.points[idx];\n },\n compute: function compute(t) {\n // shortcuts\n if (t === 0) {\n return this.points[0];\n }\n if (t === 1) {\n return this.points[this.order];\n }\n\n var p = this.points;\n var mt = 1 - t;\n\n // linear?\n if (this.order === 1) {\n ret = {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y\n };\n if (this._3d) {\n ret.z = mt * p[0].z + t * p[1].z;\n }\n return ret;\n }\n\n // quadratic/cubic curve?\n if (this.order < 4) {\n var mt2 = mt * mt,\n t2 = t * t,\n a,\n b,\n c,\n d = 0;\n if (this.order === 2) {\n p = [p[0], p[1], p[2], ZERO];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (this.order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n var ret = {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y\n };\n if (this._3d) {\n ret.z = a * p[0].z + b * p[1].z + c * p[2].z + d * p[3].z;\n }\n return ret;\n }\n\n // higher order curves: use de Casteljau's computation\n var dCpts = JSON.parse(JSON.stringify(this.points));\n while (dCpts.length > 1) {\n for (var i = 0; i < dCpts.length - 1; i++) {\n dCpts[i] = {\n x: dCpts[i].x + (dCpts[i + 1].x - dCpts[i].x) * t,\n y: dCpts[i].y + (dCpts[i + 1].y - dCpts[i].y) * t\n };\n if (typeof dCpts[i].z !== \"undefined\") {\n dCpts[i] = dCpts[i].z + (dCpts[i + 1].z - dCpts[i].z) * t;\n }\n }\n dCpts.splice(dCpts.length - 1, 1);\n }\n return dCpts[0];\n },\n raise: function raise() {\n var p = this.points,\n np = [p[0]],\n i,\n k = p.length,\n pi,\n pim;\n for (var i = 1; i < k; i++) {\n pi = p[i];\n pim = p[i - 1];\n np[i] = {\n x: (k - i) / k * pi.x + i / k * pim.x,\n y: (k - i) / k * pi.y + i / k * pim.y\n };\n }\n np[k] = p[k - 1];\n return new Bezier(np);\n },\n derivative: function derivative(t) {\n var mt = 1 - t,\n a,\n b,\n c = 0,\n p = this.dpoints[0];\n if (this.order === 2) {\n p = [p[0], p[1], ZERO];a = mt;b = t;\n }\n if (this.order === 3) {\n a = mt * mt;b = mt * t * 2;c = t * t;\n }\n var ret = {\n x: a * p[0].x + b * p[1].x + c * p[2].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y\n };\n if (this._3d) {\n ret.z = a * p[0].z + b * p[1].z + c * p[2].z;\n }\n return ret;\n },\n inflections: function inflections() {\n return utils.inflections(this.points);\n },\n normal: function normal(t) {\n return this._3d ? this.__normal3(t) : this.__normal2(t);\n },\n __normal2: function __normal2(t) {\n var d = this.derivative(t);\n var q = sqrt(d.x * d.x + d.y * d.y);\n return { x: -d.y / q, y: d.x / q };\n },\n __normal3: function __normal3(t) {\n // see http://stackoverflow.com/questions/25453159\n var r1 = this.derivative(t),\n r2 = this.derivative(t + 0.01),\n q1 = sqrt(r1.x * r1.x + r1.y * r1.y + r1.z * r1.z),\n q2 = sqrt(r2.x * r2.x + r2.y * r2.y + r2.z * r2.z);\n r1.x /= q1;r1.y /= q1;r1.z /= q1;\n r2.x /= q2;r2.y /= q2;r2.z /= q2;\n // cross product\n var c = {\n x: r2.y * r1.z - r2.z * r1.y,\n y: r2.z * r1.x - r2.x * r1.z,\n z: r2.x * r1.y - r2.y * r1.x\n };\n var m = sqrt(c.x * c.x + c.y * c.y + c.z * c.z);\n c.x /= m;c.y /= m;c.z /= m;\n // rotation matrix\n var R = [c.x * c.x, c.x * c.y - c.z, c.x * c.z + c.y, c.x * c.y + c.z, c.y * c.y, c.y * c.z - c.x, c.x * c.z - c.y, c.y * c.z + c.x, c.z * c.z];\n // normal vector:\n var n = {\n x: R[0] * r1.x + R[1] * r1.y + R[2] * r1.z,\n y: R[3] * r1.x + R[4] * r1.y + R[5] * r1.z,\n z: R[6] * r1.x + R[7] * r1.y + R[8] * r1.z\n };\n return n;\n },\n hull: function hull(t) {\n var p = this.points,\n _p = [],\n pt,\n q = [],\n idx = 0,\n i = 0,\n l = 0;\n q[idx++] = p[0];\n q[idx++] = p[1];\n q[idx++] = p[2];\n if (this.order === 3) {\n q[idx++] = p[3];\n }\n // we lerp between all points at each iteration, until we have 1 point left.\n while (p.length > 1) {\n _p = [];\n for (i = 0, l = p.length - 1; i < l; i++) {\n pt = utils.lerp(t, p[i], p[i + 1]);\n q[idx++] = pt;\n _p.push(pt);\n }\n p = _p;\n }\n return q;\n },\n split: function split(t1, t2) {\n // shortcuts\n if (t1 === 0 && !!t2) {\n return this.split(t2).left;\n }\n if (t2 === 1) {\n return this.split(t1).right;\n }\n\n // no shortcut: use \"de Casteljau\" iteration.\n var q = this.hull(t1);\n var result = {\n left: this.order === 2 ? new Bezier([q[0], q[3], q[5]]) : new Bezier([q[0], q[4], q[7], q[9]]),\n right: this.order === 2 ? new Bezier([q[5], q[4], q[2]]) : new Bezier([q[9], q[8], q[6], q[3]]),\n span: q\n };\n\n // make sure we bind _t1/_t2 information!\n result.left._t1 = utils.map(0, 0, 1, this._t1, this._t2);\n result.left._t2 = utils.map(t1, 0, 1, this._t1, this._t2);\n result.right._t1 = utils.map(t1, 0, 1, this._t1, this._t2);\n result.right._t2 = utils.map(1, 0, 1, this._t1, this._t2);\n\n // if we have no t2, we're done\n if (!t2) {\n return result;\n }\n\n // if we have a t2, split again:\n t2 = utils.map(t2, t1, 1, 0, 1);\n var subsplit = result.right.split(t2);\n return subsplit.left;\n },\n extrema: function extrema() {\n var dims = this.dims,\n result = {},\n roots = [],\n p,\n mfn;\n dims.forEach(function (dim) {\n mfn = function mfn(v) {\n return v[dim];\n };\n p = this.dpoints[0].map(mfn);\n result[dim] = utils.droots(p);\n if (this.order === 3) {\n p = this.dpoints[1].map(mfn);\n result[dim] = result[dim].concat(utils.droots(p));\n }\n result[dim] = result[dim].filter(function (t) {\n return t >= 0 && t <= 1;\n });\n roots = roots.concat(result[dim].sort());\n }.bind(this));\n roots = roots.sort().filter(function (v, idx) {\n return roots.indexOf(v) === idx;\n });\n result.values = roots;\n return result;\n },\n bbox: function bbox() {\n var extrema = this.extrema(),\n result = {};\n this.dims.forEach(function (d) {\n result[d] = utils.getminmax(this, d, extrema[d]);\n }.bind(this));\n return result;\n },\n overlaps: function overlaps(curve) {\n var lbbox = this.bbox(),\n tbbox = curve.bbox();\n return utils.bboxoverlap(lbbox, tbbox);\n },\n offset: function offset(t, d) {\n if (typeof d !== \"undefined\") {\n var c = this.get(t);\n var n = this.normal(t);\n var ret = {\n c: c,\n n: n,\n x: c.x + n.x * d,\n y: c.y + n.y * d\n };\n if (this._3d) {\n ret.z = c.z + n.z * d;\n };\n return ret;\n }\n if (this._linear) {\n var nv = this.normal(0);\n var coords = this.points.map(function (p) {\n var ret = {\n x: p.x + t * nv.x,\n y: p.y + t * nv.y\n };\n if (p.z && n.z) {\n ret.z = p.z + t * nv.z;\n }\n return ret;\n });\n return [new Bezier(coords)];\n }\n var reduced = this.reduce();\n return reduced.map(function (s) {\n return s.scale(t);\n });\n },\n simple: function simple() {\n if (this.order === 3) {\n var a1 = utils.angle(this.points[0], this.points[3], this.points[1]);\n var a2 = utils.angle(this.points[0], this.points[3], this.points[2]);\n if (a1 > 0 && a2 < 0 || a1 < 0 && a2 > 0) return false;\n }\n var n1 = this.normal(0);\n var n2 = this.normal(1);\n var s = n1.x * n2.x + n1.y * n2.y;\n if (this._3d) {\n s += n1.z * n2.z;\n }\n var angle = abs(acos(s));\n return angle < pi / 3;\n },\n reduce: function reduce() {\n var i,\n t1 = 0,\n t2 = 0,\n step = 0.01,\n segment,\n pass1 = [],\n pass2 = [];\n // first pass: split on extrema\n var extrema = this.extrema().values;\n if (extrema.indexOf(0) === -1) {\n extrema = [0].concat(extrema);\n }\n if (extrema.indexOf(1) === -1) {\n extrema.push(1);\n }\n\n for (t1 = extrema[0], i = 1; i < extrema.length; i++) {\n t2 = extrema[i];\n segment = this.split(t1, t2);\n segment._t1 = t1;\n segment._t2 = t2;\n pass1.push(segment);\n t1 = t2;\n }\n\n // second pass: further reduce these segments to simple segments\n pass1.forEach(function (p1) {\n t1 = 0;\n t2 = 0;\n while (t2 <= 1) {\n for (t2 = t1 + step; t2 <= 1 + step; t2 += step) {\n segment = p1.split(t1, t2);\n if (!segment.simple()) {\n t2 -= step;\n if (abs(t1 - t2) < step) {\n // we can never form a reduction\n return [];\n }\n segment = p1.split(t1, t2);\n segment._t1 = utils.map(t1, 0, 1, p1._t1, p1._t2);\n segment._t2 = utils.map(t2, 0, 1, p1._t1, p1._t2);\n pass2.push(segment);\n t1 = t2;\n break;\n }\n }\n }\n if (t1 < 1) {\n segment = p1.split(t1, 1);\n segment._t1 = utils.map(t1, 0, 1, p1._t1, p1._t2);\n segment._t2 = p1._t2;\n pass2.push(segment);\n }\n });\n return pass2;\n },\n scale: function scale(d) {\n var order = this.order;\n var distanceFn = false;\n if (typeof d === \"function\") {\n distanceFn = d;\n }\n if (distanceFn && order === 2) {\n return this.raise().scale(distanceFn);\n }\n\n // TODO: add special handling for degenerate (=linear) curves.\n var clockwise = this.clockwise;\n var r1 = distanceFn ? distanceFn(0) : d;\n var r2 = distanceFn ? distanceFn(1) : d;\n var v = [this.offset(0, 10), this.offset(1, 10)];\n var o = utils.lli4(v[0], v[0].c, v[1], v[1].c);\n if (!o) {\n throw new Error(\"cannot scale this curve. Try reducing it first.\");\n }\n // move all points by distance 'd' wrt the origin 'o'\n var points = this.points,\n np = [];\n\n // move end points by fixed distance along normal.\n [0, 1].forEach(function (t) {\n var p = np[t * order] = utils.copy(points[t * order]);\n p.x += (t ? r2 : r1) * v[t].n.x;\n p.y += (t ? r2 : r1) * v[t].n.y;\n }.bind(this));\n\n if (!distanceFn) {\n // move control points to lie on the intersection of the offset\n // derivative vector, and the origin-through-control vector\n [0, 1].forEach(function (t) {\n if (this.order === 2 && !!t) return;\n var p = np[t * order];\n var d = this.derivative(t);\n var p2 = { x: p.x + d.x, y: p.y + d.y };\n np[t + 1] = utils.lli4(p, p2, o, points[t + 1]);\n }.bind(this));\n return new Bezier(np);\n }\n\n // move control points by \"however much necessary to\n // ensure the correct tangent to endpoint\".\n [0, 1].forEach(function (t) {\n if (this.order === 2 && !!t) return;\n var p = points[t + 1];\n var ov = {\n x: p.x - o.x,\n y: p.y - o.y\n };\n var rc = distanceFn ? distanceFn((t + 1) / order) : d;\n if (distanceFn && !clockwise) rc = -rc;\n var m = sqrt(ov.x * ov.x + ov.y * ov.y);\n ov.x /= m;\n ov.y /= m;\n np[t + 1] = {\n x: p.x + rc * ov.x,\n y: p.y + rc * ov.y\n };\n }.bind(this));\n return new Bezier(np);\n },\n outline: function outline(d1, d2, d3, d4) {\n d2 = typeof d2 === \"undefined\" ? d1 : d2;\n var reduced = this.reduce(),\n len = reduced.length,\n fcurves = [],\n bcurves = [],\n p,\n alen = 0,\n tlen = this.length();\n\n var graduated = typeof d3 !== \"undefined\" && typeof d4 !== \"undefined\";\n\n function linearDistanceFunction(s, e, tlen, alen, slen) {\n return function (v) {\n var f1 = alen / tlen,\n f2 = (alen + slen) / tlen,\n d = e - s;\n return utils.map(v, 0, 1, s + f1 * d, s + f2 * d);\n };\n };\n\n // form curve oulines\n reduced.forEach(function (segment) {\n slen = segment.length();\n if (graduated) {\n fcurves.push(segment.scale(linearDistanceFunction(d1, d3, tlen, alen, slen)));\n bcurves.push(segment.scale(linearDistanceFunction(-d2, -d4, tlen, alen, slen)));\n } else {\n fcurves.push(segment.scale(d1));\n bcurves.push(segment.scale(-d2));\n }\n alen += slen;\n });\n\n // reverse the \"return\" outline\n bcurves = bcurves.map(function (s) {\n p = s.points;\n if (p[3]) {\n s.points = [p[3], p[2], p[1], p[0]];\n } else {\n s.points = [p[2], p[1], p[0]];\n }\n return s;\n }).reverse();\n\n // form the endcaps as lines\n var fs = fcurves[0].points[0],\n fe = fcurves[len - 1].points[fcurves[len - 1].points.length - 1],\n bs = bcurves[len - 1].points[bcurves[len - 1].points.length - 1],\n be = bcurves[0].points[0],\n ls = utils.makeline(bs, fs),\n le = utils.makeline(fe, be),\n segments = [ls].concat(fcurves).concat([le]).concat(bcurves),\n slen = segments.length;\n\n return new PolyBezier(segments);\n },\n outlineshapes: function outlineshapes(d1, d2, curveIntersectionThreshold) {\n d2 = d2 || d1;\n var outline = this.outline(d1, d2).curves;\n var shapes = [];\n for (var i = 1, len = outline.length; i < len / 2; i++) {\n var shape = utils.makeshape(outline[i], outline[len - i], curveIntersectionThreshold);\n shape.startcap.virtual = i > 1;\n shape.endcap.virtual = i < len / 2 - 1;\n shapes.push(shape);\n }\n return shapes;\n },\n intersects: function intersects(curve, curveIntersectionThreshold) {\n if (!curve) return this.selfintersects(curveIntersectionThreshold);\n if (curve.p1 && curve.p2) {\n return this.lineIntersects(curve);\n }\n if (curve instanceof Bezier) {\n curve = curve.reduce();\n }\n return this.curveintersects(this.reduce(), curve, curveIntersectionThreshold);\n },\n lineIntersects: function lineIntersects(line) {\n var mx = min(line.p1.x, line.p2.x),\n my = min(line.p1.y, line.p2.y),\n MX = max(line.p1.x, line.p2.x),\n MY = max(line.p1.y, line.p2.y),\n self = this;\n return utils.roots(this.points, line).filter(function (t) {\n var p = self.get(t);\n return utils.between(p.x, mx, MX) && utils.between(p.y, my, MY);\n });\n },\n selfintersects: function selfintersects(curveIntersectionThreshold) {\n var reduced = this.reduce();\n // \"simple\" curves cannot intersect with their direct\n // neighbour, so for each segment X we check whether\n // it intersects [0:x-2][x+2:last].\n var i,\n len = reduced.length - 2,\n results = [],\n result,\n left,\n right;\n for (i = 0; i < len; i++) {\n left = reduced.slice(i, i + 1);\n right = reduced.slice(i + 2);\n result = this.curveintersects(left, right, curveIntersectionThreshold);\n results = results.concat(result);\n }\n return results;\n },\n curveintersects: function curveintersects(c1, c2, curveIntersectionThreshold) {\n var pairs = [];\n // step 1: pair off any overlapping segments\n c1.forEach(function (l) {\n c2.forEach(function (r) {\n if (l.overlaps(r)) {\n pairs.push({ left: l, right: r });\n }\n });\n });\n // step 2: for each pairing, run through the convergence algorithm.\n var intersections = [];\n pairs.forEach(function (pair) {\n var result = utils.pairiteration(pair.left, pair.right, curveIntersectionThreshold);\n if (result.length > 0) {\n intersections = intersections.concat(result);\n }\n });\n return intersections;\n },\n arcs: function arcs(errorThreshold) {\n errorThreshold = errorThreshold || 0.5;\n var circles = [];\n return this._iterate(errorThreshold, circles);\n },\n _error: function _error(pc, np1, s, e) {\n var q = (e - s) / 4,\n c1 = this.get(s + q),\n c2 = this.get(e - q),\n ref = utils.dist(pc, np1),\n d1 = utils.dist(pc, c1),\n d2 = utils.dist(pc, c2);\n return abs(d1 - ref) + abs(d2 - ref);\n },\n _iterate: function _iterate(errorThreshold, circles) {\n var s = 0,\n e = 1,\n safety;\n // we do a binary search to find the \"good `t` closest to no-longer-good\"\n do {\n safety = 0;\n\n // step 1: start with the maximum possible arc\n e = 1;\n\n // points:\n var np1 = this.get(s),\n np2,\n np3,\n arc,\n prev_arc;\n\n // booleans:\n var curr_good = false,\n prev_good = false,\n done;\n\n // numbers:\n var m = e,\n prev_e = 1,\n step = 0;\n\n // step 2: find the best possible arc\n do {\n prev_good = curr_good;\n prev_arc = arc;\n m = (s + e) / 2;\n step++;\n\n np2 = this.get(m);\n np3 = this.get(e);\n\n arc = utils.getccenter(np1, np2, np3);\n\n //also save the t values\n arc.interval = {\n start: s,\n end: e\n };\n\n var error = this._error(arc, np1, s, e);\n curr_good = error <= errorThreshold;\n\n done = prev_good && !curr_good;\n if (!done) prev_e = e;\n\n // this arc is fine: we can move 'e' up to see if we can find a wider arc\n if (curr_good) {\n\n // if e is already at max, then we're done for this arc.\n if (e >= 1) {\n arc.interval.end = prev_e = 1;\n prev_arc = arc;\n break;\n }\n // if not, move it up by half the iteration distance\n e = e + (e - s) / 2;\n }\n\n // this is a bad arc: we need to move 'e' down to find a good arc\n else {\n e = m;\n }\n } while (!done && safety++ < 100);\n\n if (safety >= 100) {\n break;\n }\n\n // console.log(\"L835: [F] arc found\", s, prev_e, prev_arc.x, prev_arc.y, prev_arc.s, prev_arc.e);\n\n prev_arc = prev_arc ? prev_arc : arc;\n circles.push(prev_arc);\n s = prev_e;\n } while (e < 1);\n return circles;\n }\n };\n\n module.exports = Bezier;\n })();\n }, { \"./poly-bezier.js\": 3, \"./utils.js\": 4 }], 3: [function (require, module, exports) {\n (function () {\n \"use strict\";\n\n var utils = require('./utils.js');\n\n /**\n * Poly Bezier\n * @param {[type]} curves [description]\n */\n var PolyBezier = function PolyBezier(curves) {\n this.curves = [];\n this._3d = false;\n if (!!curves) {\n this.curves = curves;\n this._3d = this.curves[0]._3d;\n }\n };\n\n PolyBezier.prototype = {\n valueOf: function valueOf() {\n return this.toString();\n },\n toString: function toString() {\n return \"[\" + this.curves.map(function (curve) {\n return utils.pointsToString(curve.points);\n }).join(\", \") + \"]\";\n },\n addCurve: function addCurve(curve) {\n this.curves.push(curve);\n this._3d = this._3d || curve._3d;\n },\n length: function length() {\n return this.curves.map(function (v) {\n return v.length();\n }).reduce(function (a, b) {\n return a + b;\n });\n },\n curve: function curve(idx) {\n return this.curves[idx];\n },\n bbox: function bbox() {\n var c = this.curves;\n var bbox = c[0].bbox();\n for (var i = 1; i < c.length; i++) {\n utils.expandbox(bbox, c[i].bbox());\n }\n return bbox;\n },\n offset: function offset(d) {\n var offset = [];\n this.curves.forEach(function (v) {\n offset = offset.concat(v.offset(d));\n });\n return new PolyBezier(offset);\n }\n };\n\n module.exports = PolyBezier;\n })();\n }, { \"./utils.js\": 4 }], 4: [function (require, module, exports) {\n (function () {\n \"use strict\";\n\n // math-inlining.\n\n var abs = Math.abs,\n cos = Math.cos,\n sin = Math.sin,\n acos = Math.acos,\n atan2 = Math.atan2,\n sqrt = Math.sqrt,\n pow = Math.pow,\n\n // cube root function yielding real roots\n crt = function crt(v) {\n return v < 0 ? -pow(-v, 1 / 3) : pow(v, 1 / 3);\n },\n\n // trig constants\n pi = Math.PI,\n tau = 2 * pi,\n quart = pi / 2,\n\n // float precision significant decimal\n epsilon = 0.000001,\n\n // extremas used in bbox calculation and similar algorithms\n nMax = Number.MAX_SAFE_INTEGER,\n nMin = Number.MIN_SAFE_INTEGER;\n\n // Bezier utility functions\n var utils = {\n // Legendre-Gauss abscissae with n=24 (x_i values, defined at i=n as the roots of the nth order Legendre polynomial Pn(x))\n Tvalues: [-0.0640568928626056260850430826247450385909, 0.0640568928626056260850430826247450385909, -0.1911188674736163091586398207570696318404, 0.1911188674736163091586398207570696318404, -0.3150426796961633743867932913198102407864, 0.3150426796961633743867932913198102407864, -0.4337935076260451384870842319133497124524, 0.4337935076260451384870842319133497124524, -0.5454214713888395356583756172183723700107, 0.5454214713888395356583756172183723700107, -0.6480936519369755692524957869107476266696, 0.6480936519369755692524957869107476266696, -0.7401241915785543642438281030999784255232, 0.7401241915785543642438281030999784255232, -0.8200019859739029219539498726697452080761, 0.8200019859739029219539498726697452080761, -0.8864155270044010342131543419821967550873, 0.8864155270044010342131543419821967550873, -0.9382745520027327585236490017087214496548, 0.9382745520027327585236490017087214496548, -0.9747285559713094981983919930081690617411, 0.9747285559713094981983919930081690617411, -0.9951872199970213601799974097007368118745, 0.9951872199970213601799974097007368118745],\n\n // Legendre-Gauss weights with n=24 (w_i values, defined by a function linked to in the Bezier primer article)\n Cvalues: [0.1279381953467521569740561652246953718517, 0.1279381953467521569740561652246953718517, 0.1258374563468282961213753825111836887264, 0.1258374563468282961213753825111836887264, 0.1216704729278033912044631534762624256070, 0.1216704729278033912044631534762624256070, 0.1155056680537256013533444839067835598622, 0.1155056680537256013533444839067835598622, 0.1074442701159656347825773424466062227946, 0.1074442701159656347825773424466062227946, 0.0976186521041138882698806644642471544279, 0.0976186521041138882698806644642471544279, 0.0861901615319532759171852029837426671850, 0.0861901615319532759171852029837426671850, 0.0733464814110803057340336152531165181193, 0.0733464814110803057340336152531165181193, 0.0592985849154367807463677585001085845412, 0.0592985849154367807463677585001085845412, 0.0442774388174198061686027482113382288593, 0.0442774388174198061686027482113382288593, 0.0285313886289336631813078159518782864491, 0.0285313886289336631813078159518782864491, 0.0123412297999871995468056670700372915759, 0.0123412297999871995468056670700372915759],\n\n arcfn: function arcfn(t, derivativeFn) {\n var d = derivativeFn(t);\n var l = d.x * d.x + d.y * d.y;\n if (typeof d.z !== \"undefined\") {\n l += d.z * d.z;\n }\n return sqrt(l);\n },\n\n between: function between(v, m, M) {\n return m <= v && v <= M || utils.approximately(v, m) || utils.approximately(v, M);\n },\n\n approximately: function approximately(a, b, precision) {\n return abs(a - b) <= (precision || epsilon);\n },\n\n length: function length(derivativeFn) {\n var z = 0.5,\n sum = 0,\n len = utils.Tvalues.length,\n i,\n t;\n for (i = 0; i < len; i++) {\n t = z * utils.Tvalues[i] + z;\n sum += utils.Cvalues[i] * utils.arcfn(t, derivativeFn);\n }\n return z * sum;\n },\n\n map: function map(v, ds, de, ts, te) {\n var d1 = de - ds,\n d2 = te - ts,\n v2 = v - ds,\n r = v2 / d1;\n return ts + d2 * r;\n },\n\n lerp: function lerp(r, v1, v2) {\n var ret = {\n x: v1.x + r * (v2.x - v1.x),\n y: v1.y + r * (v2.y - v1.y)\n };\n if (!!v1.z && !!v2.z) {\n ret.z = v1.z + r * (v2.z - v1.z);\n }\n return ret;\n },\n\n pointToString: function pointToString(p) {\n var s = p.x + \"/\" + p.y;\n if (typeof p.z !== \"undefined\") {\n s += \"/\" + p.z;\n }\n return s;\n },\n\n pointsToString: function pointsToString(points) {\n return \"[\" + points.map(utils.pointToString).join(\", \") + \"]\";\n },\n\n copy: function copy(obj) {\n return JSON.parse(JSON.stringify(obj));\n },\n\n angle: function angle(o, v1, v2) {\n var dx1 = v1.x - o.x,\n dy1 = v1.y - o.y,\n dx2 = v2.x - o.x,\n dy2 = v2.y - o.y,\n cross = dx1 * dy2 - dy1 * dx2,\n dot = dx1 * dx2 + dy1 * dy2;\n return atan2(cross, dot);\n },\n\n // round as string, to avoid rounding errors\n round: function round(v, d) {\n var s = '' + v;\n var pos = s.indexOf(\".\");\n return parseFloat(s.substring(0, pos + 1 + d));\n },\n\n dist: function dist(p1, p2) {\n var dx = p1.x - p2.x,\n dy = p1.y - p2.y;\n return sqrt(dx * dx + dy * dy);\n },\n\n closest: function closest(LUT, point) {\n var mdist = pow(2, 63),\n mpos,\n d;\n LUT.forEach(function (p, idx) {\n d = utils.dist(point, p);\n if (d < mdist) {\n mdist = d;\n mpos = idx;\n }\n });\n return { mdist: mdist, mpos: mpos };\n },\n\n abcratio: function abcratio(t, n) {\n // see ratio(t) note on http://pomax.github.io/bezierinfo/#abc\n if (n !== 2 && n !== 3) {\n return false;\n }\n if (typeof t === \"undefined\") {\n t = 0.5;\n } else if (t === 0 || t === 1) {\n return t;\n }\n var bottom = pow(t, n) + pow(1 - t, n),\n top = bottom - 1;\n return abs(top / bottom);\n },\n\n projectionratio: function projectionratio(t, n) {\n // see u(t) note on http://pomax.github.io/bezierinfo/#abc\n if (n !== 2 && n !== 3) {\n return false;\n }\n if (typeof t === \"undefined\") {\n t = 0.5;\n } else if (t === 0 || t === 1) {\n return t;\n }\n var top = pow(1 - t, n),\n bottom = pow(t, n) + top;\n return top / bottom;\n },\n\n lli8: function lli8(x1, y1, x2, y2, x3, y3, x4, y4) {\n var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n if (d == 0) {\n return false;\n }\n return { x: nx / d, y: ny / d };\n },\n\n lli4: function lli4(p1, p2, p3, p4) {\n var x1 = p1.x,\n y1 = p1.y,\n x2 = p2.x,\n y2 = p2.y,\n x3 = p3.x,\n y3 = p3.y,\n x4 = p4.x,\n y4 = p4.y;\n return utils.lli8(x1, y1, x2, y2, x3, y3, x4, y4);\n },\n\n lli: function lli(v1, v2) {\n return utils.lli4(v1, v1.c, v2, v2.c);\n },\n\n makeline: function makeline(p1, p2) {\n var Bezier = require('./bezier');\n var x1 = p1.x,\n y1 = p1.y,\n x2 = p2.x,\n y2 = p2.y,\n dx = (x2 - x1) / 3,\n dy = (y2 - y1) / 3;\n return new Bezier(x1, y1, x1 + dx, y1 + dy, x1 + 2 * dx, y1 + 2 * dy, x2, y2);\n },\n\n findbbox: function findbbox(sections) {\n var mx = nMax,\n my = nMax,\n MX = nMin,\n MY = nMin;\n sections.forEach(function (s) {\n var bbox = s.bbox();\n if (mx > bbox.x.min) mx = bbox.x.min;\n if (my > bbox.y.min) my = bbox.y.min;\n if (MX < bbox.x.max) MX = bbox.x.max;\n if (MY < bbox.y.max) MY = bbox.y.max;\n });\n return {\n x: { min: mx, mid: (mx + MX) / 2, max: MX, size: MX - mx },\n y: { min: my, mid: (my + MY) / 2, max: MY, size: MY - my }\n };\n },\n\n shapeintersections: function shapeintersections(s1, bbox1, s2, bbox2, curveIntersectionThreshold) {\n if (!utils.bboxoverlap(bbox1, bbox2)) return [];\n var intersections = [];\n var a1 = [s1.startcap, s1.forward, s1.back, s1.endcap];\n var a2 = [s2.startcap, s2.forward, s2.back, s2.endcap];\n a1.forEach(function (l1) {\n if (l1.virtual) return;\n a2.forEach(function (l2) {\n if (l2.virtual) return;\n var iss = l1.intersects(l2, curveIntersectionThreshold);\n if (iss.length > 0) {\n iss.c1 = l1;\n iss.c2 = l2;\n iss.s1 = s1;\n iss.s2 = s2;\n intersections.push(iss);\n }\n });\n });\n return intersections;\n },\n\n makeshape: function makeshape(forward, back, curveIntersectionThreshold) {\n var bpl = back.points.length;\n var fpl = forward.points.length;\n var start = utils.makeline(back.points[bpl - 1], forward.points[0]);\n var end = utils.makeline(forward.points[fpl - 1], back.points[0]);\n var shape = {\n startcap: start,\n forward: forward,\n back: back,\n endcap: end,\n bbox: utils.findbbox([start, forward, back, end])\n };\n var self = utils;\n shape.intersections = function (s2) {\n return self.shapeintersections(shape, shape.bbox, s2, s2.bbox, curveIntersectionThreshold);\n };\n return shape;\n },\n\n getminmax: function getminmax(curve, d, list) {\n if (!list) return { min: 0, max: 0 };\n var min = nMax,\n max = nMin,\n t,\n c;\n if (list.indexOf(0) === -1) {\n list = [0].concat(list);\n }\n if (list.indexOf(1) === -1) {\n list.push(1);\n }\n for (var i = 0, len = list.length; i < len; i++) {\n t = list[i];\n c = curve.get(t);\n if (c[d] < min) {\n min = c[d];\n }\n if (c[d] > max) {\n max = c[d];\n }\n }\n return { min: min, mid: (min + max) / 2, max: max, size: max - min };\n },\n\n align: function align(points, line) {\n var tx = line.p1.x,\n ty = line.p1.y,\n a = -atan2(line.p2.y - ty, line.p2.x - tx),\n d = function d(v) {\n return {\n x: (v.x - tx) * cos(a) - (v.y - ty) * sin(a),\n y: (v.x - tx) * sin(a) + (v.y - ty) * cos(a)\n };\n };\n return points.map(d);\n },\n\n roots: function roots(points, line) {\n line = line || { p1: { x: 0, y: 0 }, p2: { x: 1, y: 0 } };\n var order = points.length - 1;\n var p = utils.align(points, line);\n var reduce = function reduce(t) {\n return 0 <= t && t <= 1;\n };\n\n if (order === 2) {\n var a = p[0].y,\n b = p[1].y,\n c = p[2].y,\n d = a - 2 * b + c;\n if (d !== 0) {\n var m1 = -sqrt(b * b - a * c),\n m2 = -a + b,\n v1 = -(m1 + m2) / d,\n v2 = -(-m1 + m2) / d;\n return [v1, v2].filter(reduce);\n } else if (b !== c && d === 0) {\n return [(2 * b - c) / 2 * (b - c)].filter(reduce);\n }\n return [];\n }\n\n // see http://www.trans4mind.com/personal_development/mathematics/polynomials/cubicAlgebra.htm\n var pa = p[0].y,\n pb = p[1].y,\n pc = p[2].y,\n pd = p[3].y,\n d = -pa + 3 * pb - 3 * pc + pd,\n a = (3 * pa - 6 * pb + 3 * pc) / d,\n b = (-3 * pa + 3 * pb) / d,\n c = pa / d,\n p = (3 * b - a * a) / 3,\n p3 = p / 3,\n q = (2 * a * a * a - 9 * a * b + 27 * c) / 27,\n q2 = q / 2,\n discriminant = q2 * q2 + p3 * p3 * p3,\n u1,\n v1,\n x1,\n x2,\n x3;\n if (discriminant < 0) {\n var mp3 = -p / 3,\n mp33 = mp3 * mp3 * mp3,\n r = sqrt(mp33),\n t = -q / (2 * r),\n cosphi = t < -1 ? -1 : t > 1 ? 1 : t,\n phi = acos(cosphi),\n crtr = crt(r),\n t1 = 2 * crtr;\n x1 = t1 * cos(phi / 3) - a / 3;\n x2 = t1 * cos((phi + tau) / 3) - a / 3;\n x3 = t1 * cos((phi + 2 * tau) / 3) - a / 3;\n return [x1, x2, x3].filter(reduce);\n } else if (discriminant === 0) {\n u1 = q2 < 0 ? crt(-q2) : -crt(q2);\n x1 = 2 * u1 - a / 3;\n x2 = -u1 - a / 3;\n return [x1, x2].filter(reduce);\n } else {\n var sd = sqrt(discriminant);\n u1 = crt(-q2 + sd);\n v1 = crt(q2 + sd);\n return [u1 - v1 - a / 3].filter(reduce);;\n }\n },\n\n droots: function droots(p) {\n // quadratic roots are easy\n if (p.length === 3) {\n var a = p[0],\n b = p[1],\n c = p[2],\n d = a - 2 * b + c;\n if (d !== 0) {\n var m1 = -sqrt(b * b - a * c),\n m2 = -a + b,\n v1 = -(m1 + m2) / d,\n v2 = -(-m1 + m2) / d;\n return [v1, v2];\n } else if (b !== c && d === 0) {\n return [(2 * b - c) / (2 * (b - c))];\n }\n return [];\n }\n\n // linear roots are even easier\n if (p.length === 2) {\n var a = p[0],\n b = p[1];\n if (a !== b) {\n return [a / (a - b)];\n }\n return [];\n }\n },\n\n inflections: function inflections(points) {\n if (points.length < 4) return [];\n\n // FIXME: TODO: add in inflection abstraction for quartic+ curves?\n\n var p = utils.align(points, { p1: points[0], p2: points.slice(-1)[0] }),\n a = p[2].x * p[1].y,\n b = p[3].x * p[1].y,\n c = p[1].x * p[2].y,\n d = p[3].x * p[2].y,\n v1 = 18 * (-3 * a + 2 * b + 3 * c - d),\n v2 = 18 * (3 * a - b - 3 * c),\n v3 = 18 * (c - a);\n\n if (utils.approximately(v1, 0)) {\n if (!utils.approximately(v2, 0)) {\n var t = -v3 / v2;\n if (0 <= t && t <= 1) return [t];\n }\n return [];\n }\n\n var trm = v2 * v2 - 4 * v1 * v3,\n sq = Math.sqrt(trm),\n d = 2 * v1;\n\n if (utils.approximately(d, 0)) return [];\n\n return [(sq - v2) / d, -(v2 + sq) / d].filter(function (r) {\n return 0 <= r && r <= 1;\n });\n },\n\n bboxoverlap: function bboxoverlap(b1, b2) {\n var dims = ['x', 'y'],\n len = dims.length,\n i,\n dim,\n l,\n t,\n d;\n for (i = 0; i < len; i++) {\n dim = dims[i];\n l = b1[dim].mid;\n t = b2[dim].mid;\n d = (b1[dim].size + b2[dim].size) / 2;\n if (abs(l - t) >= d) return false;\n }\n return true;\n },\n\n expandbox: function expandbox(bbox, _bbox) {\n if (_bbox.x.min < bbox.x.min) {\n bbox.x.min = _bbox.x.min;\n }\n if (_bbox.y.min < bbox.y.min) {\n bbox.y.min = _bbox.y.min;\n }\n if (_bbox.z && _bbox.z.min < bbox.z.min) {\n bbox.z.min = _bbox.z.min;\n }\n if (_bbox.x.max > bbox.x.max) {\n bbox.x.max = _bbox.x.max;\n }\n if (_bbox.y.max > bbox.y.max) {\n bbox.y.max = _bbox.y.max;\n }\n if (_bbox.z && _bbox.z.max > bbox.z.max) {\n bbox.z.max = _bbox.z.max;\n }\n bbox.x.mid = (bbox.x.min + bbox.x.max) / 2;\n bbox.y.mid = (bbox.y.min + bbox.y.max) / 2;\n if (bbox.z) {\n bbox.z.mid = (bbox.z.min + bbox.z.max) / 2;\n }\n bbox.x.size = bbox.x.max - bbox.x.min;\n bbox.y.size = bbox.y.max - bbox.y.min;\n if (bbox.z) {\n bbox.z.size = bbox.z.max - bbox.z.min;\n }\n },\n\n pairiteration: function pairiteration(c1, c2, curveIntersectionThreshold) {\n var c1b = c1.bbox(),\n c2b = c2.bbox(),\n r = 100000,\n threshold = curveIntersectionThreshold || 0.5;\n if (c1b.x.size + c1b.y.size < threshold && c2b.x.size + c2b.y.size < threshold) {\n return [(r * (c1._t1 + c1._t2) / 2 | 0) / r + \"/\" + (r * (c2._t1 + c2._t2) / 2 | 0) / r];\n }\n var cc1 = c1.split(0.5),\n cc2 = c2.split(0.5),\n pairs = [{ left: cc1.left, right: cc2.left }, { left: cc1.left, right: cc2.right }, { left: cc1.right, right: cc2.right }, { left: cc1.right, right: cc2.left }];\n pairs = pairs.filter(function (pair) {\n return utils.bboxoverlap(pair.left.bbox(), pair.right.bbox());\n });\n var results = [];\n if (pairs.length === 0) return results;\n pairs.forEach(function (pair) {\n results = results.concat(utils.pairiteration(pair.left, pair.right, threshold));\n });\n results = results.filter(function (v, i) {\n return results.indexOf(v) === i;\n });\n return results;\n },\n\n getccenter: function getccenter(p1, p2, p3) {\n var dx1 = p2.x - p1.x,\n dy1 = p2.y - p1.y,\n dx2 = p3.x - p2.x,\n dy2 = p3.y - p2.y;\n var dx1p = dx1 * cos(quart) - dy1 * sin(quart),\n dy1p = dx1 * sin(quart) + dy1 * cos(quart),\n dx2p = dx2 * cos(quart) - dy2 * sin(quart),\n dy2p = dx2 * sin(quart) + dy2 * cos(quart);\n // chord midpoints\n var mx1 = (p1.x + p2.x) / 2,\n my1 = (p1.y + p2.y) / 2,\n mx2 = (p2.x + p3.x) / 2,\n my2 = (p2.y + p3.y) / 2;\n // midpoint offsets\n var mx1n = mx1 + dx1p,\n my1n = my1 + dy1p,\n mx2n = mx2 + dx2p,\n my2n = my2 + dy2p;\n // intersection of these lines:\n var arc = utils.lli8(mx1, my1, mx1n, my1n, mx2, my2, mx2n, my2n),\n r = utils.dist(arc, p1),\n\n // arc start/end values, over mid point:\n s = atan2(p1.y - arc.y, p1.x - arc.x),\n m = atan2(p2.y - arc.y, p2.x - arc.x),\n e = atan2(p3.y - arc.y, p3.x - arc.x),\n _;\n // determine arc direction (cw/ccw correction)\n if (s < e) {\n // if s m || m > e) {\n s += tau;\n }\n if (s > e) {\n _ = e;e = s;s = _;\n }\n } else {\n // if e -1) {\n _this2.extendMethod(mm, ctxMethod, currentMixin);\n } else {\n if (_this2.opt.warn) {\n console.warn(mm + ' method already exists within the ' + _this2.context.constructor.name + ' component.');\n }\n if (_this2.opt.mergeDuplicates) {\n _this2.extendMethod(mm, ctxMethod, currentMixin);\n }\n }\n }\n });\n this.addNewMethod(mm, currentMixin);\n }\n }]);\n\n return Mixins;\n }();\n\n var mix = new Mixins();\n\n module.exports = mix.init.bind(mix);\n }, {}], 6: [function (require, module, exports) {\n (function (global) {\n (function (f) {\n if ((typeof exports === \"undefined\" ? \"undefined\" : _typeof2(exports)) === \"object\" && typeof module !== \"undefined\") {\n module.exports = f();\n } else if (typeof define === \"function\" && define.amd) {\n define([], f);\n } else {\n var g;if (typeof window !== \"undefined\") {\n g = window;\n } else if (typeof global !== \"undefined\") {\n g = global;\n } else if (typeof self !== \"undefined\") {\n g = self;\n } else {\n g = this;\n }g.Ez = f();\n }\n })(function () {\n var define, module, exports;return function e(t, n, r) {\n function s(o, u) {\n if (!n[o]) {\n if (!t[o]) {\n var a = typeof require == \"function\" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);var f = new Error(\"Cannot find module '\" + o + \"'\");throw f.code = \"MODULE_NOT_FOUND\", f;\n }var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) {\n var n = t[o][1][e];return s(n ? n : e);\n }, l, l.exports, e, t, n, r);\n }return n[o].exports;\n }var i = typeof require == \"function\" && require;for (var o = 0; o < r.length; o++) {\n s(r[o]);\n }return s;\n }({ 1: [function (require, module, exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.easeInQuad = easeInQuad;\n exports.easeOutQuad = easeOutQuad;\n exports.easeInOutQuad = easeInOutQuad;\n exports.easeInCubic = easeInCubic;\n exports.easeOutCubic = easeOutCubic;\n exports.easeInOutCubic = easeInOutCubic;\n exports.easeInQuart = easeInQuart;\n exports.easeOutQuart = easeOutQuart;\n exports.easeInOutQuart = easeInOutQuart;\n exports.easeInQuint = easeInQuint;\n exports.easeOutQuint = easeOutQuint;\n exports.easeInOutQuint = easeInOutQuint;\n exports.easeInSine = easeInSine;\n exports.easeOutSine = easeOutSine;\n exports.easeInOutSine = easeInOutSine;\n exports.easeInExpo = easeInExpo;\n exports.easeOutExpo = easeOutExpo;\n exports.easeInOutExpo = easeInOutExpo;\n exports.easeInCirc = easeInCirc;\n exports.easeOutCirc = easeOutCirc;\n exports.easeInOutCirc = easeInOutCirc;\n exports.easeInElastic = easeInElastic;\n exports.easeOutElastic = easeOutElastic;\n exports.easeInOutElastic = easeInOutElastic;\n exports.easeInBack = easeInBack;\n exports.easeOutBack = easeOutBack;\n exports.easeInOutBack = easeInOutBack;\n exports.easeInBounce = easeInBounce;\n exports.easeOutBounce = easeOutBounce;\n exports.easeInOutBounce = easeInOutBounce;\n\n function easeInQuad(t, b, c, d) {\n return c * (t /= d) * t + b;\n }\n\n function easeOutQuad(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n }\n\n function easeInOutQuad(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t + b;\n return -c / 2 * (--t * (t - 2) - 1) + b;\n }\n\n function easeInCubic(t, b, c, d) {\n return c * (t /= d) * t * t + b;\n }\n\n function easeOutCubic(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }\n\n function easeInOutCubic(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n\n function easeInQuart(t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }\n\n function easeOutQuart(t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }\n\n function easeInOutQuart(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n\n function easeInQuint(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }\n\n function easeOutQuint(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }\n\n function easeInOutQuint(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n\n function easeInSine(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n function easeOutSine(t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }\n\n function easeInOutSine(t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }\n\n function easeInExpo(t, b, c, d) {\n return t == 0 ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }\n\n function easeOutExpo(t, b, c, d) {\n return t == d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }\n\n function easeInOutExpo(t, b, c, d) {\n if (t == 0) return b;\n if (t == d) return b + c;\n if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n\n function easeInCirc(t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }\n\n function easeOutCirc(t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }\n\n function easeInOutCirc(t, b, c, d) {\n if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n\n function easeInElastic(t, b, c, d) {\n var s = 1.70158;var p = 0;var a = c;\n if (t == 0) return b;if ((t /= d) == 1) return b + c;if (!p) p = d * .3;\n\n if (a < Math.abs(c)) {\n a = c;var s = p / 4;\n } else var s = p / (2 * Math.PI) * Math.asin(c / a);\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n }\n\n function easeOutElastic(t, b, c, d) {\n var s = 1.70158;var p = 0;var a = c;\n if (t == 0) return b;if ((t /= d) == 1) return b + c;if (!p) p = d * .3;\n\n if (a < Math.abs(c)) {\n a = c;var s = p / 4;\n } else var s = p / (2 * Math.PI) * Math.asin(c / a);\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n }\n\n function easeInOutElastic(t, b, c, d) {\n var s = 1.70158;var p = 0;var a = c;\n if (t == 0) return b;if ((t /= d / 2) == 2) return b + c;if (!p) p = d * (.3 * 1.5);\n\n if (a < Math.abs(c)) {\n a = c;var s = p / 4;\n } else var s = p / (2 * Math.PI) * Math.asin(c / a);\n if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;\n }\n\n function easeInBack(t, b, c, d, s) {\n if (s == undefined) s = 1.70158;\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }\n\n function easeOutBack(t, b, c, d, s) {\n if (s == undefined) s = 1.70158;\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n\n function easeInOutBack(t, b, c, d, s) {\n if (s == undefined) s = 1.70158;\n if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n\n function easeInBounce(t, b, c, d) {\n return c - easeOutBounce(d - t, 0, c, d) + b;\n }\n\n function easeOutBounce(t, b, c, d) {\n\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + .75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + .9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + .984375) + b;\n }\n }\n\n function easeInOutBounce(t, b, c, d) {\n if (t < d / 2) return easeInBounce(t * 2, 0, c, d) * .5 + b;\n return easeOutBounce(t * 2 - d, 0, c, d) * .5 + c * .5 + b;\n }\n }, {}] }, {}, [1])(1);\n });\n }).call(this, typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {});\n }, {}], 7: [function (require, module, exports) {\n function n(n) {\n return n = n || Object.create(null), { on: function on(t, o) {\n (n[t] || (n[t] = [])).push(o);\n }, off: function off(t, o) {\n n[t] && n[t].splice(n[t].indexOf(o) >>> 0, 1);\n }, emit: function emit(t, o) {\n (n[t] || []).map(function (n) {\n n(o);\n }), (n[\"*\"] || []).map(function (n) {\n n(t, o);\n });\n } };\n }module.exports = n;\n }, {}], 8: [function (require, module, exports) {\n (function (process) {\n // Generated by CoffeeScript 1.12.2\n (function () {\n var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;\n\n if (typeof performance !== \"undefined\" && performance !== null && performance.now) {\n module.exports = function () {\n return performance.now();\n };\n } else if (typeof process !== \"undefined\" && process !== null && process.hrtime) {\n module.exports = function () {\n return (getNanoSeconds() - nodeLoadTime) / 1e6;\n };\n hrtime = process.hrtime;\n getNanoSeconds = function getNanoSeconds() {\n var hr;\n hr = hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n moduleLoadTime = getNanoSeconds();\n upTime = process.uptime() * 1e9;\n nodeLoadTime = moduleLoadTime - upTime;\n } else if (Date.now) {\n module.exports = function () {\n return Date.now() - loadTime;\n };\n loadTime = Date.now();\n } else {\n module.exports = function () {\n return new Date().getTime() - loadTime;\n };\n loadTime = new Date().getTime();\n }\n }).call(this);\n }).call(this, require('_process'));\n }, { \"_process\": 9 }], 9: [function (require, module, exports) {\n // shim for using process in browser\n var process = module.exports = {};\n\n // cached from whatever global is present so that test runners that stub it\n // don't break things. But we need to wrap it in a try catch in case it is\n // wrapped in strict mode code which doesn't define any globals. It's inside a\n // function because try/catches deoptimize in certain engines.\n\n var cachedSetTimeout;\n var cachedClearTimeout;\n\n function defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n }\n function defaultClearTimeout() {\n throw new Error('clearTimeout has not been defined');\n }\n (function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n })();\n function runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n }\n function runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n }\n var queue = [];\n var draining = false;\n var currentQueue;\n var queueIndex = -1;\n\n function cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n }\n\n function drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while (len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n }\n\n process.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n };\n\n // v8 likes predictible objects\n function Item(fun, array) {\n this.fun = fun;\n this.array = array;\n }\n Item.prototype.run = function () {\n this.fun.apply(null, this.array);\n };\n process.title = 'browser';\n process.browser = true;\n process.env = {};\n process.argv = [];\n process.version = ''; // empty string to avoid regexp issues\n process.versions = {};\n\n function noop() {}\n\n process.on = noop;\n process.addListener = noop;\n process.once = noop;\n process.off = noop;\n process.removeListener = noop;\n process.removeAllListeners = noop;\n process.emit = noop;\n\n process.binding = function (name) {\n throw new Error('process.binding is not supported');\n };\n\n process.cwd = function () {\n return '/';\n };\n process.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n };\n process.umask = function () {\n return 0;\n };\n }, {}], 10: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _es6Mixins = require('es6-mixins');\n\n var _es6Mixins2 = _interopRequireDefault(_es6Mixins);\n\n var _helper = require('../util/helper');\n\n var _tinycolor = require('../util/tinycolor');\n\n var _tinycolor2 = _interopRequireDefault(_tinycolor);\n\n var _randomColor = require('../util/randomColor');\n\n var _randomColor2 = _interopRequireDefault(_randomColor);\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _wxChart = require('./wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _title = require('../core/title');\n\n var _title2 = _interopRequireDefault(_title);\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _scale3 = require('../scale/scale.liner');\n\n var _scale4 = _interopRequireDefault(_scale3);\n\n var _scale5 = require('../scale/scale.crosshelp');\n\n var _scale6 = _interopRequireDefault(_scale5);\n\n var _scale7 = require('../scale/scale.stackhelp');\n\n var _scale8 = _interopRequireDefault(_scale7);\n\n var _scale9 = require('../scale/scale.category');\n\n var _scale10 = _interopRequireDefault(_scale9);\n\n var _legend = require('../core/legend');\n\n var _legend2 = _interopRequireDefault(_legend);\n\n var _layout = require('../core/layout');\n\n var _layout2 = _interopRequireDefault(_layout);\n\n var _animation = require('../core/animation');\n\n var _animation2 = _interopRequireDefault(_animation);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Bar legend's default config\n var WX_BAR_LEGEND_DEFAULT_CONFIG = {\n borderWidth: 1,\n fillArea: true,\n fillAlpha: 0.5,\n display: true,\n // barWidth: 'auto' //Set each bar's width. If not set, the bars are sized automatically.\n barPercentage: 0.8 // Percent (0-1) of the available width each bar should be within the data point space,like the flexible layout~\n // fillStyle\n // strokeStyle\n };\n // Bar default config\n var WX_BAR_DEFAULT_CONFIG = {\n minBetweenPixel: 5, // The minisize space between each bar.\n pointPercentage: 0.8, // Percent (0-1) of the space for each data point\n stacked: false, // If true, bars are stacked on the x-axis\n zeroLine: false,\n // barPercentage: 0.8 // If stacked is true, global \"barPercentage\" setting will be effective. Otherwise, legend's setting priorities.\n // Scale options\n xScaleOptions: {\n position: 'bottom'\n },\n xScaleItemOptions: undefined,\n yScaleOptions: {\n position: 'left'\n },\n yScaleItemOptions: undefined,\n crossScaleOptions: {\n xMargin: function xMargin(xBox, yBox, area, xScale, yScale, xScaleDatasets) {\n return xScale.calculateTickWidth(xScaleDatasets, xBox);\n },\n xFirstPointSpace: 0\n },\n // The title text or a title config object\n title: undefined,\n\n // The legend of line chart\n legends: [], // borderWidth, fillArea, fillAlpha can be set in here\n legendOptions: {\n 'position': 'bottom'\n },\n\n point: {},\n\n // The randomColor scheme\n // See https://github.com/davidmerfield/randomColor\n color: {\n hue: 'red',\n luminosity: 'light'\n },\n\n // The dataset's default key\n defaultKey: 'value',\n\n // Animation\n animate: true,\n animateOptions: {\n start: 1,\n end: 1001,\n duration: 1000\n }\n };\n\n var WX_BAR_ITEM_DEFAULT_CONFIG = {\n //borderWidth: 1,\n //fillArea: true,\n //fillAlpha: 0.5,\n //strokeStyle: '#ffffff',\n display: true\n };\n\n var WxBar = function (_WxChart) {\n _inherits(WxBar, _WxChart);\n\n /**\r\n * WxBar chart\r\n * @constructor\r\n * @param {string} id - The canvas element's id\r\n * @param {Object} config\r\n * @param {number} [config.width=300] - The width of canvas.\r\n * @param {number} [config.height=200] - The height of canvas.\r\n * @param {number} [config.padding=] - The padding of canvas.\r\n * @param {string} [config.display=block] - The display style of chart.\r\n *\r\n * @param {Object} config.legendOptions=[] - The legend & label options.You should set 'key' to bind the attribute in datasets which is the value of the point.\r\n * @param {(string|Object)} [config.title=] - The title text or title options of chart.\r\n * @example\r\n *datasets:[{\r\n * valueA: 30,\r\n * valueB: 40,\r\n * label: '一月'\r\n * }, {\r\n * valueA: 20,\r\n * valueB: 50,\r\n * pointRadius: 2,\r\n * label: '二月'\r\n *},...]\r\n *\r\n * legends: [{\r\n * 'text': 'valueA Text',\r\n * 'key': 'valueA',\r\n * 'strokeStyle': '#3385ff',\r\n * 'barPercentage': 0.8\r\n * }, {\r\n * text: 'valueB Text',\r\n * key: 'valueB'\r\n * }]\r\n */\n function WxBar(id, config) {\n _classCallCheck(this, WxBar);\n\n var _this = _possibleConstructorReturn(this, (WxBar.__proto__ || Object.getPrototypeOf(WxBar)).call(this, id, config));\n\n _this.__drawBar = function (point, percent, legend, stacked, hasNeg) {\n var ctx = _this.ctx;\n var display = legend.display,\n borderWidth = legend.borderWidth,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n var px = void 0,\n py = void 0,\n width = void 0,\n height = void 0;\n if (!point) {\n return { px: px, py: py, width: width, height: height };\n }\n\n if (stacked && hasNeg) {\n width = point.barWidth;\n height = point.barHeight * percent;\n px = point.x;\n py = point.y + point.barHeight / 2 - height / 2;\n } else {\n px = point.x;\n width = point.barWidth;\n height = point.barHeight * percent;\n py = point.y + point.barHeight * (1 - percent);\n }\n\n ctx.save();\n\n ctx.fillStyle = fillStyle;\n ctx.strokeStyle = strokeStyle;\n ctx.lineWidth = borderWidth;\n // First, fill\n if (fillArea) {\n ctx.beginPath();\n ctx.globalAlpha = fillAlpha;\n ctx.rect(px, py, width, height);\n ctx.fill();\n ctx.globalAlpha = 1;\n }\n // Next, stroke\n if (borderWidth) {\n ctx.beginPath();\n if (stacked && hasNeg) {\n ctx.rect(px, py, width, height);\n } else {\n ctx.moveTo(px, py + height);\n ctx.lineTo(px, py);\n ctx.lineTo(px + width, py);\n ctx.lineTo(px + width, py + height);\n }\n ctx.stroke();\n }\n\n ctx.draw();\n ctx.restore();\n\n return { px: px, py: py, width: width, height: height };\n };\n\n (0, _es6Mixins2.default)([_scale8.default], _this, {\n // Mixins will create a new method to nested call all duplicate method\n mergeDuplicates: false\n });\n\n var me = _this;\n me.chartConfig = (0, _helper.extend)({}, WX_BAR_DEFAULT_CONFIG, config);\n\n me.title = null;\n // Initialize title and legend\n if (me.chartConfig.title) {\n me.title = new _title2.default(me, _helper.is.PureObject(me.chartConfig.title) ? me.chartConfig.title : null);\n me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;\n }\n\n // Initialize legend\n me.legend = new _legend2.default(me, me.chartConfig.legendOptions);\n\n // Initialize x,y Scale\n me.yAxis = new _scale4.default(me, me.chartConfig.yScaleOptions);\n me.xAxis = new _scale10.default(me, me.chartConfig.xScaleOptions);\n me.wxCrossScale = new _scale6.default(me.xAxis, me.yAxis, me.chartConfig.crossScaleOptions);\n me.wxLayout = new _layout2.default(me);\n\n // Initialize wxAnimation\n if (me.chartConfig.animate) me.wxAnimation = new _animation2.default(me.chartConfig.animateOptions);\n\n me.emit('init', {\n options: me.chartConfig\n });\n return _this;\n }\n\n // Get/Set labels\n\n\n _createClass(WxBar, [{\n key: '_getLegendConfig',\n\n /**\r\n * Build legends config\r\n * @private\r\n */\n value: function _getLegendConfig() {\n var me = this,\n defaultKey = me.chartConfig.defaultKey || 'value',\n legendsConfig = me.chartConfig.legends;\n if (!legendsConfig) {\n if (me.labels && me.labels.length) {\n legendsConfig = me.labels.map(function (label) {\n return { 'text': label, 'key': defaultKey };\n });\n } else {\n throw new Error('Can not get legend config!');\n }\n } else {\n legendsConfig = legendsConfig.map(function (legend) {\n return (0, _helper.extend)(true, {\n 'key': defaultKey\n }, legend);\n });\n }\n return legendsConfig;\n }\n /**\r\n * Update a datesets of chart and reDraw\r\n * @param {Object} datasets - data sets\r\n * @param {string} [datasets[].display] - Disaply the bar or not\r\n * @param {string} [datasets[].borderWidth=1] - Bar's border width\r\n * @param {string} [datasets[].strokeStyle] - Bar's border color\r\n * @param {number} [datasets[].fillArea=true] - Fill color or not\r\n * @param {number} [datasets[].fillAlpha=0.6] - Fill color Alpha\r\n * @param {number} [datasets[].fillStyle] - Fill color. The default color will randomly assigned by 'color' option.\r\n * @returns {*}\r\n */\n\n }, {\n key: 'update',\n value: function update(datasets) {\n var me = this;\n me._labels = null;\n me._legends = null;\n _get(WxBar.prototype.__proto__ || Object.getPrototypeOf(WxBar.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_BAR_ITEM_DEFAULT_CONFIG, me.chartConfig.point));\n me.wxLayout.removeAllBox();\n if (me.wxAnimation) me.wxAnimation.reset();\n return me.draw();\n }\n /**\r\n * Draw chart\r\n */\n\n }, {\n key: 'draw',\n value: function draw() {\n var box = void 0,\n me = this,\n ctx = me.ctx,\n animate = me.chartConfig.animate,\n wxLayout = me.wxLayout;\n var _me$chartConfig = me.chartConfig,\n pointPercentage = _me$chartConfig.pointPercentage,\n minBetweenPixel = _me$chartConfig.minBetweenPixel,\n stacked = _me$chartConfig.stacked,\n color = _me$chartConfig.color,\n zeroLine = _me$chartConfig.zeroLine;\n\n me.emit('beforeDraw', {\n options: me.chartConfig\n });\n\n // First, we draw title\n box = wxLayout.adjustBox();\n if (me.title) {\n me.title.update(me.titleText, box);\n wxLayout.addBox(me.title.box);\n }\n\n // Second, random color and get legend datasets\n box = wxLayout.adjustBox();\n var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.legends.length }));\n\n me.legends = me.legends.map(function (legend, index) {\n if (!legend.strokeStyle) {\n legend.strokeStyle = legend.borderColor || (0, _tinycolor2.default)(rColors[index]).darken(10).toString();\n }\n\n return (0, _helper.extend)(true, {\n fillStyle: rColors[index]\n }, WX_BAR_LEGEND_DEFAULT_CONFIG, legend);\n });\n me.legend.update(me.legends, box);\n wxLayout.addBox(me.legend.box);\n\n // Thirdly, draw scale\n me._drawScale();\n\n // Calculate bar ruler\n me.barRuler = me.calculateBarRuler();\n // Finally, draw bar\n var hasNeg = false;\n var barConfigs = me.legends.map(function (legend, legendIndex) {\n var config = {\n legend: legend\n };\n var key = legend.key;\n config.dataset = me.visDatasets.map(function (data, index) {\n hasNeg = hasNeg || data[key] < 0;\n return {\n value: data[key],\n data: data,\n point: me.calculateBarRect(index, legendIndex)\n };\n });\n return config;\n });\n\n barConfigs.forEach(function (bar) {\n return me.drawBar(bar, hasNeg);\n });\n\n if (animate) {\n me.emit('animate', { animation: me.wxAnimation });\n me.wxAnimation.run(true);\n me.wxAnimation.on('done', function () {\n if (zeroLine) me._darwZeroLine();\n me.emit('draw', {\n options: barConfigs\n });\n });\n } else {\n if (zeroLine) me._darwZeroLine();\n me.emit('draw', {\n options: barConfigs\n });\n }\n }\n\n /**\r\n * Draw zero line\r\n * @private\r\n */\n\n }, {\n key: '_darwZeroLine',\n value: function _darwZeroLine() {\n var me = this,\n ctx = me.ctx;\n // zero line\n ctx.save();\n ctx.fillStyle = me.xAxis.config.color;\n ctx.lineWidth = me.xAxis.config.lineWidth;\n\n var baseY = me.yAxis.getPoint(0).y;\n ctx.beginPath();\n ctx.moveTo(me.xAxis.getPoint(-1).x, baseY);\n ctx.lineTo(me.xAxis.box.ex, baseY);\n ctx.stroke();\n ctx.restore();\n }\n }, {\n key: '_getAnimationDrawBar',\n\n /**\r\n * Return a animate tick func\r\n * @param barData\r\n * @param hasNeg\r\n * @return {function(*, *, *)|null}\r\n * @private\r\n */\n value: function _getAnimationDrawBar(barData, hasNeg) {\n var me = this,\n backgroundColor = me.config.backgroundColor,\n stacked = me.chartConfig.stacked,\n animate = me.chartConfig.animate,\n animateOpt = me.chartConfig.animateOptions,\n ctx = me.ctx;\n\n var legend = barData.legend,\n dataset = barData.dataset;\n var display = legend.display,\n borderWidth = legend.borderWidth,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n // Animation dynamic options\n\n var dataLen = dataset.length,\n categoryTicks = (animateOpt.end - animateOpt.start) / dataLen;\n\n if (!display) {\n return;\n }\n\n return function (t, lastData, toNext) {\n var dataIndex = Math.floor(t / categoryTicks);\n\n var _ref = dataIndex < dataLen ? dataset[dataIndex] : dataset[dataLen - 1],\n point = _ref.point;\n\n var percent = t % categoryTicks / categoryTicks;\n\n if (lastData) {\n var lastDataIndex = lastData.dataIndex,\n lastPercent = lastData.percent,\n lastt = lastData.t,\n lastx = lastData.x,\n lasty = lastData.y,\n lastWidth = lastData.width,\n lastHeight = lastData.height;\n\n if (lastDataIndex < dataLen && lastx) {\n ctx.save();\n ctx.beginPath();\n // TODO: optimize clear check!!\n ctx.lineWidth = borderWidth;\n ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';\n ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';\n ctx.fillRect(lastx, lasty, lastWidth, lastHeight);\n if (borderWidth) {\n ctx.beginPath();\n if (stacked && hasNeg && borderWidth) {\n ctx.rect(lastx, lasty, lastWidth, lastHeight);\n } else {\n ctx.moveTo(lastx, lasty + lastHeight);\n ctx.lineTo(lastx, lasty);\n ctx.lineTo(lastx + lastWidth, lasty);\n ctx.lineTo(lastx + lastWidth, lasty + lastHeight);\n }\n ctx.stroke();\n }\n\n ctx.draw();\n ctx.restore();\n }\n\n if (lastDataIndex !== dataIndex && !!lastPercent) {\n // End the lasted bar\n var _ref2 = lastDataIndex < dataLen ? dataset[lastDataIndex] : dataset[dataLen - 1],\n lastPoint = _ref2.point;\n\n me.__drawBar(lastPoint, 1, legend, stacked, hasNeg);\n }\n }\n\n var px = void 0,\n py = void 0,\n width = void 0,\n height = void 0;\n if (dataIndex < dataLen && (!!percent || !point)) {\n var _me$__drawBar = me.__drawBar(point, percent, legend, stacked, hasNeg);\n\n px = _me$__drawBar.px;\n py = _me$__drawBar.py;\n width = _me$__drawBar.width;\n height = _me$__drawBar.height;\n }\n\n return {\n dataIndex: dataIndex,\n percent: percent,\n t: t,\n x: px,\n y: py,\n width: width,\n height: height\n };\n };\n }\n }, {\n key: '_drawBar',\n value: function _drawBar(barData, hasNeg) {\n var me = this,\n stacked = me.chartConfig.stacked,\n ctx = me.ctx;\n var legend = barData.legend,\n dataset = barData.dataset;\n var display = legend.display,\n borderWidth = legend.borderWidth,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n if (!display) {\n return;\n }\n\n dataset.forEach(function (d) {\n var value = d.value,\n data = d.data,\n point = d.point;\n\n if (!point) {\n return;\n }\n\n me.__drawBar(point, 1, legend, stacked, hasNeg);\n // if (stacked && hasNeg) {\n // ctx.beginPath();\n // ctx.rect(point.x ,point.y ,point.barWidth, point.barHeight);\n // if (borderWidth) {\n // ctx.stroke();\n // }\n // if (fillArea) {\n // ctx.globalAlpha = fillAlpha;\n // ctx.fill();\n // ctx.globalAlpha = 1;\n // }\n // } else {\n // // | 1 2 |\n // // | 0 3 |\n // let points = [\n // [point.x, point.y + point.barHeight],\n // [point.x, point.y],\n // [point.x + point.barWidth, point.y],\n // [point.x + point.barWidth, point.y + point.barHeight]\n // ];\n //\n // ctx.moveTo(...points[0]);\n // ctx.lineTo(...points[1]);\n // ctx.lineTo(...points[2]);\n // ctx.lineTo(...points[3]);\n //\n // if (borderWidth) {\n // ctx.stroke();\n // }\n // if (fillArea) {\n // ctx.globalAlpha = fillAlpha;\n // ctx.fill();\n // ctx.globalAlpha = 1;\n // }\n // }\n });\n }\n\n /**\r\n * Draw one line\r\n * @param {Object} barData - Line dataset\r\n * @param {Object} barData.legend - Legend's config\r\n * @param {Object[]} barData[].value - Data of each line point\r\n * @param {Object[]} barData[].data - The data object\r\n * @param {Object[]} barData[].point - The point for rending.\r\n * @parma {boolean} hasNeg - Has negative value or not\r\n * @private\r\n */\n\n }, {\n key: 'drawBar',\n value: function drawBar(barData, hasNeg) {\n var me = this,\n animate = me.chartConfig.animate;\n\n if (animate) {\n var actionAnimation = me._getAnimationDrawBar(barData, hasNeg);\n me.wxAnimation.pushActions(actionAnimation);\n // me.wxAnimation.on('done', () => {\n // me._drawBar(barData, hasNeg);\n // })\n } else {\n me._drawBar(barData, hasNeg);\n }\n }\n\n /**\r\n * Bar's render ruler\r\n * @typedef {Object} BarRuler\r\n * @property {number} tickWidth - The width of one ticket.\r\n * @property {number} pointPercentage - Percent (0-1) of the space for each data point\r\n * @property {number} pointWidth - The width of each data point\r\n * @property {number} pointIntervalWidth - The remaining width of the space for each data point\r\n * @property {number} barIntervalWidth - The remaining width of each bar\r\n * @property {Object[]} legends - legends's setting\r\n * @property {number} legends.barPercentage - Percent (0-1) of the available width each bar should be within the data point space\r\n * @property {number} legends._standardPercentage - The real percent of the available with at each point scope\r\n * @property {number} legends.barWidth - The width of bar\r\n */\n\n /**\r\n * Calculate the bar's base ruler\r\n * @param {WxScale} [scale=this.xAxis] - Bar's scale\r\n * @return {BarRuler} Bar ruler\r\n */\n\n }, {\n key: 'calculateBarRuler',\n value: function calculateBarRuler() {\n var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.xAxis;\n\n var me = this;\n var globalBarWidth = void 0,\n globalBarPercentage = me.chartConfig.barPercentage,\n pointPercentage = me.chartConfig.pointPercentage,\n stacked = me.chartConfig.stacked,\n legends = me.legends;\n var legendLen = legends.length;\n\n var tickWidth = scale.calculateTickWidth();\n // One scale's point space\n var pointWidth = tickWidth * pointPercentage;\n var pointIntervalWidth = (tickWidth - pointWidth) / 2;\n\n // Standardization every bar's percentage\n var totalStandardPercentage = 0;\n if (!globalBarPercentage) {\n globalBarPercentage = stacked ? Math.max.apply(Math, _toConsumableArray(legends.map(function (x) {\n return x.barPercentage || 0.8;\n }))) || 0.8 : 0.8;\n }\n globalBarWidth = Math.max.apply(Math, _toConsumableArray([globalBarPercentage * pointWidth].concat(legends.map(function (x) {\n return _helper.is.Number(x.barWidth) ? x.barWidth : 0;\n }))));\n\n legends.forEach(function (legend) {\n if (stacked) {\n legend.barWidth = globalBarWidth;\n legend.barPercentage = globalBarPercentage;\n legend._standardPercentage = globalBarPercentage / legendLen;\n } else {\n var standardPercentage = void 0;\n var barPercentage = legend.barPercentage ? legend.barPercentage > 1 ? 1.0 : legend.barPercentage : globalBarPercentage;\n\n if (legend.barWidth) {\n // Bar fixed width...\n standardPercentage = legend.barWidth / tickWidth;\n } else {\n standardPercentage = barPercentage / legendLen;\n legend.barWidth = pointWidth * standardPercentage;\n }\n totalStandardPercentage += standardPercentage;\n legend._standardPercentage = standardPercentage;\n }\n });\n\n // Check total percentage\n if (totalStandardPercentage > 1) {\n throw Error('Bar\\'s width too large!');\n } else if (stacked) {\n totalStandardPercentage = globalBarPercentage;\n }\n\n var barIntervalWidth = legendLen > 1 ? pointWidth * (1 - totalStandardPercentage) / (legendLen - 1) : pointWidth * (1 - totalStandardPercentage);\n\n return { tickWidth: tickWidth, pointPercentage: pointPercentage, pointWidth: pointWidth, pointIntervalWidth: pointIntervalWidth, legends: legends, barIntervalWidth: barIntervalWidth };\n }\n\n /**\r\n * Calculate the box of one \"rect\"\r\n * @param {number} index - The index of item\r\n * @param {number} legendIndex - The index of legend\r\n * @param {WxScale} [xScale=this.xAxis] - Bar's x-axis\r\n * @param {WxScale} [yScale=this.yAxis] - Bar's x-axis\r\n */\n\n }, {\n key: 'calculateBarRect',\n value: function calculateBarRect(index, legendIndex) {\n var xScale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.xAxis;\n var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;\n\n var me = this,\n stacked = me.chartConfig.stacked,\n barRuler = me.barRuler || me.calculateBarRuler(xScale);\n\n var legendOpt = me.legends[legendIndex];\n if (!legendOpt) {\n return;\n }\n // Calculate the bar's width in front of this legend\n var frontBarWidth = me.legends.slice(0, legendIndex).reduce(function (acc, cur) {\n return acc + cur.barWidth;\n }, 0);\n var data = me.visDatasets[index];\n var value = legendOpt.key && typeof data[legendOpt.key] !== 'undefined' ? data[legendOpt.key] : null;\n if (_helper.is.Null(value) || _helper.is.Undefined(value)) {\n return;\n }\n\n var xPoint = void 0,\n yPoint = void 0,\n barWidth = void 0,\n barHeight = void 0;\n var xPointInstance = xScale.getPoint(index);\n if (stacked) {\n xPoint = xPointInstance.x - barRuler.pointWidth / 2 + barRuler.barIntervalWidth / 2;\n yPoint = me._getStackPoint(index, legendIndex).y;\n barWidth = legendOpt.barWidth;\n\n // TODO: Find another way to replace this variable :__sumNeg __sumPos\n var baseY = yScale.getPoint(0).y;\n barHeight = value < 0 ? value / data.__sumNeg * (yScale.getPoint(data.__sumNeg).y - baseY) : value / data.__sumPos * (baseY - yScale.getPoint(data.__sumPos).y);\n\n yPoint = value < 0 ? yPoint - barHeight : yPoint;\n } else {\n xPoint = xPointInstance.x - barRuler.pointWidth / 2 + frontBarWidth + barRuler.barIntervalWidth / 2 * (legendIndex + 1);\n yPoint = yScale.getPoint(value).y;\n barWidth = legendOpt.barWidth;\n barHeight = xPointInstance.y - yPoint;\n }\n\n return { x: xPoint, y: yPoint, barWidth: barWidth, barHeight: barHeight };\n }\n\n /**\r\n * Draw the scale of chart\r\n *\r\n * @private\r\n */\n\n }, {\n key: '_drawScale',\n value: function _drawScale() {\n var box = void 0,\n me = this,\n wxLayout = me.wxLayout;\n\n box = wxLayout.adjustBox();\n var xDatasets = me.xScaleAxisDatas(),\n yDatasets = me.yScaleAxisDatas(box);\n\n var _me$wxCrossScale$draw = me.wxCrossScale.draw(box, xDatasets, yDatasets),\n xBox = _me$wxCrossScale$draw.xBox,\n yBox = _me$wxCrossScale$draw.yBox;\n\n wxLayout.addBox(xBox);\n wxLayout.addBox(yBox);\n }\n\n /**\r\n * Build the yAxis datasets\r\n * @param {BoxInstance} area - The area of chart\r\n */\n\n }, {\n key: 'yScaleAxisDatas',\n value: function yScaleAxisDatas(area) {\n var me = this,\n stacked = me.chartConfig.stacked,\n ctx = me.ctx;\n var yScaleItemOptions = me.chartConfig.yScaleItemOptions;\n var tickLimits = me.yAxis.calculateTickLimit(area, ctx);\n\n if (stacked) {\n //let {max, min} = me.stackYScaleAxisLimit();\n var _me$stackYScaleAxisLi = me.stackYScaleAxisLimit(),\n max = _me$stackYScaleAxisLi.max,\n min = _me$stackYScaleAxisLi.min;\n\n return me.yAxis.buildDatasets(max, min, tickLimits, undefined, yScaleItemOptions);\n } else {\n // First, get all available values and calculate the max/min value\n var _visDatasets$reduce = this.visDatasets.reduce(function (pre, cur) {\n var max = pre.max,\n min = pre.min;\n\n if (cur.display) {\n var curValue = me.legends.map(function (legend) {\n if (legend.key) {\n return cur[legend.key] || 0;\n }\n }).concat(max, min);\n max = Math.max.apply(Math, curValue);\n min = Math.min.apply(Math, curValue);\n }\n return { max: max, min: min };\n }, {\n max: 0,\n min: 0\n }),\n _max = _visDatasets$reduce.max,\n _min = _visDatasets$reduce.min;\n\n return me.yAxis.buildDatasets(_max, _min, tickLimits, undefined, yScaleItemOptions);\n }\n }\n\n /**\r\n * Build the xAxis datasets\r\n */\n\n }, {\n key: 'xScaleAxisDatas',\n value: function xScaleAxisDatas() {\n var me = this;\n var xScaleItemOptions = me.chartConfig.xScaleItemOptions;\n var xScaleConfig = me.labels.map(function (label) {\n var item = {\n 'text': label\n };\n if (typeof xScaleItemOptions !== 'undefined') {\n item = (0, _helper.extend)(item, xScaleItemOptions);\n }\n return item;\n });\n\n return me.xAxis.buildDatasets(xScaleConfig);\n }\n }, {\n key: 'labels',\n get: function get() {\n var me = this,\n tmp = void 0;\n if (me._labels) {\n return me._labels;\n } else if (tmp = me.chartConfig.labels) {\n if (_helper.is.Array(tmp)) {\n return tmp;\n }\n }\n me._labels = me.visDatasets.map(function (dataset) {\n return dataset.label;\n });\n return me._labels;\n }\n }, {\n key: 'legends',\n get: function get() {\n var me = this;\n if (!me._legends) {\n me._legends = me._getLegendConfig();\n }\n return me._legends;\n },\n set: function set(value) {\n this._legends = value;\n }\n }]);\n\n return WxBar;\n }(_wxChart2.default);\n\n exports.default = WxBar;\n }, { \"../core/animation\": 14, \"../core/layout\": 16, \"../core/legend\": 17, \"../core/scale\": 18, \"../core/title\": 19, \"../scale/scale.category\": 20, \"../scale/scale.crosshelp\": 21, \"../scale/scale.liner\": 22, \"../scale/scale.stackhelp\": 23, \"../util/helper\": 24, \"../util/randomColor\": 26, \"../util/tinycolor\": 27, \"../util/wxCanvas\": 29, \"./wxChart\": 13, \"es6-mixins\": 5 }], 11: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _wxChart = require('./wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _title = require('../core/title');\n\n var _title2 = _interopRequireDefault(_title);\n\n var _layout = require('../core/layout');\n\n var _layout2 = _interopRequireDefault(_layout);\n\n var _legend = require('../core/legend');\n\n var _legend2 = _interopRequireDefault(_legend);\n\n var _randomColor = require('../util/randomColor');\n\n var _randomColor2 = _interopRequireDefault(_randomColor);\n\n var _helper = require('../util/helper');\n\n var _animation = require('../core/animation');\n\n var _animation2 = _interopRequireDefault(_animation);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Doughnut default config\n var WX_DOUGHNUT_DEFAULT_CONFIG = {\n legendOptions: {\n 'position': 'bottom'\n },\n // The percentage of the chart that we cut out of the middle.\n cutoutPercentage: 50,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: Math.PI * -0.5,\n\n // The randomColor scheme\n // See https://github.com/davidmerfield/randomColor\n color: {\n hue: 'red',\n luminosity: 'light'\n },\n\n point: {},\n\n // The title text or a title config object\n title: undefined,\n\n // The borderWidth\n borderWidth: 2,\n\n // Chart padding, default auto set\n padding: undefined,\n\n labelDistancePercentage: 0.15,\n // Animation\n animate: true,\n animateOptions: {\n start: 1,\n end: 501,\n duration: 1000\n }\n };\n\n /**\n * Doughnut item config\n *\n * value: The value of chart\n * label: The legend text\n * color: The color of item ,by default we use the randomColour scheme to create color\n * radius: The percentage of radius, default is '100'\n * legend: [Object] legend options\n */\n var WX_DOUGHNUT_ITEM_DEFAULT_CONFIG = {\n display: true,\n fontSize: 11,\n percentage: 100\n };\n\n var WxDoughnut = function (_WxChart) {\n _inherits(WxDoughnut, _WxChart);\n\n /**\n * WxDoughnut chart\n * @constructor\n * @param {string} id - The canvas element's id\n * @param {Object} config\n * @param {number} [config.width=300] - The width of canvas.\n * @param {number} [config.height=200] - The height of canvas.\n * @param {number} [config.padding=] - The padding of canvas.\n * @param {string} [config.display=block] - The display style of chart.\n *\n * @param {number} [config.cutoutPercentage=50] - The percentage of the chart that we cut out of the middle.\n * @param {number} [config.rotation=Math.PI * -0.5] - The rotation of the chart, where the first data arc begins.\n * @param {Object} [config.color=red] - The randomColor options.\n * @param {(string|Object)} [config.title=] - The title text or title options of chart.\n * @param {Object} [config.legendOptions=] - The legend options of chart.\n */\n function WxDoughnut(id, config) {\n _classCallCheck(this, WxDoughnut);\n\n var _this = _possibleConstructorReturn(this, (WxDoughnut.__proto__ || Object.getPrototypeOf(WxDoughnut)).call(this, id, config));\n\n var me = _this;\n me.chartConfig = (0, _helper.extend)({}, WX_DOUGHNUT_DEFAULT_CONFIG, config);\n\n me.title = null;\n // Initialize title and legend\n if (me.chartConfig.title) {\n me.title = new _title2.default(me, _helper.is.PureObject(me.chartConfig.title) ? me.chartConfig.title : null);\n me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;\n }\n\n me.legend = new _legend2.default(me, me.chartConfig.legendOptions);\n me.wxLayout = new _layout2.default(me);\n\n // Initialize wxAnimation\n if (me.chartConfig.animate) me.wxAnimation = new _animation2.default(me.chartConfig.animateOptions);\n\n me.emit('init', {\n options: me.chartConfig\n });\n return _this;\n }\n\n /**\n * Update a datesets of chart and reDraw\n * @param {Object[]} datasets\n * @param {string} [datasets[].hidden=false] - Display or not.\n * @param {string} datasets[].label - The label text of an dataset.\n * @param {function} datasets[].format - The label text format function.\n * @param {number} datasets[].value - The value of an dataset.\n * @param {string} [datasets[].color] - The color of an dataset.\n * @param {string} [datasets[].borderColor]- The border color of an dataset.\n * @param {string} [datasets[].percentage=100] - The percentage of radius, default is '100'\n * @param {string} [datasets[].legend] - The legend option of an dataset. We will set legend text as same as label text.\n *\n */\n\n _createClass(WxDoughnut, [{\n key: 'update',\n value: function update(datasets) {\n var me = this;\n _get(WxDoughnut.prototype.__proto__ || Object.getPrototypeOf(WxDoughnut.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_DOUGHNUT_ITEM_DEFAULT_CONFIG, me.chartConfig.point));\n me.wxLayout.removeAllBox();\n if (me.wxAnimation) me.wxAnimation.reset();\n return me.draw();\n }\n\n /**\n * Draw chart\n */\n\n }, {\n key: 'draw',\n value: function draw() {\n var box = void 0,\n me = this,\n animate = me.chartConfig.animate,\n labelDistancePercentage = me.chartConfig.labelDistancePercentage,\n wxLayout = me.wxLayout;\n var _me$chartConfig = me.chartConfig,\n cutoutPercentage = _me$chartConfig.cutoutPercentage,\n rotation = _me$chartConfig.rotation,\n color = _me$chartConfig.color,\n title = _me$chartConfig.title,\n borderWidth = _me$chartConfig.borderWidth,\n padding = _me$chartConfig.padding;\n\n me.emit('beforeDraw', {\n options: me.chartConfig\n });\n\n box = wxLayout.adjustBox();\n // First, we draw title\n if (me.title) {\n me.title.update(me.titleText, box);\n wxLayout.addBox(me.title.box);\n }\n\n box = wxLayout.adjustBox();\n // Second, random color and get legend datasets\n var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.visDatasets.length }));\n var rBorderColor = (0, _randomColor2.default)({\n hue: color.hue || 'black',\n luminosity: 'dark',\n count: 1\n });\n var legendDatasets = [];\n me.visDatasets.forEach(function (dataset, index) {\n if (!dataset.color) {\n dataset.color = rColors[index];\n }\n if (!dataset.borderColor) {\n dataset.borderColor = me.config.backgroundColor || \"#ffffff\";\n }\n\n var legend = dataset.legend;\n if (!legend || _helper.is.String(legend)) {\n legendDatasets.push({\n hidden: dataset.hidden || false,\n text: _helper.is.String(legend) ? legend : dataset.label,\n fillStyle: dataset.color,\n strokeStyle: rBorderColor[0]\n });\n } else if (_helper.is.PureObject(legend)) {\n legendDatasets.push((0, _helper.extend)({\n hidden: dataset.hidden\n }, legend));\n }\n });\n me.legend.update(legendDatasets, box);\n wxLayout.addBox(me.legend.box);\n\n box = wxLayout.adjustBox();\n padding = padding || box.width * 0.1;\n box.width -= padding;\n box.height -= padding;\n me.box = box;\n\n var _box = box,\n x = _box.x,\n y = _box.y,\n width = _box.width,\n height = _box.height,\n outerWidth = _box.outerWidth,\n outerHeight = _box.outerHeight;\n\n var minSize = Math.min(width, height);\n var outerRadius = Math.max((minSize - borderWidth * 2) / 2, 0) - 10;\n var totalValue = me.calculateTotal(),\n longestLabelWidth = me._longestLabel(totalValue),\n maximalFontSize = me._maximalLabelFontSize(),\n shouldSpace = longestLabelWidth + maximalFontSize + outerRadius * labelDistancePercentage;\n\n // Calculate the space between pie's border and margin of chart\n var widthSpace = (width - (outerRadius + borderWidth) * 2) / 2;\n if (widthSpace < shouldSpace) {\n outerRadius -= shouldSpace - widthSpace;\n }\n\n var innerRadius = cutoutPercentage ? outerRadius / 100 * cutoutPercentage : 0,\n innerRadiusColor = me.config.backgroundColor || \"#ffffff\";\n var pointX = x + outerWidth / 2,\n pointY = y + outerHeight / 2;\n\n var opt = {\n pointX: pointX,\n pointY: pointY,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n totalValue: totalValue,\n borderWidth: borderWidth,\n rotation: rotation,\n totalAngle: Math.PI * 2.0\n };\n\n me.drawDoughnut(me.visDatasets, opt);\n if (animate) {\n me.emit('animate', { animation: me.wxAnimation });\n me.wxAnimation.run(true);\n me.wxAnimation.on('done', function () {\n me.emit('draw', {\n options: opt\n });\n });\n } else {\n me.emit('draw', {\n options: opt\n });\n }\n wxLayout.addBox(me.box);\n }\n }, {\n key: 'drawData',\n value: function drawData(dataset, options) {\n var me = this,\n ctx = me.ctx;\n var pointX = options.pointX,\n pointY = options.pointY,\n startAngle = options.startAngle,\n endAngle = options.endAngle,\n outerRadius = options.outerRadius,\n innerRadius = options.innerRadius,\n totalValue = options.totalValue,\n borderWidth = options.borderWidth;\n var label = dataset.label,\n value = dataset.value,\n color = dataset.color,\n borderColor = dataset.borderColor,\n percentage = dataset.percentage,\n hidden = dataset.hidden;\n\n if (!!hidden) {\n return endAngle;\n }\n\n var centerAngle = startAngle + (endAngle - startAngle) / 2;\n var currentRadius = outerRadius / 100 * percentage;\n\n ctx.beginPath();\n\n ctx.arc(pointX, pointY, currentRadius, startAngle, endAngle);\n ctx.arc(pointX, pointY, innerRadius, endAngle, startAngle, true);\n\n ctx.closePath();\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth || 0;\n ctx.fillStyle = color;\n\n ctx.fill();\n ctx.lineJoin = 'bevel';\n\n if (borderWidth) {\n ctx.stroke();\n }\n ctx.draw();\n return endAngle;\n }\n }, {\n key: 'drawLabel',\n value: function drawLabel(dataset, options) {\n var me = this,\n ctx = me.ctx;\n var labelDistancePercentage = me.chartConfig.labelDistancePercentage || 0.2;\n var pointX = options.pointX,\n pointY = options.pointY,\n startAngle = options.startAngle,\n endAngle = options.endAngle,\n outerRadius = options.outerRadius,\n innerRadius = options.innerRadius,\n totalValue = options.totalValue,\n borderWidth = options.borderWidth;\n var label = dataset.label,\n value = dataset.value,\n color = dataset.color,\n borderColor = dataset.borderColor,\n fontSize = dataset.fontSize,\n percentage = dataset.percentage,\n format = dataset.format,\n hidden = dataset.hidden;\n\n if (!!hidden) {\n return;\n }\n\n var centerAngle = startAngle + (endAngle - startAngle) / 2;\n var currentRadius = outerRadius / 100 * percentage;\n label = _helper.is.Function(format) ? format.call(me, label, value, totalValue, currentRadius, dataset, options) : label;\n\n // Line start point\n var startX = Math.cos(centerAngle) * currentRadius + pointX;\n var startY = Math.sin(centerAngle) * currentRadius + pointY;\n\n // Line turn around point\n var offsetRadius = currentRadius * labelDistancePercentage,\n turnRadius = currentRadius + offsetRadius;\n var turnX = Math.cos(centerAngle) * turnRadius + pointX;\n var turnY = Math.sin(centerAngle) * turnRadius + pointY;\n\n // Avoid Collision\n var adjustPoint = me.avoidCollision({\n x: turnX,\n y: turnY\n }, {\n x: pointX,\n y: pointY\n });\n turnX = adjustPoint.x;\n turnY = adjustPoint.y;\n\n var textLen = ctx.measureText(label).width;\n var endX = turnX + (turnX - pointX > 0 ? offsetRadius : -offsetRadius),\n endY = turnY;\n var textX = turnX - pointX > 0 ? endX + 4 : endX - 4 - textLen,\n textY = endY + ctx.fontSize / 2;\n\n ctx.beginPath();\n ctx.lineWidth = 1;\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.fontSize = fontSize;\n ctx.moveTo(startX, startY);\n ctx.lineTo(turnX, turnY);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n ctx.fillText(label, textX, textY);\n ctx.draw();\n }\n }, {\n key: 'drawDoughnut',\n\n /**\n * Draw Doughnut\n * @param {Object} dateset - Doughnut data\n * @param {Object} opt - Draw options\n */\n value: function drawDoughnut(dataset, opt) {\n var me = this,\n animate = me.chartConfig.animate,\n animateOpt = me.chartConfig.animateOptions;\n\n if (animate) {\n var actionAnimation = me._getAnimationDrawDoughnut(dataset, opt);\n if (!actionAnimation) {\n return;\n }\n me.wxAnimation.pushActions(actionAnimation);\n } else {\n me._drawDoughnut(dataset, opt);\n }\n }\n }, {\n key: '_getAnimationDrawDoughnut',\n value: function _getAnimationDrawDoughnut(dataset, opt) {\n var me = this,\n ctx = me.ctx,\n animateOpt = me.chartConfig.animateOptions,\n backgroundColor = me.config.backgroundColor;\n var pointX = opt.pointX,\n pointY = opt.pointY,\n totalValue = opt.totalValue,\n rotation = opt.rotation,\n outerRadius = opt.outerRadius,\n borderWidth = opt.borderWidth,\n totalAngle = opt.totalAngle;\n\n var aniTotal = animateOpt.end - animateOpt.start;\n\n return function (t, lastt, toNext) {\n var percent = t / aniTotal;\n var currTotalAngle = totalAngle * percent;\n\n // Clear\n ctx.save();\n ctx.beginPath();\n ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';\n ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';\n ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);\n ctx.fill();\n if (borderWidth) {\n ctx.beginPath();\n ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);\n ctx.lineJoin = 'bevel';\n ctx.lineWidth = borderWidth;\n ctx.stroke();\n }\n ctx.draw();\n\n if (animateOpt.end === t) {\n me._drawDoughnut(dataset, opt);\n } else {\n (function () {\n var drawAngle = rotation;\n dataset.forEach(function (data) {\n var startAngle = drawAngle,\n endAngle = startAngle + currTotalAngle * (data.value / totalValue);\n var o = (0, _helper.extend)({ startAngle: startAngle, endAngle: endAngle }, opt);\n me.drawData(data, o);\n drawAngle = endAngle;\n });\n })();\n }\n ctx.restore();\n return t;\n };\n }\n }, {\n key: '_drawDoughnut',\n value: function _drawDoughnut(dataset, opt) {\n var me = this;\n var totalValue = opt.totalValue,\n rotation = opt.rotation,\n totalAngle = opt.totalAngle;\n\n var drawAngle = rotation;\n me.initAvoidCollision();\n dataset.forEach(function (data) {\n var startAngle = drawAngle,\n endAngle = startAngle + totalAngle * (data.value / totalValue);\n var o = (0, _helper.extend)({ startAngle: startAngle, endAngle: endAngle }, opt);\n me.drawData(data, o);\n me.drawLabel(data, o);\n drawAngle = endAngle;\n });\n }\n\n // Get longest label\n\n }, {\n key: '_longestLabel',\n value: function _longestLabel(totalValue) {\n var me = this,\n visDatasets = me.visDatasets,\n ctx = me.ctx;\n var maxLabelWidth = 0;\n visDatasets.forEach(function (dataset) {\n var label = dataset.label,\n value = dataset.value,\n format = dataset.format;\n\n label = _helper.is.Function(format) ? format.call(me, label, value, totalValue, 0, dataset) : label;\n var textLen = ctx.measureText(label).width;\n\n maxLabelWidth = textLen > maxLabelWidth ? textLen : maxLabelWidth;\n });\n return maxLabelWidth;\n }\n // Get maximal font size of label\n\n }, {\n key: '_maximalLabelFontSize',\n value: function _maximalLabelFontSize() {\n var me = this,\n visDatasets = me.visDatasets;\n var max = 0;\n visDatasets.forEach(function (dataset) {\n var fontSize = dataset.fontSize;\n\n max = fontSize > max ? fontSize : max;\n });\n return max;\n }\n // Avoid Collision\n\n }, {\n key: 'initAvoidCollision',\n value: function initAvoidCollision() {\n this._lastPoint = null;\n }\n }, {\n key: 'avoidCollision',\n value: function avoidCollision(newPoint, centerPoint) {\n var avoidUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.ctx.fontSize + 4;\n\n var me = this,\n box = me.box;\n var cpx = centerPoint.x,\n cpy = centerPoint.y;\n if (me._lastPoint) {\n var lpx = me._lastPoint.x,\n lpy = me._lastPoint.y;\n var npx = newPoint.x,\n npy = newPoint.y;\n if ((npx - cpx) * (lpx - cpx) > 0 && Math.abs(lpy - npy) < avoidUnit) {\n var ny = npx - cpx > 0 ? lpy + avoidUnit : lpy - avoidUnit;\n newPoint.y = ny;\n }\n }\n this._lastPoint = newPoint;\n return newPoint;\n }\n }]);\n\n return WxDoughnut;\n }(_wxChart2.default);\n\n exports.default = WxDoughnut;\n }, { \"../core/animation\": 14, \"../core/layout\": 16, \"../core/legend\": 17, \"../core/title\": 19, \"../util/helper\": 24, \"../util/randomColor\": 26, \"../util/wxCanvas\": 29, \"./wxChart\": 13 }], 12: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _es6Mixins = require('es6-mixins');\n\n var _es6Mixins2 = _interopRequireDefault(_es6Mixins);\n\n var _helper = require('../util/helper');\n\n var _randomColor = require('../util/randomColor');\n\n var _randomColor2 = _interopRequireDefault(_randomColor);\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _wxChart = require('./wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _title = require('../core/title');\n\n var _title2 = _interopRequireDefault(_title);\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _scale3 = require('../scale/scale.liner');\n\n var _scale4 = _interopRequireDefault(_scale3);\n\n var _scale5 = require('../scale/scale.crosshelp');\n\n var _scale6 = _interopRequireDefault(_scale5);\n\n var _scale7 = require('../scale/scale.stackhelp');\n\n var _scale8 = _interopRequireDefault(_scale7);\n\n var _scale9 = require('../scale/scale.category');\n\n var _scale10 = _interopRequireDefault(_scale9);\n\n var _legend = require('../core/legend');\n\n var _legend2 = _interopRequireDefault(_legend);\n\n var _layout = require('../core/layout');\n\n var _layout2 = _interopRequireDefault(_layout);\n\n var _animation = require('../core/animation');\n\n var _animation2 = _interopRequireDefault(_animation);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n var Bezier = require('bezier-js');\n\n // Line legend's default config\n var WX_LINE_LEGEND_DEFAULT_CONFIG = {\n lineWidth: 1,\n // 'capStyle': 'butt', //Default line cap is cap,\n lineJoin: 'miter',\n fillArea: false,\n fillAlpha: 0.5,\n display: true,\n spanGaps: false, // If set true, will draw line between the null point\n tension: 0.4 // Default bezier curve tension. Set to 0 for no bezier curves.\n };\n // Line default config\n var WX_LINER_DEFAULT_CONFIG = {\n // Scale options\n xScaleOptions: {\n position: 'bottom'\n },\n xScaleItemOptions: undefined,\n yScaleOptions: {\n position: 'left'\n },\n yScaleItemOptions: undefined,\n crossScaleOptions: {},\n // The title text or a title config object\n title: undefined,\n\n stacked: false, // If true, line are stacked on the x-axis\n discardNeg: false,\n\n // The legend of line chart\n legends: [], // lineWidth, lineJoin, fillStyle, strokeStyle, fillArea can be set in here\n legendOptions: {\n 'position': 'bottom'\n },\n\n // Point global options\n point: {},\n\n // The randomColor scheme\n // See https://github.com/davidmerfield/randomColor\n color: {\n hue: 'red',\n luminosity: 'light'\n },\n\n // The dataset's default key\n defaultKey: 'value',\n\n // Animation\n animate: true,\n animateOptions: {\n start: 1,\n end: 1001,\n duration: 1000\n }\n };\n\n var WX_LINER_ITEM_DEFAULT_CONFIG = {\n pointRadius: 2,\n pointStyle: 'circle', // Support triangle, rect and Image object\n pointBorderWidth: 1,\n pointBorderColor: '#ffffff',\n display: true\n };\n\n var WxLiner = function (_WxChart) {\n _inherits(WxLiner, _WxChart);\n\n /**\r\n * WxLiner chart\r\n * @constructor\r\n * @param {string} id - The canvas element's id\r\n * @param {Object} config\r\n * @param {number} [config.width=300] - The width of canvas.\r\n * @param {number} [config.height=200] - The height of canvas.\r\n * @param {number} [config.padding=] - The padding of canvas.\r\n * @param {string} [config.display=block] - The display style of chart.\r\n *\r\n * @param {Object} config.legendOptions=[] - The legend & label options.You should set 'key' to bind the attribute in datasets which is the value of the point.\r\n * @param {(string|Object)} [config.title=] - The title text or title options of chart.\r\n * @example\r\n * datasets:[{\r\n * valueA: 30,\r\n * valueB: 40,\r\n * label: '一月'\r\n * }, {\r\n * valueA: 20,\r\n * valueB: 50,\r\n * pointRadius: 2,\r\n * label: '二月'\r\n * },...]\r\n *\r\n * legends: [{\r\n * 'text': 'valueA Text',\r\n * 'key': 'valueA',\r\n * 'strokeStyle': '#3385ff'\r\n * }, {\r\n * text: 'valueB Text',\r\n * key: 'valueB'\r\n * }]\r\n */\n function WxLiner(id, config) {\n _classCallCheck(this, WxLiner);\n\n var _this = _possibleConstructorReturn(this, (WxLiner.__proto__ || Object.getPrototypeOf(WxLiner)).call(this, id, config));\n\n _initialiseProps.call(_this);\n\n (0, _es6Mixins2.default)([_scale8.default], _this, {\n // Mixins will create a new method to nested call all duplicate method\n mergeDuplicates: false\n });\n\n var me = _this;\n me.chartConfig = (0, _helper.extend)({}, WX_LINER_DEFAULT_CONFIG, config);\n\n me.title = null;\n // Initialize title and legend\n if (me.chartConfig.title) {\n me.title = new _title2.default(me, _helper.is.PureObject(me.chartConfig.title) ? me.chartConfig.title : null);\n me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;\n }\n\n // Initialize legend\n me.legend = new _legend2.default(me, me.chartConfig.legendOptions);\n\n // Initialize x,y Scale\n me.yAxis = new _scale4.default(me, me.chartConfig.yScaleOptions);\n me.xAxis = new _scale10.default(me, me.chartConfig.xScaleOptions);\n me.wxCrossScale = new _scale6.default(me.xAxis, me.yAxis, me.chartConfig.crossScaleOptions);\n me.wxLayout = new _layout2.default(me);\n\n // Initialize wxAnimation\n if (me.chartConfig.animate) me.wxAnimation = new _animation2.default(me.chartConfig.animateOptions);\n\n me.emit('init', {\n options: me.chartConfig\n });\n return _this;\n }\n\n // Get/Set labels\n\n\n _createClass(WxLiner, [{\n key: '_getLegendConfig',\n\n /**\r\n * Build legends config\r\n * @private\r\n */\n value: function _getLegendConfig() {\n var me = this,\n defaultKey = me.chartConfig.defaultKey || 'value',\n legendsConfig = me.chartConfig.legends;\n if (!legendsConfig) {\n if (me.labels && me.labels.length) {\n legendsConfig = me.labels.map(function (label) {\n return { 'text': label, 'key': defaultKey };\n });\n } else {\n throw new Error('Can not get legend config!');\n }\n } else {\n legendsConfig = legendsConfig.map(function (legend) {\n return (0, _helper.extend)(true, {\n 'key': defaultKey\n }, legend);\n });\n }\n return legendsConfig;\n }\n\n /**\r\n * Update a datesets of chart and reDraw\r\n * @param {Object} datasets - data sets\r\n * @param {string} [datasets[].display] - Disaply the bar or not\r\n * @param {number} [datasets[].fillStyle] - Point fill color. The default color will randomly assigned by 'color' option.\r\n * @param {string} [datasets[].strokeStyle='#ffffff'] - Point's border color\r\n * @param {string} [datasets[].pointStyle='circle'] - Point style, support triangle, rect and Image object\r\n * @param {number} [datasets[].pointRadius=3] - Point radius if style is circle\r\n * @param {number} [datasets[].pointBorderWidth=1.5] - Point border width\r\n * @param {string} [datasets[].pointBorderColor='auto'] - Point border color. If not set, will same as lineColor(luminosity+50%)\r\n * @param {number} [datasets[].display=true] - display the point or not\r\n * @returns {*}\r\n */\n\n }, {\n key: 'update',\n value: function update(datasets) {\n var me = this;\n me._labels = null;\n me._legends = null;\n _get(WxLiner.prototype.__proto__ || Object.getPrototypeOf(WxLiner.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_LINER_ITEM_DEFAULT_CONFIG, me.chartConfig.point));\n me.wxLayout.removeAllBox();\n if (me.wxAnimation) me.wxAnimation.reset();\n return me.draw();\n }\n\n /**\r\n * Draw chart\r\n */\n\n }, {\n key: 'draw',\n value: function draw() {\n var box = void 0,\n me = this,\n animate = me.chartConfig.animate,\n stacked = me.chartConfig.stacked,\n discardNeg = me.chartConfig.discardNeg,\n wxLayout = me.wxLayout;\n var _me$chartConfig = me.chartConfig,\n cutoutPercentage = _me$chartConfig.cutoutPercentage,\n rotation = _me$chartConfig.rotation,\n color = _me$chartConfig.color,\n borderWidth = _me$chartConfig.borderWidth,\n padding = _me$chartConfig.padding;\n\n me.emit('beforeDraw', {\n options: me.chartConfig\n });\n\n // First, we draw title\n box = wxLayout.adjustBox();\n if (me.title) {\n me.title.update(me.titleText, box);\n wxLayout.addBox(me.title.box);\n }\n\n // Second, random color and get legend datasets\n box = wxLayout.adjustBox();\n var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.legends.length }));\n\n me.legends = me.legends.map(function (legend, index) {\n if (!legend.strokeStyle) {\n legend.strokeStyle = me.chartConfig.backgroundColor || legend.borderColor || rColors[index];\n }\n\n return (0, _helper.extend)(true, {\n fillStyle: rColors[index]\n }, WX_LINE_LEGEND_DEFAULT_CONFIG, legend);\n });\n me.legend.update(me.legends, box);\n wxLayout.addBox(me.legend.box);\n\n // Thirdly, draw scale\n me._drawScale();\n\n // Finally, draw line\n var lineConfigs = me.legends.map(function (legend, legendIndex) {\n var config = {\n legend: legend\n };\n var key = legend.key;\n // config.dataset = me.visDatasets.map(data => {return {value: data[key], data: data}});\n config.dataset = me.visDatasets.map(function (data, index) {\n var value = data[key],\n point = void 0;\n\n if (value) {\n var yAxisPoint = void 0,\n xAxisPoint = me.xAxis.getPoint(index);\n if (stacked) {\n if (discardNeg) {\n var _me$_getStackValue = me._getStackValue(index, legendIndex),\n sumPos = _me$_getStackValue.sumPos;\n\n yAxisPoint = value < 0 ? me.yAxis.getPoint(sumPos) : me.yAxis.getPoint(sumPos + value);\n } else {\n yAxisPoint = me._getStackPoint(index, legendIndex);\n }\n } else {\n yAxisPoint = me.yAxis.getPoint(value);\n }\n\n point = {\n x: xAxisPoint.x,\n y: yAxisPoint.y\n };\n }\n\n return { value: value, point: point, data: data, index: index };\n });\n return config;\n });\n\n lineConfigs.reduce(function (pre, curr) {\n me.drawLine(curr, pre, lineConfigs);\n return curr;\n }, null);\n\n if (animate) {\n me.emit('animate', { animation: me.wxAnimation });\n me.wxAnimation.run(true);\n me.wxAnimation.on('done', function () {\n me.emit('draw', {\n options: lineConfigs\n });\n });\n } else {\n me.emit('draw', {\n options: lineConfigs\n });\n }\n // lineConfigs.forEach(line => me._drawLine(line));\n }\n\n /**\r\n * Draw the scale of chart\r\n *\r\n * @private\r\n */\n\n }, {\n key: '_drawScale',\n value: function _drawScale() {\n var box = void 0,\n me = this,\n wxLayout = me.wxLayout;\n\n box = wxLayout.adjustBox();\n var xDatasets = me.xScaleAxisDatas(),\n yDatasets = me.yScaleAxisDatas(box);\n\n var _me$wxCrossScale$draw = me.wxCrossScale.draw(box, xDatasets, yDatasets),\n xBox = _me$wxCrossScale$draw.xBox,\n yBox = _me$wxCrossScale$draw.yBox;\n\n wxLayout.addBox(xBox);\n wxLayout.addBox(yBox);\n }\n\n /**\r\n *\r\n * @param {number} n - The total tick\r\n * @param {number} ln - The space between category x-axis\r\n * @param {number} sp - If has an gap, total gap space space\r\n * @param {number} bp - If has an gap, the gap space before the current point\r\n * @return {number}\r\n * @private\r\n */\n\n /**\r\n * Draw a line\r\n * @param pre\r\n * @param p\r\n * @param next\r\n * @param tension\r\n * @private\r\n */\n\n /**\r\n * Draw a animate line\r\n * @param pre\r\n * @param p\r\n * @param next\r\n * @param pert\r\n * @param curt\r\n * @param tension\r\n * @return {*}\r\n * @private\r\n */\n\n /**\r\n * Return a animate tick func\r\n * @param lineData\r\n * @param preData\r\n * @return {function(*, *, *)|null}\r\n * @private\r\n */\n\n }, {\n key: '_drawLine',\n\n /**\r\n * Draw one line\r\n * @param {Object} lineData - Line dataset\r\n * @param {Object} lineData.legend - Legend's config\r\n * @param {Object[]} lineData[].value - Data of each line point\r\n * @param {Object[]} lineData[].data - The data object\r\n * @param {Object[]} lineData[].point - The point for rending.\r\n * @param {Object} preData - Previous line dataset\r\n * @param {Object} total - All datasets\r\n * @private\r\n *\r\n */\n value: function _drawLine(lineData, preData, total) {\n var _this2 = this;\n\n var me = this,\n ctx = me.ctx;\n var legend = lineData.legend,\n dataset = lineData.dataset;\n var display = legend.display,\n spanGaps = legend.spanGaps,\n tension = legend.tension,\n lineWidth = legend.lineWidth,\n lineJoin = legend.lineJoin,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n var xAxisY = me.xAxis.getPoint(0).y - me.xAxis.config.lineWidth / 2;\n if (!display) {\n return;\n }\n\n ctx.save();\n\n ctx.lineWidth = lineWidth;\n ctx.lineJoin = lineJoin;\n ctx.strokeStyle = strokeStyle;\n ctx.fillStyle = fillStyle;\n // Draw fill area\n if (fillArea) {\n (function () {\n ctx.beginPath();\n\n var firstPoint = void 0,\n currPoint = void 0;\n dataset.forEach(function (d, index) {\n var point = d.point;\n\n if (!!currPoint) {\n if (point) {\n _this2._lineToPoint(currPoint, point, me._getNextPoint(dataset, index, spanGaps), tension);\n } else if (!spanGaps) {\n // Not spanGap, close path and fill\n _this2.__fillInHere(firstPoint, currPoint, xAxisY, fillAlpha);\n // First point reset\n firstPoint = undefined;\n } else {\n // SpanGap, not record this point.\n return;\n }\n } else {\n if (point) {\n //ctx.moveTo(point.x, point.y);\n _this2._lineToPoint(currPoint, point, me._getNextPoint(dataset, index, spanGaps), tension);\n firstPoint = point;\n }\n }\n currPoint = point;\n });\n if (currPoint && firstPoint) {\n _this2.__fillInHere(firstPoint, currPoint, xAxisY, tension, fillAlpha);\n }\n })();\n }\n\n ctx.beginPath();\n\n // Draw line\n var prePoint = void 0,\n pointStack = [];\n dataset.forEach(function (d, index) {\n var value = d.value,\n point = d.point,\n data = d.data;\n var pointBorderColor = data.pointBorderColor,\n pointBorderWidth = data.pointBorderWidth,\n pointRadius = data.pointRadius,\n pointStyle = data.pointStyle,\n label = data.label;\n\n pointStack.push({ point: point, pointBorderColor: pointBorderColor, pointBorderWidth: pointBorderWidth, pointRadius: pointRadius, pointStyle: pointStyle });\n\n if (point) {\n _this2._lineToPoint(prePoint, point, me._getNextPoint(dataset, index, spanGaps), tension);\n //!!currPoint ? ctx.lineTo(point.x, point.y): ctx.moveTo(point.x, point.y);\n // !!currPoint ?\n // lineToPoint(currPoint, point, getNextPoint(dataset, index, spanGaps)):\n // ctx.moveTo(point.x, point.y);\n } else if (spanGaps) {\n // SpanGap, not record this point.\n return;\n }\n prePoint = point;\n });\n ctx.stroke();\n\n // Draw Point\n pointStack.forEach(function (p) {\n var point = p.point,\n pointBorderColor = p.pointBorderColor,\n pointBorderWidth = p.pointBorderWidth,\n pointRadius = p.pointRadius,\n pointStyle = p.pointStyle;\n\n if (!point) {\n return;\n }\n\n ctx.beginPath();\n // TODO: pointStyle NOT IMPLEMENT, Only can render line\n if (pointRadius) {\n ctx.arc(point.x, point.y, pointRadius, 0, 2 * Math.PI);\n ctx.fill();\n }\n\n if (pointBorderWidth) {\n ctx.lineWidth = pointBorderWidth;\n ctx.strokeStyle = pointBorderColor || legend.strokeStyle;\n ctx.stroke();\n }\n });\n\n ctx.draw();\n ctx.restore();\n\n return;\n }\n\n /**\r\n * Draw one line\r\n * @param {Object} lineData - Line dataset\r\n * @param {Object} lineData.legend - Legend's config\r\n * @param {Object[]} lineData[].value - Data of each line point\r\n * @param {Object[]} lineData[].data - The data object\r\n * @param {Object[]} lineData[].point - The point for rending.\r\n * @param {Object} preData - Previous line dataset\r\n * @param {Object} total - All datasets\r\n * @private\r\n *\r\n */\n\n }, {\n key: 'drawLine',\n value: function drawLine(lineData, preData, total) {\n var me = this,\n animate = me.chartConfig.animate,\n animateOpt = me.chartConfig.animateOptions;\n\n if (animate) {\n var actionAnimation = me._getAnimationDrawLine(lineData, preData);\n if (!actionAnimation) {\n return;\n }\n me.wxAnimation.pushActions(actionAnimation);\n me.wxAnimation.pushActions(function (t) {\n if (animateOpt.end === t) {\n me._drawLine(lineData, preData, total);\n }\n });\n } else {\n me._drawLine(lineData, preData, total);\n }\n }\n /**\r\n * Build the yAxis datasets\r\n * @param {BoxInstance} area - The area of chart\r\n */\n\n }, {\n key: 'yScaleAxisDatas',\n value: function yScaleAxisDatas(area) {\n var me = this,\n stacked = me.chartConfig.stacked,\n discardNeg = me.chartConfig.discardNeg,\n ctx = me.ctx;\n var yScaleItemOptions = me.chartConfig.yScaleItemOptions;\n var tickLimits = me.yAxis.calculateTickLimit(area, ctx);\n\n if (stacked) {\n var _me$stackYScaleAxisLi = me.stackYScaleAxisLimit(),\n max = _me$stackYScaleAxisLi.max,\n min = _me$stackYScaleAxisLi.min;\n\n return me.yAxis.buildDatasets(max, min < 0 && discardNeg ? 0 : min, tickLimits, undefined, yScaleItemOptions);\n } else {\n // First, get all available values and calculate the max/min value\n var _visDatasets$reduce = this.visDatasets.reduce(function (pre, cur) {\n var max = pre.max,\n min = pre.min;\n\n if (cur.display) {\n var curValue = me.legends.map(function (legend) {\n if (legend.key) {\n return cur[legend.key] || 0;\n }\n }).concat(max, min);\n max = Math.max.apply(Math, curValue);\n min = Math.min.apply(Math, curValue);\n }\n return { max: max, min: min };\n }, {\n max: 0,\n min: 0\n }),\n _max = _visDatasets$reduce.max,\n _min = _visDatasets$reduce.min;\n\n return me.yAxis.buildDatasets(_max, _min, tickLimits, undefined, yScaleItemOptions);\n }\n }\n\n /**\r\n * Build the xAxis datasets\r\n */\n\n }, {\n key: 'xScaleAxisDatas',\n value: function xScaleAxisDatas() {\n var me = this;\n var xScaleItemOptions = me.chartConfig.xScaleItemOptions;\n var xScaleConfig = me.labels.map(function (label) {\n var item = {\n 'text': label\n };\n if (typeof xScaleItemOptions !== 'undefined') {\n item = (0, _helper.extend)(item, xScaleItemOptions);\n }\n return item;\n });\n\n return me.xAxis.buildDatasets(xScaleConfig);\n }\n }, {\n key: 'labels',\n get: function get() {\n var me = this,\n tmp = void 0;\n if (me._labels) {\n return me._labels;\n } else if (tmp = me.chartConfig.labels) {\n if (_helper.is.Array(tmp)) {\n return tmp;\n }\n }\n me._labels = me.visDatasets.map(function (dataset) {\n return dataset.label;\n });\n return me._labels;\n }\n }, {\n key: 'legends',\n get: function get() {\n var me = this;\n if (!me._legends) {\n me._legends = me._getLegendConfig();\n }\n return me._legends;\n },\n set: function set(value) {\n this._legends = value;\n }\n }]);\n\n return WxLiner;\n }(_wxChart2.default);\n\n var _initialiseProps = function _initialiseProps() {\n var _this3 = this;\n\n this._animateLineTick = function (n, ln) {\n var sp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var bp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n\n return sp ? (n % ln + bp * ln) / (ln * sp) : 0;\n };\n\n this._getCurr = function (dataset, index) {\n if (index > dataset.length - 1) {\n return;\n }\n return dataset[index];\n };\n\n this._getNext = function (dataset, index, spanGaps) {\n // The end\n if (index >= dataset.length - 1) {\n return;\n }\n var nextDate = dataset[index + 1];\n if (!nextDate.point) {\n if (!!spanGaps) return _this3._getNext(dataset, index + 1, spanGaps);else return;\n }\n return nextDate;\n };\n\n this._getNextPoint = function (dataset, index, spanGaps) {\n var next = _this3._getNext(dataset, index, spanGaps);\n return next ? next.point : null;\n };\n\n this._getPre = function (dataset, index, spanGaps) {\n if (index <= 0) {\n return;\n }\n var preDate = dataset[index - 1];\n if (!preDate.point) {\n if (!!spanGaps) return _this3._getPre(dataset, index - 1, spanGaps);else return;\n }\n return preDate;\n };\n\n this._getPrePoint = function (dataset, index, spanGaps) {\n var pre = _this3._getPre(dataset, index, spanGaps);\n return pre ? pre.point : null;\n };\n\n this._lineToPoint = function (pre, p, next, tension) {\n var ctx = _this3.ctx;\n if (!tension || tension === 0) {\n ctx.lineTo(p.x, p.y);\n } else {\n var controlPoints = (0, _helper.splineCurve)(pre, p, next, tension);\n if (!pre) {\n ctx.moveTo(p.x, p.y);\n } else {\n ctx.bezierCurveTo(pre.controlPoints.next.x, pre.controlPoints.next.y, controlPoints.previous.x, controlPoints.previous.y, p.x, p.y);\n }\n p.controlPoints = controlPoints;\n }\n };\n\n this._animateLineToPoint = function (pre, p, next, pert, curt, tension) {\n var ctx = _this3.ctx;\n if (!tension || tension === 0) {\n var x1 = pre.x,\n x2 = p.x,\n y1 = pre.y,\n y2 = p.y;\n var totalPath = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)),\n cosAngle = (x2 - x1) / totalPath,\n sinAngle = (y2 - y1) / totalPath;\n var pointX = x1 + cosAngle * curt,\n pointY = y1 + sinAngle * curt;\n ctx.moveTo(x1, y1);\n ctx.lineTo(pointX, pointY);\n return {\n startPoint: pre,\n endPoint: { x: pointX, y: pointY }\n };\n } else {\n var p0 = void 0,\n p1 = void 0,\n p2 = void 0,\n p3 = void 0,\n controlPoints = (0, _helper.splineCurve)(pre, p, next, tension);\n\n if (pre && p) {\n var bz = new Bezier({ x: pre.x, y: pre.y }, { x: pre.controlPoints.next.x, y: pre.controlPoints.next.y }, { x: controlPoints.previous.x, y: controlPoints.previous.y }, { x: p.x, y: p.y });\n var sbz = bz.split(pert || 0, curt);\n\n p0 = sbz.point(0);p1 = sbz.point(1);p2 = sbz.point(2);p3 = sbz.point(3);\n\n ctx.moveTo(Math.round(p0.x), p0.y);\n ctx.bezierCurveTo(p1.x, p1.y, p2.x, p2.y, Math.round(p3.x), p3.y);\n }\n p.controlPoints = controlPoints;\n return {\n startPoint: p0 ? {\n x: Math.round(p0.x),\n y: p0.y\n } : null,\n endPoint: p3 ? {\n x: Math.round(p3.x),\n y: p3.y\n } : null\n };\n }\n };\n\n this.__fillInHere = function (firstPoint, currPoint, xAxisY, fillAlpha) {\n var ctx = _this3.ctx;\n ctx.lineTo(currPoint.x, xAxisY);\n ctx.lineTo(firstPoint.x, xAxisY);\n\n ctx.globalAlpha = fillAlpha;\n ctx.fill();\n ctx.globalAlpha = 1;\n };\n\n this._getAnimationDrawLine = function (lineData, preData) {\n var me = _this3,\n animate = me.chartConfig.animate,\n animateOpt = me.chartConfig.animateOptions,\n ctx = me.ctx;\n\n var legend = lineData.legend,\n dataset = lineData.dataset;\n var display = legend.display,\n spanGaps = legend.spanGaps,\n tension = legend.tension,\n lineWidth = legend.lineWidth,\n lineJoin = legend.lineJoin,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n // Animation dynamic options\n\n var dataLen = dataset.length,\n categoryTicks = (animateOpt.end - animateOpt.start) / (dataLen - 1);\n\n if (!display) {\n return;\n }\n\n return function (t, lastt, toNext) {\n ctx.save();\n ctx.lineWidth = lineWidth;\n ctx.lineJoin = lineJoin;\n ctx.strokeStyle = strokeStyle;\n ctx.fillStyle = fillStyle;\n\n var dataIndex = !lastt ? 0 // first point\n : Math.floor(t / categoryTicks) + 1;\n var point = void 0,\n drawCurrPoint = void 0,\n index = void 0,\n data = void 0,\n pret = lastt ? lastt.t : 0,\n curt = 0,\n curr = me._getCurr(dataset, dataIndex),\n next = me._getNext(dataset, dataIndex, spanGaps),\n pre = me._getPre(dataset, dataIndex, spanGaps),\n ppPoint = void 0,\n diffIndex = lastt ? dataIndex - lastt.index : 0;\n\n if (curr) {\n drawCurrPoint = curr.point;\n point = curr.point;\n index = curr.index;\n data = curr.data;\n curt = me._animateLineTick(t, categoryTicks, index - (pre ? pre.index : 0), dataIndex - (pre ? pre.index : 0) - 1);\n }\n\n if (pre) {\n ppPoint = me._getPrePoint(dataset, pre.index, spanGaps);\n }\n\n if (!drawCurrPoint && next) {\n drawCurrPoint = next.point;\n index = next.index;\n next = me._getNext(dataset, next.index, spanGaps);\n }\n\n if (diffIndex == 1) {\n // Draw line\n if (pre && pre.point) {\n ctx.beginPath();\n me._animateLineToPoint(ppPoint, pre.point, drawCurrPoint, pret, 1, tension);\n ctx.stroke();\n }\n\n pret = 0;\n }\n\n if (!point && spanGaps || point) {\n // this tick path close\n // Draw line\n\n if (drawCurrPoint) {\n ctx.beginPath();\n me._animateLineToPoint(pre ? pre.point : null, drawCurrPoint, next ? next.point : null, pret, curt, tension);\n ctx.stroke();\n }\n }\n\n if (pret == 0 && pre && pre.point) {\n var _pre$data = pre.data,\n pointBorderColor = _pre$data.pointBorderColor,\n pointBorderWidth = _pre$data.pointBorderWidth,\n pointRadius = _pre$data.pointRadius,\n pointStyle = _pre$data.pointStyle,\n label = _pre$data.label;\n // TODO: pointStyle NOT IMPLEMENT, Only can render line\n\n if (pointRadius) {\n ctx.beginPath();\n ctx.arc(pre.point.x, pre.point.y, pointRadius, 0, 2 * Math.PI);\n ctx.fill();\n }\n\n if (pointBorderWidth) {\n ctx.beginPath();\n ctx.arc(pre.point.x, pre.point.y, pointRadius, 0, 2 * Math.PI);\n ctx.lineWidth = pointBorderWidth;\n ctx.strokeStyle = pointBorderColor || legend.strokeStyle;\n ctx.stroke();\n }\n }\n\n ctx.draw();\n ctx.restore();\n\n return {\n point: point,\n t: curt,\n index: dataIndex,\n diffIndex: diffIndex\n };\n };\n };\n };\n\n exports.default = WxLiner;\n }, { \"../core/animation\": 14, \"../core/layout\": 16, \"../core/legend\": 17, \"../core/scale\": 18, \"../core/title\": 19, \"../scale/scale.category\": 20, \"../scale/scale.crosshelp\": 21, \"../scale/scale.liner\": 22, \"../scale/scale.stackhelp\": 23, \"../util/helper\": 24, \"../util/randomColor\": 26, \"../util/wxCanvas\": 29, \"./wxChart\": 13, \"bezier-js\": 1, \"es6-mixins\": 5 }], 13: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n exports.getChartInstances = getChartInstances;\n\n var _helper = require('../util/helper');\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _layout = require('../core/layout');\n\n var _mitt = require('mitt');\n\n var _mitt2 = _interopRequireDefault(_mitt);\n\n var _es6Mixins = require('es6-mixins');\n\n var _es6Mixins2 = _interopRequireDefault(_es6Mixins);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n // Chart default config\n var wxChartDefaultConfig = {\n fontSize: 10,\n width: 300,\n height: 200,\n display: 'block',\n padding: 0,\n backgroundColor: null\n };\n\n // Store all references of 'WxChart' instances - allowing us to globally resize chart instances on window resize.\n var wxChartInstances = {};\n\n function getChartInstances(id) {\n if (id && id in wxChartInstances) {\n return wxChartInstances[id];\n }\n return null;\n };\n\n // The basic class of WeiXin chart\n\n var WxChart = function () {\n /**\n * @constructor\n * @param {string} id - Canvas id ,DOM ID or HTMLElement\n * @param {Object|number} [config] - The config of Canvas or the width of chart.\n * @param {number} [config.width] - The width of canvas.\n * @param {number} [config.height] - The height of canvas.\n * @param {number} [config.padding] - The padding of canvas.\n * @param {string} [config.display] - The display style of chart.\n */\n function WxChart(id, config) {\n _classCallCheck(this, WxChart);\n\n var me = this;\n\n // Event emitter\n (0, _es6Mixins2.default)([(0, _mitt2.default)()], this, {\n // Mixins will create a new method to nested call all duplicate method\n mergeDuplicates: false\n });\n\n // Arguments parse...\n var chartConf = void 0;\n if (_helper.is.PureObject(config)) {\n chartConf = (0, _helper.extend)({}, wxChartDefaultConfig, config);\n } else if (_helper.is.Number(config) || _helper.is.String(config)) {\n // WxChart(id, width, height, display, ...options)\n chartConf = {\n 'width': arguments[1],\n 'height': 2 in arguments ? arguments[2] : wxChartDefaultConfig.height,\n 'display': 3 in arguments ? arguments[3] : wxChartDefaultConfig.display\n };\n if (4 in arguments && _helper.is.PureObject(arguments[4])) {\n (0, _helper.extend)({}, wxChartDefaultConfig, chartConf, arguments[4]);\n } else {\n (0, _helper.extend)({}, wxChartDefaultConfig, chartConf);\n }\n }\n\n me.canvas = new _wxCanvas2.default(id, chartConf);\n me.ctx = me.canvas.getContext('2d');\n me.isWeiXinAPP = (0, _helper.checkWX)();\n me._id = (0, _helper.uid)();\n\n me.emit('initCanvas', {\n canvas: me.canvas,\n ctx: me.ctx,\n id: me.id + ''\n });\n\n me._config = me.initConfig(chartConf);\n me.initContext();\n\n // Append to wxChartInstances\n wxChartInstances[me.id + ''] = me;\n\n return me;\n }\n\n _createClass(WxChart, [{\n key: 'initConfig',\n value: function initConfig(config) {\n var me = this;\n if (!me.canvas) {\n console.error(\"Failed to create WxChart: can't acquire context!\");\n }\n\n var canvas = me.canvas,\n cvWidth = canvas.width,\n cvHeight = canvas.height;\n config.width = cvWidth;\n config.height = cvHeight;\n config.aspectRatio = config.aspectRatio ? config.aspectRatio : !_helper.is.Undefined(cvHeight) && !_helper.is.Undefined(cvWidth) ? (cvWidth / cvWidth).toFixed(2) : null;\n config.display = config.display || 'block';\n return config;\n }\n }, {\n key: 'initContext',\n value: function initContext() {\n var me = this;\n if (!me.canvas) {\n console.error(\"Failed to create WxChart: can't acquire context!\");\n return me;\n }\n // Set scale of canvas\n (0, _helper.retinaScale)(me.ctx, me.canvas.width, me.canvas.height);\n\n // Set font size\n if (me.config.fontSize) {\n me.ctx.fontSize = me.config.fontSize;\n }\n\n // calculate box\n var padding = me.config.padding || 0;\n me.innerBox = new _layout.BoxInstance('top', 0, 0, me.config.width - padding * 2, me.config.height - padding * 2, me.config.width, me.config.height);\n }\n }, {\n key: 'clear',\n value: function clear() {\n var me = this;\n me.ctx.clearRect(0, 0, me.canvas.width, me.canvas.height);\n if (me.config.backgroundColor) {\n me.ctx.save();\n me.ctx.fillStyle = me.config.backgroundColor;\n me.ctx.fillRect(0, 0, me.canvas.width, me.canvas.height);\n me.ctx.restore();\n me.ctx.draw();\n }\n\n me.emit('clear', {\n canvas: me.canvas\n });\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n var me = this;\n\n me.clear();\n me.canvas.releaseContext();\n\n if (me.id && me.id in wxChartInstances) {\n delete wxChartInstances[me.id];\n }\n\n //me.id = null;\n me.canvas = null;\n me.ctx = null;\n me._config = null;\n me.innerBox = null;\n\n me.emit('destroy');\n }\n }, {\n key: 'draw',\n value: function draw() {\n // Do nothing...\n }\n }, {\n key: 'update',\n value: function update(datasets, defaultItemOpt) {\n var me = this;\n if (_helper.is.Undefined(datasets)) {\n return;\n }\n if (!_helper.is.Array(datasets)) {\n datasets = [datasets];\n }\n\n datasets = datasets.map(function (dataset) {\n return (0, _helper.extend)({}, defaultItemOpt, dataset);\n });\n\n me.emit('update', { datasets: datasets });\n // Fill default Options\n me.clear();\n me._datasets = datasets;\n me._visDatasets = null;\n return me._datasets;\n }\n }, {\n key: 'calculateTotal',\n value: function calculateTotal() {\n var datasets = this.datasets;\n var total = 0;\n var value = void 0;\n\n datasets.forEach(function (dataset, index) {\n value = parseFloat(dataset.value);\n if (!_helper.is.NaN(value) && !dataset.hidden) {\n total += Math.abs(value);\n }\n });\n\n return total;\n }\n }, {\n key: 'id',\n get: function get() {\n return this._id;\n }\n\n // The 'config' property\n\n }, {\n key: 'config',\n get: function get() {\n if (!this._config) {\n this._config = (0, _helper.extend)({}, wxChartDefaultConfig);\n }\n return this._config;\n },\n set: function set(chartConf) {\n var me = this;\n // Update chart config\n me.initConfig(chartConf);\n me.initContext();\n // Clear canvas\n me.clear();\n // Call redraw\n me.draw();\n }\n }, {\n key: 'datasets',\n get: function get() {\n return this._datasets;\n },\n set: function set(datasets) {\n return this.update(datasets);\n }\n\n /**\n * Get visible ticks\n */\n\n }, {\n key: 'visDatasets',\n get: function get() {\n return this._visDatasets ? this._visDatasets : this._visDatasets = this.datasets.filter(function (v) {\n return !!v.display;\n });\n }\n // Can not reset\n\n , set: function set(val) {}\n }]);\n\n return WxChart;\n }();\n\n exports.default = WxChart;\n }, { \"../core/layout\": 16, \"../util/helper\": 24, \"../util/wxCanvas\": 29, \"es6-mixins\": 5, \"mitt\": 7 }], 14: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n exports.wxAnimationActLinker = wxAnimationActLinker;\n\n var _tweezer = require('../util/tweezer');\n\n var _tweezer2 = _interopRequireDefault(_tweezer);\n\n var _ez = require('ez.js');\n\n var ez = _interopRequireWildcard(_ez);\n\n var _helper = require('../util/helper');\n\n var _mitt = require('mitt');\n\n var _mitt2 = _interopRequireDefault(_mitt);\n\n var _es6Mixins = require('es6-mixins');\n\n var _es6Mixins2 = _interopRequireDefault(_es6Mixins);\n\n function _interopRequireWildcard(obj) {\n if (obj && obj.__esModule) {\n return obj;\n } else {\n var newObj = {};if (obj != null) {\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n }\n }newObj.default = obj;return newObj;\n }\n }\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function wxAnimationActLinker() {\n var actions = [],\n globals = {};\n return function (action) {\n var _arguments = arguments;\n\n for (var _len = arguments.length, options = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n options[_key - 1] = arguments[_key];\n }\n\n var me = this;\n if (me instanceof WxAnimation) {\n // Run all actions in WxAnimation call\n var ret = void 0;\n actions.forEach(function (action) {\n ret = action.apply(me, _arguments);\n });\n return ret;\n } else {\n // Just push action\n actions.push(action);\n return actions;\n }\n };\n }\n\n var WxAnimation = function () {\n\n /**\r\n * WxAnimation initial\r\n *\r\n * @param {Object} options - Animation options\r\n * @param {number} options.start - The start value\r\n * @param {number} options.end - The end value\r\n * @param {Object} [options.duration=1000] - The total seconds of animation\r\n * @param {Object} [options.easeType=easeInOut] - Easing type, please see [ez.js](https://github.com/jaxgeller/ez.js/blob/master/ez.js) for more information\r\n * @constructor\r\n */\n\n // The error in actions\n\n\n // The animate has started or not\n\n // Tweenzer instance\n function WxAnimation(options) {\n var _this = this;\n\n _classCallCheck(this, WxAnimation);\n\n this.currentActionIndex = 0;\n\n this.handOverAction = function () {\n _this.currentActionIndex++;\n };\n\n this.stop = function () {\n _this.currentActionIndex = 0;\n _this.tweenzerHandler.stop();\n _this.started = false;\n _this.emit('stop');\n };\n\n this.reset = function () {\n _this.currentActionIndex = 0;\n _this.tweenzerHandler.stop().off('tick').off('done');\n _this.started = false;\n _this.resetActions();\n _this.emit('reset');\n };\n\n var easeFun = ez.easeInOutQuad;\n if (options.easeType) {\n if (typeof ez[options.easeType] != 'undefined') {\n easeFun = ez[options.easeType];\n }\n }\n\n this.tweenzerHandler = new _tweezer2.default((0, _helper.extend)({ easing: easeFun }, options));\n\n this.actions = [];\n\n var mit = (0, _mitt2.default)();\n (0, _es6Mixins2.default)([mit], this, {\n // Mixins will create a new method to nested call all duplicate method\n mergeDuplicates: false\n });\n }\n\n /**\r\n * Push an action to\r\n * @param {WxAnimation~action|wxAnimationActLinker} action\r\n * @return {number} - The index of action\r\n */\n\n // The current handler action\n\n\n /**\r\n * A action callback\r\n * @callback WxAnimation~action\r\n * @param {number} value - The value of this tick\r\n * @param {Object} preRet - The last tick's return value\r\n * @param {Promise} toNext - Hand over next action\r\n * @param {function} nextAction - Next action or Null\r\n *\r\n * @description\r\n * Every action is a callback to deal one or more ticks\r\n * Several parameters will pass to. The first is value of this tick; Another is an function can hand over the executive authority to next action.\r\n */\n\n _createClass(WxAnimation, [{\n key: 'pushActions',\n value: function pushActions(action) {\n if (!_helper.is.Function(action)) {\n throw new Error(\"Should pass to an `action` callback function\");\n }\n return this.actions.push(action);\n }\n\n /**\r\n * Reset actions\r\n */\n\n }, {\n key: 'resetActions',\n value: function resetActions() {\n this.actions = [];\n }\n }, {\n key: 'runTick',\n value: function runTick(value, preRet) {\n var me = this,\n caindex = me.currentActionIndex || 0;\n if (caindex >= me.actions.length) {\n return;\n }\n\n var ret = void 0,\n action = me.actions[caindex],\n nextAction = caindex + 1 <= me.actions.length ? me.actions[caindex + 1] : null;\n // try {\n me.emit('tick', { value: value, preRet: preRet, toNext: me.handOverAction, nextAction: nextAction, parallel: false });\n ret = action.apply(me, [value, preRet, me.handOverAction, nextAction]);\n // } catch (e) {\n // me.error = `${e.name} : ${e.message}`;\n // // Catch an error.\n // // Stop all actions\n // me.started = false;\n // me.currentActionIndex = 0;\n // me.tweenzerHandler.stop();\n // me.emit('error', {error: me.error});\n // }\n return ret;\n }\n }, {\n key: 'runTickParallel',\n value: function runTickParallel(value) {\n var tickRet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n var me = this,\n actions = me.actions,\n actionsLen = me.actions.length;\n\n // try {\n actions.forEach(function (action, index) {\n var preRet = tickRet ? tickRet[index] : null,\n toNext = function toNext() {},\n nextAction = index + 1 < actionsLen ? actions[index + 1] : null;\n me.emit('tick', { value: value, preRet: preRet, toNext: toNext, nextAction: nextAction, parallel: true });\n var ret = action.apply(me, [value, preRet, toNext, nextAction]);\n tickRet[index] = ret;\n });\n // } catch (e) {\n // me.error = `${e.name} : ${e.message}`;\n // // Catch an error.\n // // Stop all actions\n // me.started = false;\n // me.tweenzerHandler.stop();\n // me.emit('error', {error: me.error});\n // }\n return tickRet;\n }\n }, {\n key: 'tick',\n value: function tick(parallel) {\n var me = this,\n rets = undefined;\n return function (v) {\n if (parallel) rets = me.runTickParallel(v, rets);else rets = me.runTick(v, rets);\n };\n }\n /**\r\n * Run actions\r\n *\r\n * @param {Boolean} parallel - parallel to exec all actions\r\n */\n\n }, {\n key: 'run',\n value: function run() {\n var parallel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var me = this;\n me.emit('start', { parallel: parallel });\n me.started = true;\n\n me.tweenzerHandler.on('tick', me.tick(parallel)).on('done', function () {\n me.currentActionIndex = 0;\n me.started = false;\n me.emit('done', { parallel: parallel });\n }).begin();\n }\n }]);\n\n return WxAnimation;\n }();\n\n exports.default = WxAnimation;\n }, { \"../util/helper\": 24, \"../util/tweezer\": 28, \"es6-mixins\": 5, \"ez.js\": 6, \"mitt\": 7 }], 15: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _helper = require('../util/helper');\n\n var _layout = require('./layout');\n\n var _wxChart = require('../charts/wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n // The basic component\n var WxBaseComponent = function () {\n function WxBaseComponent(wxChart, config) {\n _classCallCheck(this, WxBaseComponent);\n\n var me = this;\n\n if (!wxChart || !wxChart instanceof _wxChart2.default) {\n throw new Error('Should be an WxChart instance');\n }\n me.wxChart = wxChart;\n\n // scale set options\n this._datasets = [];\n\n return me;\n }\n\n /**\n * Initialize datasets and options\n * @param {Object[]} datasets\n * @param {Object} [defaultOptions]\n * @returns {Array|*}\n */\n\n _createClass(WxBaseComponent, [{\n key: 'init',\n value: function init(datasets) {\n var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var me = this;\n\n if (_helper.is.Undefined(datasets) || _helper.is.Null(datasets)) {\n datasets = me.datasets;\n if (!datasets) {\n throw new Error('Datasets is null');\n }\n }\n\n if (!_helper.is.Array(datasets)) {\n datasets = [datasets];\n }\n\n datasets = datasets.map(function (dataset) {\n return (0, _helper.extend)({}, defaultOptions, dataset);\n });\n\n me._datasets = datasets;\n me._visDatasets = null;\n return me._datasets;\n }\n\n /**\n * Update data and re-draw\n * @param {Object[]} datasets\n * @param {BoxInstance} [area]\n * @param {Object} [config]\n */\n\n }, {\n key: 'update',\n value: function update(datasets, area) {\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this;\n\n me.clear();\n if (!datasets) {\n return;\n }\n datasets = me.init(datasets);\n\n if (area && area instanceof _layout.BoxInstance) {\n area = me.box = me.calculateBox(area, datasets, config);\n } else if (me.box) {\n area = me.box;\n } else {\n return;\n }\n\n if (me.isVisiable()) {\n me.draw(datasets, area, config);\n }\n }\n\n /**\n * Calculate occupied space\n * @param {Object[]} [datasets] - datasets\n * @param {BoxInstance} [area] - Current box area\n * @param {Object} [config]\n * @returns {BoxInstance}\n */\n\n }, {\n key: 'calculateBox',\n value: function calculateBox(area) {\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n return area;\n }\n\n /**\n * Set an occupied space for component\n * @param {BoxInstance} box - New box\n * @param {Boolean} [redraw=true] - Re-draw the component\n */\n\n }, {\n key: 'setBox',\n value: function setBox(box) {\n var redraw = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var me = this;\n if (redraw) {\n me.clear();\n }\n if (box && box instanceof _layout.BoxInstance) {\n me.box = box;\n }\n if (redraw && me.isVisiable()) {\n me.draw();\n }\n }\n\n /**\n * Draw the component\n *\n * @param {Object[]} [datasets] - datasets\n * @param {BoxInstance} [box] - Current box area\n * @param {Object} [config]\n */\n\n }, {\n key: 'draw',\n value: function draw() {\n var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;\n var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n }\n /**\n * Clear canvas in component's box\n */\n\n }, {\n key: 'clear',\n value: function clear() {\n var me = this;\n if (me.box) {\n me.wxChart.ctx.clearRect(me.box.x, me.box.y, me.box.outerWidth, me.box.outerHeight);\n me.wxChart.ctx.draw();\n }\n }\n }, {\n key: 'isVisiable',\n value: function isVisiable() {\n return !!this.config.display;\n }\n }, {\n key: 'isHorizontal',\n value: function isHorizontal() {\n return this.position == 'top' || this.position == 'bottom';\n }\n }, {\n key: 'datasets',\n get: function get() {\n return this._datasets;\n },\n set: function set(datasets) {\n return this.update(datasets);\n }\n\n /**\n * Get visible ticks\n */\n\n }, {\n key: 'visDatasets',\n get: function get() {\n return this._visDatasets ? this._visDatasets : this._visDatasets = this.datasets.filter(function (v) {\n return !!v.display;\n });\n }\n // Can not reset\n\n , set: function set(val) {}\n }, {\n key: 'position',\n get: function get() {\n return this.config.position;\n },\n set: function set(value) {\n this.config.position = value;\n return this.update();\n }\n }]);\n\n return WxBaseComponent;\n }();\n\n exports.default = WxBaseComponent;\n }, { \"../charts/wxChart\": 13, \"../util/helper\": 24, \"../util/wxCanvas\": 29, \"./layout\": 16 }], 16: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.BoxInstance = undefined;\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _base = require('./base');\n\n var _base2 = _interopRequireDefault(_base);\n\n var _helper = require('../util/helper');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n /**\n * A box model description\n * @typedef {Object} BoxInstance\n * @property {number} x - The x point.\n * @property {number} y - The y point.\n * @property {number} width - Inner width (context only, not calculate padding and margin)\n * @property {number} height - Inner height (context only, not calculate padding and margin)\n * @property {number} outerWidth - Outer width\n * @property {number} outerHeight - Outer height\n *\n * @description\n * (x,y) -------------------------- (ex, y)\n * | |\n * | (lx,ly)-------------(rx,ly) |\n * | | | |\n * | | | |\n * | (lx,ry)-------------(rx,ry) |\n * | |\n * (x,ey) ------------------------- (ex, ey)\n */\n var BoxInstance = exports.BoxInstance = function () {\n function BoxInstance(position, x, y, width, height, outerWidth, outerHeight) {\n _classCallCheck(this, BoxInstance);\n\n var me = this;\n if (_helper.is.PureObject(position)) {\n var opt = position;\n\n position = opt.position;\n x = opt.x;\n y = opt.y;\n width = opt.width;\n height = opt.height;\n\n var padding = opt.padding,\n margin = opt.margin;\n if (_helper.is.Number(padding) && _helper.is.Number(margin)) {\n outerWidth = width + padding * 2 + margin * 2;\n outerHeight = height + padding * 2 + margin * 2;\n } else {\n outerWidth = opt.outerWidth;\n outerHeight = opt.outerHeight;\n }\n }\n\n me.position = position;\n me.width = width;\n me.height = height;\n me.outerWidth = outerWidth;\n me.outerHeight = outerHeight;\n\n Object.defineProperty(this, 'x', {\n get: function get() {\n return x;\n },\n set: function set(value) {\n me.width += x - value;\n me.outerWidth += x - value;\n x = value;\n }\n });\n\n Object.defineProperty(this, 'y', {\n get: function get() {\n return y;\n },\n set: function set(value) {\n me.height += y - value;\n me.outerHeight += y - value;\n y = value;\n }\n });\n }\n\n /**\n * The x,y in right-bottom\n */\n\n _createClass(BoxInstance, [{\n key: 'clone',\n\n /**\n * Clone this box and return an new Instance\n * @returns {BoxInstance}\n */\n value: function clone() {\n var me = this;\n return new BoxInstance(me.position, me.x, me.y, me.width, me.height, me.outerWidth, me.outerHeight);\n }\n\n /**\n * Check whether intersect with other BoxInstance\n */\n\n }, {\n key: 'isIntersect',\n value: function isIntersect(boxInstance) {\n var me = this;\n return !(me.ex < boxInstance.x || me.x > boxInstance.ex || me.ey < boxInstance.y || me.y < boxInstance.ey);\n }\n }, {\n key: 'toObject',\n value: function toObject() {\n return {\n position: this.position,\n x: this.x,\n y: this.y,\n ex: this.ex,\n ey: this.ey,\n lx: this.lx,\n ly: this.ly,\n rx: this.rx,\n ry: this.ry,\n width: this.width,\n height: this.height,\n outerHeight: this.outerHeight,\n outerWidth: this.outerWidth\n };\n }\n }, {\n key: 'ex',\n get: function get() {\n return this.x + this.outerWidth;\n }\n }, {\n key: 'ey',\n get: function get() {\n return this.y + this.outerHeight;\n }\n /**\n * The x,y in content\n */\n\n }, {\n key: 'lx',\n get: function get() {\n return this.x + this.marginLR;\n }\n }, {\n key: 'ly',\n get: function get() {\n return this.y + this.marginTB;\n }\n }, {\n key: 'rx',\n get: function get() {\n return this.x + this.width + this.marginLR;\n }\n }, {\n key: 'ry',\n get: function get() {\n return this.y + this.height + this.marginTB;\n }\n }, {\n key: 'marginLR',\n get: function get() {\n return (this.outerWidth - this.width) / 2;\n },\n set: function set(value) {\n if (_helper.is.Number(value)) {\n this.width -= value * 2;\n }\n }\n }, {\n key: 'marginTB',\n get: function get() {\n return (this.outerHeight - this.height) / 2;\n },\n set: function set(value) {\n if (_helper.is.Number(value)) {\n this.height -= value * 2;\n }\n }\n }]);\n\n return BoxInstance;\n }();\n /**\n * @class WxLayout\n * Find the best box area of items\n */\n\n var WxLayout = function () {\n function WxLayout(wxChart) {\n _classCallCheck(this, WxLayout);\n\n var me = this;\n\n if (!wxChart || !wxChart instanceof _base2.default) {\n throw new Error('Should be an WxChart instance');\n }\n me.wxChart = wxChart;\n //me.initBox = wx.wxChart.innerBox.clone();\n me._boxs = [];\n }\n\n /**\n * Add an boxInstance\n * @param {BoxInstance} boxInstance\n * @returns {number} The box id\n */\n\n _createClass(WxLayout, [{\n key: 'addBox',\n value: function addBox(boxInstance) {\n var me = this;\n if (!boxInstance instanceof BoxInstance) {\n throw new Error('Please add an BoxInstance Object');\n }\n return parseInt(me._boxs.push(boxInstance)) - 1;\n }\n\n /**\n * Remove an boxInstance\n * @param {(BoxInstance|number)} boxId - The box id\n */\n\n }, {\n key: 'removeBox',\n value: function removeBox(boxId) {\n var me = this;\n if (_helper.is.Number(boxId)) {\n me._boxs.splice(boxId, 1);\n } else if (boxId instanceof BoxInstance) {\n me._boxs.splice(me._boxs.indexOf(boxId), 1);\n }\n }\n }, {\n key: 'removeAllBox',\n value: function removeAllBox() {\n this._boxs = [];\n }\n }, {\n key: 'adjustBox',\n value: function adjustBox() {\n var me = this;\n var box = me.wxChart.innerBox.clone();\n me._boxs.forEach(function (boxInstance) {\n var position = boxInstance.position,\n x = boxInstance.x,\n y = boxInstance.y,\n height = boxInstance.height,\n width = boxInstance.width,\n outerWidth = boxInstance.outerWidth,\n outerHeight = boxInstance.outerHeight;\n\n switch (position) {\n case 'top':\n box.y += outerHeight;\n break;\n case 'bottom':\n box.outerHeight -= outerHeight;\n box.height -= outerHeight;\n break;\n case 'left':\n box.x += outerWidth;\n break;\n case 'right':\n box.outerWidth -= outerWidth;\n box.width -= outerWidth;\n break;\n }\n });\n return box;\n }\n }]);\n\n return WxLayout;\n }();\n\n exports.default = WxLayout;\n }, { \"../util/helper\": 24, \"./base\": 15 }], 17: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n return typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n };\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _base = require('./base');\n\n var _base2 = _interopRequireDefault(_base);\n\n var _helper = require('../util/helper');\n\n var _layout = require('./layout');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Legend default config\n var WX_LEGEND_DEFAULT_CONFIG = {\n display: true,\n /**\n * position can set to :top, bottom, left(same as left bottom), right(same as right bottom), left top, left bottom, right top, right bottom\n */\n position: 'top',\n fullWidth: true, // if the fullWidth is false, the 'width' property should be existed.\n labels: {\n boxWidth: 30,\n fontSize: 11,\n padding: 10 // Padding width between legend items\n }\n };\n\n //\n // The datasets is an empty array at the first time\n // When you set 'data' attribute, the legend items will draw on Canvas\n // Format\n // {\n // text: 'Displayed Text String',\n // fillAlpha: 1, // Global fill alpha\n // fillStyle: 'Color', // Fill style of the legend box\n // display: Boolean, // If true, this item represents a hidden datasets. Label will be rendered with a strike-through effect,\n // strokeStyle: 'Color'\n // lineCap: String,\n // lineJoin: String,\n // lineWidth: Number\n // }\n var WX_LEGEND_DEFAULT_ITEM_CONFIG = {\n 'lineWidth': 1,\n 'display': true\n };\n\n var WxLegend = function (_WxBaseComponent) {\n _inherits(WxLegend, _WxBaseComponent);\n\n function WxLegend(wxChart, config) {\n _classCallCheck(this, WxLegend);\n\n var _this = _possibleConstructorReturn(this, (WxLegend.__proto__ || Object.getPrototypeOf(WxLegend)).call(this, wxChart, config));\n\n _this.config = (0, _helper.extend)(true, {}, WX_LEGEND_DEFAULT_CONFIG, config);\n return _this;\n }\n\n _createClass(WxLegend, [{\n key: 'init',\n value: function init(datasets) {\n var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : WX_LEGEND_DEFAULT_ITEM_CONFIG;\n\n var me = this;\n var config = me.config;\n\n datasets = _get(WxLegend.prototype.__proto__ || Object.getPrototypeOf(WxLegend.prototype), 'init', this).call(this, datasets, defaultOptions);\n // Reset legendBox\n // Calculate the legend items\n datasets = me.calculateLegendItem(datasets, config);\n\n me._datasets = datasets;\n\n return datasets;\n }\n }, {\n key: 'calculateLegendItem',\n value: function calculateLegendItem(datasets, config) {\n var me = this;\n var labelsConfig = config.labels || {};\n\n var ctx = me.wxChart.ctx;\n var boxWidth = labelsConfig.boxWidth;\n var fontSize = labelsConfig.fontSize;\n if (!_helper.is.Array(datasets) && _helper.is.PureObject(datasets)) {\n datasets = [datasets];\n }\n\n datasets = datasets.map(function (dataset) {\n var textWidth = ctx.measureText(dataset.text).width;\n\n var width = boxWidth + fontSize / 2 + textWidth;\n dataset._prop = {\n 'fontSize': fontSize,\n 'boxHeight': fontSize,\n 'boxWidth': boxWidth,\n 'textWidth': textWidth,\n 'width': width\n };\n return dataset;\n });\n\n return datasets;\n }\n }, {\n key: 'calculateBox',\n value: function calculateBox(area) {\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this;\n var outerWidth = void 0,\n outerHeight = void 0,\n width = void 0,\n height = void 0;\n var wxChart = me.wxChart,\n ctx = wxChart.ctx,\n fontSize = ctx.fontSize;\n var x = area.x,\n y = area.y;\n var padding = config.labels.padding || 10;\n\n if (me.isHorizontal()) {\n (function () {\n width = !!config.fullWidth ? area.width - padding * 2 : config.width;\n outerWidth = !!config.fullWidth ? area.width : config.width;\n height = fontSize;\n outerHeight = height + padding * 2;\n\n // Calculate all items\n var lineNum = 0,\n currentLineWidth = 0,\n maxLineWidth = 0;\n datasets.forEach(function (dataset) {\n var prop = dataset._prop,\n outerWidth = prop.width + padding;\n var lineWidth = currentLineWidth + outerWidth;\n if (lineWidth > width) {\n // The previous line width\n maxLineWidth = maxLineWidth < currentLineWidth ? currentLineWidth : maxLineWidth;\n // We should take a new line\n lineNum++;\n // Set currentLineWidth = 0\n currentLineWidth = outerWidth;\n\n // The first item width insufficient..\n if (outerWidth > width) {\n // The width options is tooooo small!\n console.warn('The width options is too small! width=', width, '.The chart will set to ', lineWidth);\n width = outerWidth;\n }\n } else {\n currentLineWidth += outerWidth;\n }\n\n prop.padding = padding;\n prop.lineNum = lineNum;\n prop.outerWidth = outerWidth;\n });\n maxLineWidth = maxLineWidth < currentLineWidth ? currentLineWidth : maxLineWidth;\n\n // Re calculate the height of legend\n if (lineNum > 0) {\n height = fontSize * (lineNum + 1) + lineNum * fontSize / 2;\n outerHeight = height + padding * 2;\n }\n\n x += (width - maxLineWidth) / 2;\n if (me.position == 'bottom') {\n y = area.ry - outerHeight;\n y = y < area.y ? area.y : y;\n }\n })();\n } else {\n var _ret2 = function () {\n var position = me.position.match(/left/) ? 'left' : 'right';\n var align = me.position.match(/top/) ? 'top' : 'bottom';\n var width = 0,\n lineNum = 0;\n datasets.forEach(function (dataset) {\n var wh = dataset._prop.width;\n width = width < wh ? wh : width;\n\n dataset._prop.padding = padding;\n dataset._prop.lineNum = lineNum;\n // not use to set prop.outerWidth\n dataset._prop.outerWidth = null;\n lineNum++;\n });\n outerWidth = width + padding * 2;\n height = fontSize * (lineNum + 1) + lineNum * padding / 2;\n outerHeight = height + padding * 2;\n\n if (align == 'bottom') {\n y = area.ry - outerHeight;\n y = y < area.y ? area.y : y;\n }\n if (position == 'right') {\n x = area.rx - outerWidth;\n x = x < 0 ? 0 : x;\n }\n return {\n v: new _layout.BoxInstance({\n position: position,\n x: x,\n y: y,\n width: width,\n outerWidth: outerWidth,\n height: height,\n outerHeight: outerHeight\n })\n };\n }();\n\n if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n }\n\n return new _layout.BoxInstance({\n position: config.position,\n x: x,\n y: y,\n width: width,\n outerWidth: outerWidth,\n height: height,\n outerHeight: outerHeight\n });\n }\n }, {\n key: 'draw',\n value: function draw() {\n var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;\n var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var x = box.x,\n y = box.y,\n width = box.width,\n outerWidth = box.outerWidth,\n height = box.height,\n outerHeight = box.outerHeight;\n\n // Clear the area of legend\n\n me.clear();\n\n // Begin a new sub-context\n ctx.save();\n // Draw all items\n var currentLineNum = -1;\n var currentX = x,\n currentY = y;\n datasets.forEach(function (dataset) {\n var text = dataset.text,\n display = dataset.display,\n fillStyle = dataset.fillStyle,\n fillAlpha = dataset.fillAlpha,\n strokeStyle = dataset.strokeStyle,\n lineCap = dataset.lineCap,\n lineJoin = dataset.lineJoin,\n lineWidth = dataset.lineWidth;\n var _dataset$_prop = dataset._prop,\n width = _dataset$_prop.width,\n fontSize = _dataset$_prop.fontSize,\n textWidth = _dataset$_prop.textWidth,\n padding = _dataset$_prop.padding,\n lineNum = _dataset$_prop.lineNum,\n boxWidth = _dataset$_prop.boxWidth,\n boxHeight = _dataset$_prop.boxHeight,\n outerWidth = _dataset$_prop.outerWidth;\n\n if (!width) {\n // No need to draw\n return;\n }\n\n // Set style\n ctx.textBaseline = 'top';\n ctx.textAlign = 'start';\n ctx.fillStyle = fillStyle;\n ctx.fontSize = fontSize;\n ctx.strokeStyle = strokeStyle;\n ctx.lineCap = lineCap;\n ctx.lineJoin = lineJoin;\n ctx.lineWidth = lineWidth;\n\n if (currentLineNum < lineNum) {\n currentLineNum = lineNum;\n currentX = x + padding;\n currentY = y + lineNum * fontSize * 1.5 + padding;\n }\n var thisX = currentX;\n // draw rect\n if (ctx.lineWidth != 0) {\n ctx.strokeRect(currentX, currentY, boxWidth, boxHeight);\n }\n ctx.globalAlpha = fillAlpha;\n ctx.fillRect(currentX, currentY, boxWidth, boxHeight);\n ctx.globalAlpha = 1;\n\n // draw text\n currentX += boxWidth + fontSize / 2;\n ctx.fillText(text, currentX, currentY);\n\n // draw hidden strike through\n if (!display) {\n ctx.save();\n // Strike through the text if hidden\n ctx.beginPath();\n ctx.lineWidth = 1;\n ctx.moveTo(currentX, currentY + fontSize / 2);\n ctx.lineTo(currentX + textWidth, currentY + fontSize / 2);\n ctx.stroke();\n ctx.restore();\n }\n\n currentX = thisX + outerWidth;\n });\n ctx.restore();\n\n ctx.draw();\n }\n }]);\n\n return WxLegend;\n }(_base2.default);\n\n exports.default = WxLegend;\n }, { \"../util/helper\": 24, \"./base\": 15, \"./layout\": 16 }], 18: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _helper = require('../util/helper');\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _layout = require('./layout');\n\n var _base = require('./base');\n\n var _base2 = _interopRequireDefault(_base);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Scale default config\n var WX_SCALE_DEFAULT_CONFIG = {\n display: true,\n position: 'top', // left, bottom, right, top\n extendLeft: 0,\n extendTop: 0,\n title: undefined,\n titleFontSize: 12,\n titleFontColor: '#4c4d4d',\n //'lineSpace' = fontSize * 0.5'\n color: '#000000', // Line color\n lineWidth: 1,\n\n gridLines: {\n display: true,\n color: '#e0e0e0', // Line color\n lineWidth: 1\n },\n\n ticks: {\n display: true,\n autoSkip: true,\n lineWidth: 1,\n fontColor: '#000000',\n fontSize: 11,\n minRotation: 0,\n maxRotation: 90\n\n //maxTicksLimit: null,\n }\n };\n\n var WX_SCALE_DEFAULT_ITEM_CONFIG = {\n display: true,\n // text: '',\n lineWidth: 1,\n fontColor: '#000000'\n };\n\n // The WeinXin APP scale\n\n var WxScale = function (_WxBaseComponent) {\n _inherits(WxScale, _WxBaseComponent);\n\n function WxScale(wxChart, config) {\n _classCallCheck(this, WxScale);\n\n var _this = _possibleConstructorReturn(this, (WxScale.__proto__ || Object.getPrototypeOf(WxScale)).call(this, wxChart, config));\n\n _this.config = (0, _helper.extend)(true, {}, WX_SCALE_DEFAULT_CONFIG, config);\n return _this;\n }\n\n /**\n * Get visible tick's text data\n */\n\n _createClass(WxScale, [{\n key: 'getTicksText',\n value: function getTicksText(tick) {\n if (!!tick && !!tick.text) {\n return tick.format ? tick.format.call(tick, tick.text, tick) : tick.text;\n }\n return null;\n }\n\n /**\n * Get lineSpace\n * @returns {*|number}\n */\n\n }, {\n key: 'longestText',\n\n /**\n * Get longest text\n */\n value: function longestText() {\n var ctx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.wxChart.ctx;\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;\n\n var me = this;\n var maxTextLen = 0;\n datasets.forEach(function (dataset) {\n if (!!dataset.display) {\n var textWidth = void 0;\n if (dataset.textWidth) {\n textWidth = dataset.textWidth;\n } else {\n var text = me.getTicksText(dataset);\n textWidth = ctx.measureText(text).width;\n dataset.textWidth = textWidth;\n }\n maxTextLen = maxTextLen < textWidth ? textWidth : maxTextLen;\n }\n });\n return maxTextLen;\n }\n }, {\n key: 'calculateFixPadding',\n value: function calculateFixPadding(datasets, config) {\n var me = this,\n ctx = me.wxChart.ctx;\n if (config.fixPadding) {\n return config.fixPadding;\n }\n if (me.isHorizontal()) {\n var visTicks = me.visDatasets;\n var firstTickText = me.getTicksText(visTicks[0]),\n lastTickText = me.getTicksText(visTicks[visTicks.length - 1]);\n return Math.max(ctx.measureText(firstTickText).width, ctx.measureText(lastTickText).width);\n } else {\n return ctx.fontSize;\n }\n }\n }, {\n key: 'init',\n value: function init(datasets) {\n var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : WX_SCALE_DEFAULT_ITEM_CONFIG;\n\n var me = this;\n var config = me.config;\n\n datasets = _get(WxScale.prototype.__proto__ || Object.getPrototypeOf(WxScale.prototype), 'init', this).call(this, datasets, defaultOptions);\n me.visDatasets = null;\n me._datasets = datasets;\n me.fixPadding = me.calculateFixPadding(datasets, config);\n\n return datasets;\n }\n }, {\n key: 'calculateBox',\n value: function calculateBox(area) {\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var fontSize = ctx.fontSize;\n var tickWidth = me.calculateTickWidth(datasets, area, config);\n var x = void 0,\n y = void 0,\n minWidth = void 0,\n minHeight = void 0,\n maxWidth = void 0,\n maxHeight = void 0;\n var minFontRotation = (0, _helper.toRadians)(config.ticks.minRotation || 0),\n maxFontRotation = (0, _helper.toRadians)(config.ticks.maxRotation || 90),\n fontRadians = minFontRotation;\n var lineSpace = me.lineSpace;\n var lineWidth = 1;\n\n var longestText = me.longestText();\n if (me.isHorizontal()) {\n if (longestText > tickWidth) {\n // Ticket's width not satisfied with the longest text's width\n if (tickWidth <= ctx.fontSize) {\n fontRadians = maxFontRotation;\n } else {\n fontRadians = Math.acos(tickWidth / longestText);\n minHeight = Math.sin(fontRadians) * longestText + lineWidth + lineSpace + fontSize / 2;\n if (minHeight > area.height) {\n minHeight = area.height;\n fontRadians = Math.asin((minHeight - lineWidth - lineSpace - fontSize / 2) / longestText);\n } else if (fontRadians > maxFontRotation) {\n fontRadians = maxFontRotation;\n minHeight = Math.sin(fontRadians) * longestText + lineWidth + lineSpace + fontSize / 2;\n }\n }\n } else {\n minHeight = fontSize * 1.5 + lineWidth + lineSpace;\n }\n minWidth = area.width;\n maxWidth = area.outerWidth;\n maxHeight = minHeight;\n } else {\n var titleWidth = 0;\n if (config.title) {\n titleWidth = ctx.measureText(config.title, config.titleFontSize).width - lineWidth - lineSpace - fontSize / 2;\n }\n minWidth = longestText + lineWidth + lineSpace + fontSize / 2;\n minWidth = minWidth > titleWidth ? minWidth : titleWidth;\n if (minWidth > area.width) {\n minWidth = area.width;\n fontRadians = Math.acos((minWidth - lineWidth - lineSpace - fontSize / 2) / longestText);\n fontRadians = fontRadians > maxFontRotation ? maxFontRotation : fontRadians;\n }\n minHeight = area.height;\n maxWidth = minWidth;\n maxHeight = area.outerHeight;\n }\n switch (me.position) {\n case 'left':\n case 'top':\n x = area.x;\n y = area.y;\n break;\n case 'right':\n x = area.x + area.width - maxWidth;\n y = area.y;\n break;\n case 'bottom':\n x = area.x;\n y = area.y + area.height - maxHeight;\n break;\n }\n\n me.fontRadians = fontRadians;\n return new _layout.BoxInstance(me.position, x, y, minWidth, minHeight, maxWidth, maxHeight);\n }\n }, {\n key: 'calculateTickWidth',\n\n /**\n * Calculate ticks' separation distance\n * @param {BoxInstance} [area=this.box]\n *\n *\n * Horizontal Scale:\n * x------------------------------------.--x(first tick)--------------------------.--x(last tick)--margin--x\n * x------------------------------------.--x(first tick)-----x(last tick)--margin-.--x--titleWidth+padding--\n * |---extendLeft---|(box.x)---margin---|-----------area.width----------------------|---------margin------|\n * |----------------------------area box-------------------------------------------------|\n * Vertical Scale:\n * x----------------------------------------.--x--------(first tick)----------.--x(last tick)-x\n * x------------------titleHeight+padding---.--x---margin-x-------(first tick).--x(last tick)-x\n * |---extendTop----|(box.y)---margin-------|-----------area.height--------------|---margin---|\n * |----------------------------area box-------------------------------------|\n */\n value: function calculateTickWidth() {\n var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;\n var area = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ticketWidth = void 0;\n var visTicks = me.visDatasets;\n var defaultLineWidth = config.ticks.lineWidth;\n // total line width\n var totalLineWidth = _helper.sum.apply(null, visTicks.map(function (v) {\n return v.lineWidth || defaultLineWidth;\n }));\n var fixPadding = me.fixPadding;\n\n if (me.isHorizontal()) {\n var innerWidth = area.width,\n marginLR = area.marginLR;\n var titleWidth = me.calculateTitleWidth();\n var extendLeft = me.config.extendLeft;\n if (marginLR !== 0) {\n totalLineWidth += defaultLineWidth * 2;\n } else if (extendLeft !== 0) {\n totalLineWidth += defaultLineWidth;\n }\n ticketWidth = (innerWidth - titleWidth - totalLineWidth - fixPadding) / (visTicks.length - 1);\n } else {\n var innerHeight = area.height,\n marginTB = area.marginTB;\n var titleHeight = me.calculateTitleWidth();\n var extendTop = config.extendTop;\n if (marginTB !== 0) {\n totalLineWidth += defaultLineWidth * 2;\n } else if (extendTop !== 0) {\n totalLineWidth += defaultLineWidth;\n }\n ticketWidth = (innerHeight - titleHeight - totalLineWidth - fixPadding) / (visTicks.length - 1);\n }\n return ticketWidth;\n }\n }, {\n key: 'calculateTitleWidth',\n value: function calculateTitleWidth() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config;\n\n var titleWidth = void 0,\n me = this,\n ctx = me.wxChart.ctx;\n if (me.isHorizontal()) {\n titleWidth = config.title ? ctx.measureText(config.title, config.titleFontSize).width : 0;\n } else {\n titleWidth = config.title ? config.titleFontSize : 0;\n }\n return titleWidth;\n }\n }, {\n key: '_getTicksLineWidthOffset',\n value: function _getTicksLineWidthOffset(index, visTicks) {\n var offset = 0,\n me = this;\n if (!visTicks) {\n visTicks = me.visDatasets;\n }\n var defaultLineWidth = this.config.ticks.lineWidth;\n visTicks.map(function (tick, i) {\n if (index >= i) {\n offset += tick.lineWidth || defaultLineWidth;\n }\n });\n return offset;\n }\n\n /**\n * Get position of ticket\n * @param {number} index - Begin from zero. If set -1, the function will return the actual x,y included extendLeft or extendTop\n * @param {number} [ticketWidth=this.ticketWidth]\n * @param {BoxInstance} [area=this.box]\n */\n\n }, {\n key: 'getTicksPosition',\n value: function getTicksPosition(index, ticketWidth) {\n var area = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.box;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var fixPadding = me.fixPadding;\n if (!ticketWidth) {\n ticketWidth = me.calculateTickWidth();\n }\n var visTicks = me.visDatasets;\n\n var baseX = void 0,\n baseY = void 0;\n if (me.isHorizontal()) {\n baseX = index === -1 ? area.x - me.config.extendLeft + fixPadding / 2 + (me.config.extendLeft ? me.config.ticks.lineWidth : 0) : area.lx + me._getTicksLineWidthOffset(index, visTicks) + ticketWidth * index + fixPadding / 2;\n baseY = me.position === 'top' ? area.ry - me.lineSpace : area.ly + me.lineSpace;\n } else {\n baseY = index === -1 ? area.y - me.config.extendTop + fixPadding / 2 + (me.config.extendTop ? me.config.ticks.lineWidth : 0) : area.ly + me.calculateTitleWidth() + me._getTicksLineWidthOffset(index, visTicks) + ticketWidth * index + fixPadding / 2;\n baseX = me.position === 'left' ? area.rx - me.lineSpace : area.lx + me.lineSpace;\n }\n return { x: baseX, y: baseY };\n }\n }, {\n key: '_initDrawATickText',\n value: function _initDrawATickText() {\n var me = this,\n ctx = me.wxChart.ctx;\n switch (me.position) {\n case 'left':\n ctx.textAlign = 'end';\n ctx.textBaseline = 'middle';\n break;\n case 'right':\n ctx.textAlign = 'start';\n ctx.textBaseline = 'middle';\n break;\n case 'top':\n ctx.textAlign = 'center';\n ctx.textBaseline = 'alphabetic';\n break;\n case 'bottom':\n ctx.textAlign = 'center';\n ctx.textBaseline = 'top';\n break;\n }\n }\n }, {\n key: '_drawATickLine',\n value: function _drawATickLine(x, y, fontSize) {\n var tick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var lineSpace = me.lineSpace;\n var sx = x;\n var sy = y;\n switch (me.position) {\n case 'left':\n sx += lineSpace;\n break;\n case 'right':\n sx -= lineSpace;\n break;\n case 'top':\n sy += lineSpace;\n break;\n case 'bottom':\n sy -= lineSpace;\n break;\n }\n ctx.beginPath();\n ctx.moveTo(sx, sy);\n ctx.lineTo(x, y);\n ctx.stroke();\n\n // Draw text\n var text = void 0;\n if (tick && tick.text && _helper.is.String(tick.text)) {\n ctx.save();\n me._initDrawATickText();\n text = tick.format ? tick.format.call(me, tick.text, tick, x, y, me.fontRadians) : tick.text;\n var textWidth = tick.textWidth ? tick.textWidth : ctx.measureText(text).width;\n switch (me.position) {\n case 'left':\n ctx.translate(x - fontSize / 2, y + Math.sin(me.fontRadians) * textWidth / 2);\n ctx.rotate(me.fontRadians);\n //ctx.fillText(text, x - ctx.fontSize/2, y);\n break;\n case 'right':\n ctx.translate(x + fontSize / 2, y + Math.sin(me.fontRadians) * textWidth / 2);\n ctx.rotate(-me.fontRadians);\n // ctx.fillText(text, x + ctx.fontSize/2, y);\n break;\n case 'top':\n ctx.translate(x, y - fontSize / 2);\n ctx.rotate(-me.fontRadians);\n break;\n case 'bottom':\n ctx.translate(x, y + fontSize / 2);\n ctx.rotate(me.fontRadians);\n break;\n }\n ctx.fillText(text, 0, 0);\n\n ctx.restore();\n }\n }\n }, {\n key: 'draw',\n value: function draw() {\n var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;\n var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var fontSize = ctx.fontSize;\n var fixPadding = me.fixPadding,\n tickWidth = me.calculateTickWidth(datasets, box, config);\n var tickConfig = config.ticks;\n var x = box.x,\n y = box.y,\n width = box.width,\n outerWidth = box.outerWidth,\n height = box.height,\n outerHeight = box.outerHeight;\n\n var visTicks = me.visDatasets;\n\n var _me$getTicksPosition = me.getTicksPosition(-1, tickWidth),\n currX = _me$getTicksPosition.x,\n currY = _me$getTicksPosition.y,\n baseX = _me$getTicksPosition.x,\n baseY = _me$getTicksPosition.y;\n\n ctx.save();\n ctx.fillStyle = tickConfig.fontColor;\n ctx.fontSize = tickConfig.fontSize;\n ctx.lineWidth = tickConfig.lineWidth;\n var titleWidth = me.calculateTitleWidth();\n\n if (me.isHorizontal()) {\n // Draw the first point\n if (me.box.marginLR || config.extendLeft) {\n currX += tickConfig.lineWidth;\n me._drawATickLine(currX, currY, fontSize);\n }\n // Move to first tick\n currX = me.box.lx + fixPadding / 2;\n // Draw ticks\n visTicks.map(function (tick) {\n currX += tick.lineWidth;\n ctx.fillStyle = tick.fontColor;\n ctx.lineWidth = tick.lineWidth;\n ctx.fontSize = tick.fontSize || ctx.fontSize;\n me._drawATickLine(currX, currY, fontSize, tick);\n currX += tickWidth;\n });\n // Draw the last point\n currX = me.box.ex - fixPadding / 2 - titleWidth;\n if (me.box.marginLR) {\n me._drawATickLine(currX, currY, fontSize);\n }\n\n ctx.fillStyle = tickConfig.fontColor;\n ctx.lineWidth = config.lineWidth;\n // draw axis line\n ctx.beginPath();\n ctx.moveTo(baseX, currY);\n ctx.lineTo(currX, currY);\n ctx.stroke();\n\n if (config.title) {\n ctx.save();\n currX += fontSize / 2;\n ctx.fontSize = config.titleFontSize;\n ctx.textAlign = 'start';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = config.titleFontColor;\n ctx.fillText(config.title, currX, currY);\n ctx.restore();\n }\n } else {\n if (config.title) {\n ctx.save();\n ctx.fontSize = config.titleFontSize;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = config.titleFontColor;\n ctx.fillText(config.title, currX, currY);\n ctx.restore();\n }\n\n // Draw the first point\n if (me.box.marginTB || config.extendTop) {\n currY += titleWidth;\n me._drawATickLine(currX, currY, fontSize);\n }\n currY = me.box.ly + fixPadding / 2 + titleWidth;\n // Draw ticks\n visTicks.map(function (tick) {\n currY += tick.lineWidth;\n ctx.fillStyle = tick.fontColor;\n ctx.lineWidth = tick.lineWidth;\n ctx.fontSize = tick.fontSize || ctx.fontSize;\n me._drawATickLine(currX, currY, fontSize, tick);\n currY += tickWidth;\n });\n // Draw the last point\n currY = me.box.ey - fixPadding / 2;\n if (me.box.marginTB) {\n me._drawATickLine(currX, currY, fontSize);\n }\n\n ctx.fillStyle = tickConfig.fontColor;\n ctx.lineWidth = config.lineWidth;\n // draw axis line\n ctx.beginPath();\n ctx.moveTo(currX, baseY + titleWidth);\n ctx.lineTo(currX, currY);\n ctx.stroke();\n }\n ctx.draw();\n ctx.restore();\n }\n\n // Empty interface\n /**\n * Get one point by a value\n * @param {number} index - The index of category\n */\n\n }, {\n key: 'getPoint',\n value: function getPoint(index) {\n return null;\n }\n }, {\n key: 'lineSpace',\n get: function get() {\n var me = this;\n if (me._lineSpace) {\n return me._lineSpace;\n }\n me._lineSpace = this.config.lineSpace || this.wxChart.ctx.fontSize * 0.5;\n return me._lineSpace;\n }\n }]);\n\n return WxScale;\n }(_base2.default);\n\n exports.default = WxScale;\n }, { \"../util/helper\": 24, \"../util/wxCanvas\": 29, \"./base\": 15, \"./layout\": 16 }], 19: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _base = require('./base');\n\n var _base2 = _interopRequireDefault(_base);\n\n var _helper = require('../util/helper');\n\n var _layout = require('./layout');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Legend default config\n var WX_TITLE_DEFAULT_CONFIG = {\n display: true,\n position: 'top', // top, bottom\n fullWidth: true, // if the fullWidth is false, the 'width' property should be existed.\n fontSize: 16,\n fontColor: '#666666',\n padding: 10\n };\n\n var WxTitle = function (_WxBaseComponent) {\n _inherits(WxTitle, _WxBaseComponent);\n\n function WxTitle(wxChart, config) {\n _classCallCheck(this, WxTitle);\n\n var _this = _possibleConstructorReturn(this, (WxTitle.__proto__ || Object.getPrototypeOf(WxTitle)).call(this, wxChart, config));\n\n _this.config = (0, _helper.extend)(true, {}, WX_TITLE_DEFAULT_CONFIG, config);\n return _this;\n }\n\n /**\n * Update data and re-draw\n * @param {Object[]} text\n * @param {Object} [defaultOptions]\n * @returns {string} text\n */\n\n _createClass(WxTitle, [{\n key: 'init',\n value: function init(text) {\n var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var me = this;\n var config = me.config;\n\n text = text ? text : config.text;\n if (_helper.is.Undefined(text) || _helper.is.Null(text)) {\n throw new Error('Text is null');\n }\n\n me._datasets = text;\n return text;\n }\n }, {\n key: 'calculateBox',\n value: function calculateBox(area) {\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.config.text;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this;\n var wxChart = me.wxChart,\n ctx = wxChart.ctx,\n fontSize = config.fontSize || 16;\n var x = area.x,\n y = area.y;\n var padding = config.padding || 10;\n\n var width = !!config.fullWidth ? area.width - padding * 2 : config.width,\n outerWidth = !!config.fullWidth ? area.width : config.width,\n height = fontSize,\n outerHeight = height + padding * 2;\n\n if (config.position == 'bottom') {\n y = area.ry - outerHeight;\n y = y < area.y ? area.y : y;\n }\n\n return new _layout.BoxInstance({\n position: config.position,\n x: x,\n y: y,\n width: width,\n height: height,\n outerWidth: outerWidth,\n outerHeight: outerHeight\n });\n }\n }, {\n key: 'draw',\n value: function draw() {\n var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config.text;\n var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var x = box.x,\n y = box.y,\n width = box.width,\n outerWidth = box.outerWidth,\n height = box.height,\n outerHeight = box.outerHeight;\n\n if (_helper.is.Undefined(text) || _helper.is.Null(text)) {\n throw new Error('Text is null');\n }\n\n var fontColor = config.fontColor,\n fontSize = config.fontSize;\n // Clear the area of legend\n\n me.clear();\n // Begin a new sub-context\n ctx.save();\n\n ctx.textBaseline = 'top';\n ctx.textAlign = 'start';\n ctx.fillStyle = fontColor;\n ctx.fontSize = fontSize;\n\n var textLen = ctx.measureText(text).width;\n x += (width - textLen) / 2;\n ctx.fillText(text, x, y);\n\n ctx.restore();\n ctx.draw();\n }\n }]);\n\n return WxTitle;\n }(_base2.default);\n\n exports.default = WxTitle;\n ;\n }, { \"../util/helper\": 24, \"./base\": 15, \"./layout\": 16 }], 20: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _helper = require('../util/helper');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n /**\n * @class Liner scale\n */\n var WxCategoryScale = function (_WxScale) {\n _inherits(WxCategoryScale, _WxScale);\n\n function WxCategoryScale() {\n _classCallCheck(this, WxCategoryScale);\n\n return _possibleConstructorReturn(this, (WxCategoryScale.__proto__ || Object.getPrototypeOf(WxCategoryScale)).apply(this, arguments));\n }\n\n _createClass(WxCategoryScale, [{\n key: 'buildTicks',\n\n /**\n * Build a ticks array by minIndex or maxIndex\n * Use to generator category scale ticks\n *\n * @param {Array} legends - The legend config of chart\n * @param {number} maxIndex - Max index\n * @param {number} minIndex - Min index\n *\n * @return {Array} The ticks data\n */\n value: function buildTicks(legends, maxIndex, minIndex) {\n if (!legends || !_helper.is.Array(legends)) {\n return legends;\n }\n minIndex = minIndex || 0;\n maxIndex = maxIndex || legends.length;\n\n return legends.slice(minIndex, maxIndex);\n }\n }, {\n key: 'buildDatasets',\n value: function buildDatasets(legends, maxIndex, minIndex) {\n return this.buildTicks.apply(this, arguments);\n }\n\n /**\n * Get one point by a value\n * @param {number} index - The index of category\n */\n\n }, {\n key: 'getPoint',\n value: function getPoint(index) {\n return this.getTicksPosition(index);\n }\n }]);\n\n return WxCategoryScale;\n }(_scale2.default);\n\n exports.default = WxCategoryScale;\n }, { \"../core/scale\": 18, \"../util/helper\": 24 }], 21: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _layout = require('../core/layout');\n\n var _layout2 = _interopRequireDefault(_layout);\n\n var _helper = require('../util/helper');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var WX_CROSSSCALE_CONFIG = {\n xMargin: undefined, // undefined, a number or a function\n xFirstPointSpace: 'auto' };\n /**\n * An cross scale helper\n */\n\n var WxCrossScale = function () {\n /**\n * @constructor\n * @param {WxScale} xScale - x-Axis instance\n * @param {WxScale} yScale - y-Axis instance\n * @param {Object} [config]\n */\n function WxCrossScale(xScale, yScale, config) {\n _classCallCheck(this, WxCrossScale);\n\n if (!xScale instanceof _scale2.default && !yScale instanceof _scale2.default) {\n throw new Error('Should be an WxScale instance');\n }\n\n var me = this;\n me.xScale = xScale;\n me.yScale = yScale;\n\n me.config = (0, _helper.extend)(true, {}, WX_CROSSSCALE_CONFIG, config);\n }\n\n /**\n * Draw a cross scale\n */\n\n _createClass(WxCrossScale, [{\n key: 'draw',\n value: function draw(area, xScaleDatasets, yScaleDatasets) {\n var me = this,\n _me$config = me.config,\n xMargin = _me$config.xMargin,\n xFirstPointSpace = _me$config.xFirstPointSpace;\n\n me.yScale.init(yScaleDatasets);\n var yBox = me.yScale.calculateBox(area, yScaleDatasets);\n me.xScale.init(xScaleDatasets);\n var xBox = me.xScale.calculateBox(area, xScaleDatasets);\n\n // Y-Base\n var yMHeight = xBox.outerHeight - xBox.marginTB - me.xScale.lineSpace;\n //yBox.y = yBox.y + yMHeight*2;\n me.yScale.config.fixPadding = yMHeight * 2;\n\n // Adjust X-BOX\n var xMWidth = yBox.outerWidth - yBox.marginLR - me.yScale.lineSpace;\n\n var xOffset = xMWidth - me.xScale.fixPadding / 2;\n\n var xExtendLeft = void 0;\n if (xFirstPointSpace === 'auto') {\n xExtendLeft = me.xScale.config.extendLeft || Math.min(xBox.width / 10, me.xScale.calculateTickWidth(xScaleDatasets, xBox) / xScaleDatasets.length);\n } else if (xFirstPointSpace === 0) {\n // Zero y-space; The first point of Y will overlap the last point of X, so remove the last point of X\n yScaleDatasets[yScaleDatasets.length - 1].text = '';\n xExtendLeft = 0;\n } else if (_helper.is.Function(xFirstPointSpace)) {\n xExtendLeft = xFirstPointSpace(xBox, yBox, area, me.xScale, me.yScale, xScaleDatasets, yScaleDatasets);\n } else {\n xExtendLeft = parseFloat(xFirstPointSpace);\n }\n\n xOffset -= me.xScale.config.ticks.lineWidth || 1;\n xOffset += xExtendLeft;\n\n var xAxisXPoint = area.x + xOffset;\n if (_helper.is.Function(xMargin)) {\n xMargin = xMargin(xBox, yBox, area, me.xScale, me.yScale, xScaleDatasets, yScaleDatasets);\n } else if (!xMargin || !_helper.is.Number(xMargin)) {\n xMargin = 0;\n }\n\n var calXbox = new _layout.BoxInstance(xBox.position, xAxisXPoint, xBox.y, xBox.width - xOffset - xMargin, xBox.height, xBox.outerWidth - xOffset, xBox.outerHeight);\n me.yScale.setBox(yBox, false);\n me.yScale.update(yScaleDatasets);\n\n me.xScale.setBox(calXbox, false);\n me.xScale.config.extendLeft = xExtendLeft;\n me.xScale.update(xScaleDatasets);\n\n return { xBox: calXbox, yBox: yBox };\n }\n }]);\n\n return WxCrossScale;\n }();\n\n exports.default = WxCrossScale;\n }, { \"../core/layout\": 16, \"../core/scale\": 18, \"../util/helper\": 24 }], 22: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _helper = require('../util/helper');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n /**\n * @class Liner scale\n */\n var WxLinerScale = function (_WxScale) {\n _inherits(WxLinerScale, _WxScale);\n\n function WxLinerScale() {\n _classCallCheck(this, WxLinerScale);\n\n return _possibleConstructorReturn(this, (WxLinerScale.__proto__ || Object.getPrototypeOf(WxLinerScale)).apply(this, arguments));\n }\n\n _createClass(WxLinerScale, [{\n key: 'buildTicks',\n\n /**\n * Build a ticks array by max/min value\n * Use to generator liner scale ticks\n *\n * @param {number} max - Max value\n * @param {number} min - Min value\n * @param {number} maxTicks - The maxinum number of ticks\n * @param {number} [stepSize] - Special space size\n *\n * @return {Array} The ticks data\n */\n value: function buildTicks(max, min, maxTicks, stepSize) {\n var spacing = void 0,\n ticks = [];\n if (!!stepSize && stepSize > 0) {\n spacing = stepSize;\n } else {\n var niceRange = (0, _helper.niceNum)(max - min, false);\n spacing = (0, _helper.niceNum)(niceRange / (maxTicks - 1), true);\n }\n\n var niceMin = Math.floor(min / spacing) * spacing;\n var niceMax = Math.ceil(max / spacing) * spacing;\n var numSpaces = (niceMax - niceMin) / spacing;\n\n if ((0, _helper.almostEquals)(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n\n for (var j = 0; j < numSpaces; j++) {\n ticks.push(niceMin + j * spacing);\n }\n ticks.push(niceMax);\n\n return ticks;\n }\n\n /**\n * Build a datasets base on buildTicks\n *\n * @param {number} max - Max value\n * @param {number} min - Min value\n * @param {number} maxTicks - The maximum number of ticks\n * @param {number} [stepSize] - Assign the space size\n * @param {Object} [scaleOptions] - Assign the dataset item's options\n *\n * @return {Array} The ticks data\n */\n\n }, {\n key: 'buildDatasets',\n value: function buildDatasets(max, min, maxTicks, stepSize, scaleOptions) {\n var me = this;\n var ticks = me.buildTicks(max, min, maxTicks, stepSize);\n if (!me.isHorizontal()) ticks.reverse();\n return ticks.map(function (val) {\n return (0, _helper.extend)({\n text: val + '',\n value: val\n }, scaleOptions);\n });\n }\n\n /**\n * Calculate the maximum ticks of scale\n *\n * @param {BoxInstance} area - area of chart\n * @param {WxCanvasRenderingContext2D} ctx - Content of chart\n * @returns {number} maxTicks\n */\n\n }, {\n key: 'calculateTickLimit',\n value: function calculateTickLimit(area, ctx) {\n var me = this,\n fontSize = ctx.fontSize;\n var maxTicks = void 0;\n var tickOpts = me.config.ticks;\n\n if (me.isHorizontal()) {\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(area.width / 50));\n } else {\n // The factor of 2 used to scale the font size has been experimentally determined.\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(area.height / (2 * fontSize)));\n }\n\n return maxTicks;\n }\n\n /**\n * Get one point by a value\n * **Must** run after 'setBox' or 'update'\n * @param {number} value\n * @returns {object} point\n *\n */\n\n }, {\n key: 'getPoint',\n value: function getPoint(value) {\n var me = this,\n box = this.box;\n var pointX = void 0,\n pointY = void 0;\n\n var startVal = parseInt(me.visDatasets[0].value),\n endVal = parseInt(me.visDatasets[me.visDatasets.length - 1].value);\n // if (!me.isHorizontal()) {\n // [startVal,endVal] = [endVal,startVal];\n // }\n var range = endVal - startVal;\n\n if (me.isHorizontal()) {\n var realWidth = me.getTicksPosition(me.visDatasets.length - 1).x - me.getTicksPosition(0).x;\n pointX = me.getTicksPosition(0).x + realWidth / range * (value - startVal);\n pointY = me.position === 'top' ? box.ry - me.lineSpace : box.ly + me.lineSpace;\n } else {\n var realHeight = me.getTicksPosition(me.visDatasets.length - 1).y - me.getTicksPosition(0).y;\n pointX = me.position === 'left' ? box.rx - me.lineSpace : box.lx + me.lineSpace;\n pointY = me.getTicksPosition(0).y + realHeight / range * (value - startVal);\n }\n return { x: Math.round(pointX), y: Math.round(pointY) };\n }\n }]);\n\n return WxLinerScale;\n }(_scale2.default);\n\n exports.default = WxLinerScale;\n }, { \"../core/scale\": 18, \"../util/helper\": 24 }], 23: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n /**\r\n * An mixin class(implement by es6-mixins) for stacked point\r\n */\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var WxStackMixin = function () {\n function WxStackMixin() {\n _classCallCheck(this, WxStackMixin);\n }\n\n _createClass(WxStackMixin, [{\n key: 'stackYScaleAxisLimit',\n\n /**\r\n * Calculate the yAxis data for *WxLinerScale*\r\n */\n value: function stackYScaleAxisLimit() {\n var me = this;\n var min = 0,\n max = 0;\n me.visDatasets.forEach(function (data) {\n var sumNeg = 0,\n sumPos = 0;\n me.legends.forEach(function (legend) {\n var key = legend.key;\n var stackedVal = data[key];\n if (stackedVal < 0) {\n sumNeg += stackedVal || 0;\n } else {\n sumPos += stackedVal || 0;\n }\n });\n data.__sumNeg = sumNeg;\n data.__sumPos = sumPos;\n if (sumNeg < min) min = sumNeg;\n if (sumPos > max) max = sumPos;\n });\n\n return { max: max, min: min };\n }\n /**\r\n * Calculate the stack value\r\n * @param {number} index - The index of item\r\n * @param {Object} legendIndex - The index of legend\r\n * @param {number} [offset=0] - The offset value of stack\r\n * @param {WxScale} [yScale=this.yAxis] - Y-Axis instance\r\n * @return {{sumNeg: number, sumPos: number}}\r\n * @private\r\n */\n\n }, {\n key: '_getStackValue',\n value: function _getStackValue(index, legendIndex) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;\n\n var me = this,\n data = me.visDatasets[index];\n\n var stackedVal = void 0,\n sumNeg = 0,\n sumPos = 0;\n for (var j = 0; j < legendIndex; j++) {\n stackedVal = data[me.legends[j].key];\n if (stackedVal < 0) {\n sumNeg += stackedVal || 0;\n } else {\n sumPos += stackedVal || 0;\n }\n }\n return {\n sumNeg: sumNeg,\n sumPos: sumPos\n };\n }\n\n /**\r\n * Calculate the stack bar\r\n * @param {number} index - The index of item\r\n * @param {Object} legendIndex - The index of legend\r\n * @param {number} [offsetValue=0] - The offset value of stack\r\n * @param {WxScale} [yScale=this.yAxis] - Y-Axis instance\r\n * @return {Object}\r\n * @private\r\n */\n\n }, {\n key: '_getStackPoint',\n value: function _getStackPoint(index, legendIndex) {\n var offsetValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;\n\n var me = this,\n data = me.visDatasets[index],\n value = data[me.legends[legendIndex].key];\n\n var _me$_getStackValue = me._getStackValue(index, legendIndex, offsetValue, yScale),\n sumNeg = _me$_getStackValue.sumNeg,\n sumPos = _me$_getStackValue.sumPos;\n\n return value < 0 ? yScale.getPoint(sumNeg + value + offsetValue) : yScale.getPoint(sumPos + value + offsetValue);\n }\n }]);\n\n return WxStackMixin;\n }();\n\n exports.default = WxStackMixin;\n }, {}], 24: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n return typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n };\n\n exports.sum = sum;\n exports.checkWX = checkWX;\n exports.wxConverToPx = wxConverToPx;\n exports.toRadians = toRadians;\n exports.toDegrees = toDegrees;\n exports.getWindowSize = getWindowSize;\n exports.getDPR = getDPR;\n exports.niceNum = niceNum;\n exports.almostEquals = almostEquals;\n exports.splineCurve = splineCurve;\n exports.getStyle = getStyle;\n exports.readUsedSize = readUsedSize;\n exports.retinaScale = retinaScale;\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n var ObjProto = Object.prototype;\n\n // IS function, check variable's type\n var is = exports.is = {};\n\n ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'].forEach(function (name) {\n is[name] = function (obj) {\n return ObjProto.toString.call(obj) === '[object ' + name + ']';\n };\n });\n\n // Is a given value an array?\n // Delegates to ECMA5's native Array.isArray\n is['Array'] = Array.isArray || function (obj) {\n return ObjProto.toString.call(obj) === '[object Array]';\n };\n\n // Is a given variable an object?\n is['Object'] = function (obj) {\n var type = typeof obj === 'undefined' ? 'undefined' : _typeof(obj);\n return type === 'function' || type === 'object' && !!obj;\n };\n\n var class2type = {};\n var toString = class2type.toString;\n var hasOwn = class2type.hasOwnProperty;\n var fnToString = hasOwn.toString;\n var ObjectFunctionString = fnToString.call(Object);\n // Is a given variable an object?\n is['PureObject'] = function (obj) {\n var proto = void 0,\n Ctor = void 0;\n\n // Detect obvious negatives\n // Use toString instead of jQuery.type to catch host objects\n if (!obj || ObjProto.toString.call(obj) !== \"[object Object]\") {\n return false;\n }\n\n proto = Object.getPrototypeOf(obj);\n // Objects with no prototype (e.g., `Object.create( null )`) are plain\n if (!proto) {\n return true;\n }\n // Objects with prototype are plain iff they were constructed by a global Object function\n Ctor = hasOwn.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && fnToString.call(Ctor) === ObjectFunctionString;\n };\n\n is['Boolean'] = function (obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n };\n\n // Is a given value equal to null?\n is['Null'] = function (obj) {\n return obj === null;\n };\n\n // Is a given variable undefined?\n is['Undefined'] = function (obj) {\n return obj === void 0;\n };\n\n // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n is['NaN'] = function (obj) {\n return is.Number(obj) && obj !== +obj;\n };\n\n // Some helper function\n function sum() {\n var args = Array.from(arguments);\n var res = 0;\n return args.reduce(function (a, b) {\n return a + b;\n }, 0);\n }\n\n // Some regex\n var REG_HANZI = exports.REG_HANZI = /[\\u4e00-\\u9fa5]/;\n var REG_ALPHABET = exports.REG_ALPHABET = /[a-zA-Z]/;\n var REG_NUMBER = exports.REG_NUMBER = /[0-9]/;\n var REG_ALPHABET_NUMBER = exports.REG_ALPHABET_NUMBER = /[0-9a-zA-Z]/;\n\n // Assign function generator\n function _assignGenerator(own) {\n var _copy = function _copy(target) {\n var deep = true;\n\n for (var _len = arguments.length, source = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n source[_key - 1] = arguments[_key];\n }\n\n if (is.Boolean(target)) {\n deep = target;\n target = 0 in source ? source.shift() : null;\n }\n\n if (is.Array(target)) {\n source.forEach(function (sc) {\n var _target;\n\n (_target = target).push.apply(_target, _toConsumableArray(sc));\n });\n } else if (is.Object(target)) {\n source.forEach(function (sc) {\n for (var key in sc) {\n if (own && !sc.hasOwnProperty(key)) continue;\n var so = sc[key],\n to = target[key];\n if (is.PureObject(so)) {\n target[key] = deep ? extend(true, is.PureObject(to) ? to : {}, so) : so;\n } else if (is.Array(so)) {\n target[key] = deep ? extend(true, is.Array(to) ? to : [], so) : so;\n } else {\n target[key] = so;\n }\n }\n });\n }\n // Do nothing\n return target;\n };\n return _copy;\n }\n\n /**\r\n *\r\n * Extend a given object\r\n * @param {Boolean|Object|Array} target - target object or deep mark (default is true)\r\n * @param {Array|Object} source - target object if the first argument represent the deep mark, otherwise the source for merging\r\n * @returns {*}\r\n */\n var extend = exports.extend = _assignGenerator(false);\n var extendOwn = exports.extendOwn = _assignGenerator(true);\n /**\r\n * Check WeiXin environment\r\n */\n function checkWX() {\n return false === true || typeof wx != 'undefined' && (typeof wx === 'undefined' ? 'undefined' : _typeof(wx)) === 'object';\n }\n\n var isWeiXinAPP = exports.isWeiXinAPP = checkWX();\n /**\r\n * Convert (rpx/rem) to px\r\n * @param unit\r\n */\n var rpxReg = /([\\d.]+)rpx/,\n remReg = /([\\d.]+)rem/;\n function wxConverToPx(val) {\n if (!isWeiXinAPP) {\n return Number.parseInt(val);\n }\n\n var windowSize = getWindowSize();\n if (is.String(val)) {\n var m = val.match(rpxReg);\n if (!!m) {\n return +m[1] * windowSize.windowWidth / 750;\n }\n\n m = val.match(remReg);\n if (!!m) {\n return +m[1] * windowSize.windowWidth / 20;\n }\n\n return Number.parseInt(val);\n } else if (is.Number(val)) {\n return val;\n } else {\n throw new Error('Convert px error');\n }\n }\n\n function toRadians(degrees) {\n return degrees * (Math.PI / 180);\n }\n function toDegrees(radians) {\n return radians * (180 / Math.PI);\n }\n /**\r\n * Get window size (px)\r\n * @returns {*}\r\n */\n function getWindowSize() {\n var windowHeight = void 0,\n windowWidth = void 0;\n if (isWeiXinAPP) {\n var ret = wx.getSystemInfoSync();\n windowWidth = ret.windowWidth;\n windowHeight = ret.windowHeight;\n } else {\n windowWidth = window.innerWidth;\n windowHeight = window.innerHeight;\n }\n return { windowWidth: windowWidth, windowHeight: windowHeight };\n };\n\n /**\r\n * Get window's Device Pixel Ratio\r\n */\n function getDPR() {\n if (isWeiXinAPP) {\n var ret = wx.getSystemInfoSync();\n return ret.pixelRatio;\n } else {\n return window.devicePixelRatio || 1;\n }\n };\n\n var uid = exports.uid = function () {\n var id = 0;\n return function () {\n id++;\n return 'u' + id;\n };\n }();\n\n function niceNum(range, round) {\n var exponent = Math.floor(Math.log10(range));\n var fraction = range / Math.pow(10, exponent);\n var niceFraction = void 0;\n\n if (round) {\n if (fraction < 1.5) {\n niceFraction = 1;\n } else if (fraction < 3) {\n niceFraction = 2;\n } else if (fraction < 7) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n } else if (fraction <= 1.0) {\n niceFraction = 1;\n } else if (fraction <= 2) {\n niceFraction = 2;\n } else if (fraction <= 5) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n\n return niceFraction * Math.pow(10, exponent);\n }\n\n function almostEquals(a, b, epsilon) {\n return Math.abs(a - b) < epsilon;\n }\n\n function splineCurve(firstPoint, middlePoint, afterPoint) {\n var t = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.4;\n\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n var previous = !firstPoint ? middlePoint : firstPoint,\n current = middlePoint,\n next = !afterPoint ? middlePoint : afterPoint;\n\n var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n var s01 = d01 / (d01 + d12);\n var s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n var fa = t * s01; // scaling factor for triangle Ta\n var fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n }\n\n /**\r\n * Get element style\r\n * @param element\r\n */\n function getStyle(element, property) {\n return element.currentStyle ? element.currentStyle[property] : document.defaultView.getComputedStyle(element, null).getPropertyValue(property);\n }\n /**\r\n * The 'used' size is the final value of a dimension property after all calculations have\r\n * been performed. This method uses the computed style of `element` but returns undefined\r\n * if the computed style is not expressed in pixels. That can happen in some cases where\r\n * `element` has a size relative to its parent and this last one is not yet displayed,\r\n * for example because of `display: none` on a parent node.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\r\n * @param element\r\n * @param property\r\n * @returns {Number} Size in pixels or undefined if unknown.\r\n */\n function readUsedSize(element, property) {\n var value = getStyle(element, property);\n var matches = value && value.match(/(\\d+)px/);\n return matches ? Number(matches[1]) : undefined;\n }\n /**\r\n * For retina screen\r\n * @param ctx\r\n * @param width\r\n * @param height\r\n */\n function retinaScale(ctx, width, height) {\n var pixelRatio = getDPR();\n if (pixelRatio === 1) {\n return;\n }\n\n var canvas = ctx.canvas;\n if (isWeiXinAPP) {\n // Do I resize the height or width?\n } else {\n canvas.height = canvas.height * pixelRatio;\n canvas.width = canvas.width * pixelRatio;\n ctx.scale(pixelRatio, pixelRatio);\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the 'correct' values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n canvas.style.height = height + 'px';\n canvas.style.width = width + 'px';\n }\n }\n }, {}], 25: [function (require, module, exports) {\n (function (global) {\n /* global module, wx, getApp, window: false, global:false, document: false */\n 'use strict';\n\n /**\r\n * Modify from RAF(https://github.com/chrisdickinson/raf)\r\n *\r\n */\n\n var _helper = require('../util/helper');\n\n var now = require('performance-now');\n var root = void 0,\n isWx = (0, _helper.checkWX)();\n root = isWx ? {} : typeof window === 'undefined' ? global : window;\n\n var vendors = ['moz', 'webkit'],\n suffix = 'AnimationFrame',\n raf = root['request' + suffix],\n caf = root['cancel' + suffix] || root['cancelRequest' + suffix];\n\n for (var i = 0; !raf && i < vendors.length; i++) {\n raf = root[vendors[i] + 'Request' + suffix];\n caf = root[vendors[i] + 'Cancel' + suffix] || root[vendors[i] + 'CancelRequest' + suffix];\n }\n\n // Some versions of FF have rAF but not cAF\n if (!raf || !caf) {\n (function () {\n var last = 0,\n id = 0,\n queue = [],\n frameDuration = 1000 / 60;\n\n raf = function raf(callback) {\n if (queue.length === 0) {\n var _now = now(),\n next = Math.max(0, frameDuration - (_now - last));\n last = next + _now;\n setTimeout(function () {\n var cp = queue.slice(0);\n // Clear queue here to prevent\n // callbacks from appending listeners\n // to the current frame's queue\n queue.length = 0;\n for (var _i = 0; _i < cp.length; _i++) {\n if (!cp[_i].cancelled) {\n try {\n cp[_i].callback(last);\n } catch (e) {\n setTimeout(function () {\n throw e;\n }, 0);\n }\n }\n }\n }, Math.round(next));\n }\n queue.push({\n handle: ++id,\n callback: callback,\n cancelled: false\n });\n return id;\n };\n\n caf = function caf(handle) {\n for (var _i2 = 0; _i2 < queue.length; _i2++) {\n if (queue[_i2].handle === handle) {\n queue[_i2].cancelled = true;\n }\n }\n };\n })();\n }\n\n module.exports = function (fn) {\n // Wrap in a new function to prevent\n // `cancel` potentially being assigned\n // to the native rAF function\n return raf.call(root, fn);\n };\n module.exports._root = root;\n module.exports.cancel = function () {\n caf.apply(root, arguments);\n };\n module.exports.polyfill = function () {\n root.requestAnimationFrame = raf;\n root.cancelAnimationFrame = caf;\n };\n }).call(this, typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {});\n }, { \"../util/helper\": 24, \"performance-now\": 8 }], 26: [function (require, module, exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n // Modified from randomColor by David Merfield under the CC0 license\n // https://github.com/davidmerfield/randomColor/\n\n var seed = null;\n\n // Shared color dictionary\n var colorDictionary = {};\n\n // Populate the color dictionary\n loadColorBounds();\n\n var randomColor = function randomColor(options) {\n\n options = options || {};\n\n // Check if there is a seed and ensure it's an\n // integer. Otherwise, reset the seed value.\n if (options.seed !== undefined && options.seed !== null && options.seed === parseInt(options.seed, 10)) {\n seed = options.seed;\n\n // A string was passed as a seed\n } else if (typeof options.seed === 'string') {\n seed = stringToInteger(options.seed);\n\n // Something was passed as a seed but it wasn't an integer or string\n } else if (options.seed !== undefined && options.seed !== null) {\n throw new TypeError('The seed value must be an integer or string');\n\n // No seed, reset the value outside.\n } else {\n seed = null;\n }\n\n var H = void 0,\n S = void 0,\n B = void 0;\n\n // Check if we need to generate multiple colors\n if (options.count !== null && options.count !== undefined) {\n\n var totalColors = options.count,\n colors = [];\n\n options.count = null;\n\n while (totalColors > colors.length) {\n\n // Since we're generating multiple colors,\n // incremement the seed. Otherwise we'd just\n // generate the same color each time...\n if (seed && options.seed) options.seed += 1;\n\n colors.push(randomColor(options));\n }\n\n options.count = totalColors;\n\n return colors;\n }\n\n // First we pick a hue (H)\n H = pickHue(options);\n\n // Then use H to determine saturation (S)\n S = pickSaturation(H, options);\n\n // Then use S and H to determine brightness (B).\n B = pickBrightness(H, S, options);\n\n // Then we return the HSB color in the desired format\n return setFormat([H, S, B], options);\n };\n\n function pickHue(options) {\n\n var hueRange = getHueRange(options.hue),\n hue = randomWithin(hueRange);\n\n // Instead of storing red as two seperate ranges,\n // we group them, using negative numbers\n if (hue < 0) {\n hue = 360 + hue;\n }\n\n return hue;\n }\n\n function pickSaturation(hue, options) {\n\n if (options.luminosity === 'random') {\n return randomWithin([0, 100]);\n }\n\n if (options.hue === 'monochrome') {\n return 0;\n }\n\n var saturationRange = getSaturationRange(hue);\n\n var sMin = saturationRange[0],\n sMax = saturationRange[1];\n\n switch (options.luminosity) {\n\n case 'bright':\n sMin = 55;\n break;\n\n case 'dark':\n sMin = sMax - 10;\n break;\n\n case 'light':\n sMax = 55;\n break;\n }\n\n return randomWithin([sMin, sMax]);\n }\n\n function pickBrightness(H, S, options) {\n\n var bMin = getMinimumBrightness(H, S),\n bMax = 100;\n\n switch (options.luminosity) {\n\n case 'dark':\n bMax = bMin + 20;\n break;\n\n case 'light':\n bMin = (bMax + bMin) / 2;\n break;\n\n case 'random':\n bMin = 0;\n bMax = 100;\n break;\n }\n\n return randomWithin([bMin, bMax]);\n }\n\n function setFormat(hsv, options) {\n\n switch (options.format) {\n\n case 'hsvArray':\n return hsv;\n\n case 'hslArray':\n return HSVtoHSL(hsv);\n\n case 'hsl':\n var hsl = HSVtoHSL(hsv);\n return 'hsl(' + hsl[0] + ', ' + hsl[1] + '%, ' + hsl[2] + '%)';\n\n case 'hsla':\n var hslColor = HSVtoHSL(hsv);\n var alpha = options.alpha || Math.random();\n return 'hsla(' + hslColor[0] + ', ' + hslColor[1] + '%, ' + hslColor[2] + '%, ' + alpha + ')';\n\n case 'rgbArray':\n return HSVtoRGB(hsv);\n\n case 'rgb':\n var rgb = HSVtoRGB(hsv);\n return 'rgb(' + rgb.join(', ') + ')';\n\n case 'rgba':\n var rgbColor = HSVtoRGB(hsv);\n var alpha = options.alpha || Math.random();\n return 'rgba(' + rgbColor.join(', ') + ', ' + alpha + ')';\n\n default:\n return HSVtoHex(hsv);\n }\n }\n\n function getMinimumBrightness(H, S) {\n\n var lowerBounds = getColorInfo(H).lowerBounds;\n\n for (var i = 0; i < lowerBounds.length - 1; i++) {\n\n var s1 = lowerBounds[i][0],\n v1 = lowerBounds[i][1];\n\n var s2 = lowerBounds[i + 1][0],\n v2 = lowerBounds[i + 1][1];\n\n if (S >= s1 && S <= s2) {\n\n var m = (v2 - v1) / (s2 - s1),\n b = v1 - m * s1;\n\n return m * S + b;\n }\n }\n\n return 0;\n }\n\n function getHueRange(colorInput) {\n\n if (typeof parseInt(colorInput) === 'number') {\n\n var number = parseInt(colorInput);\n\n if (number < 360 && number > 0) {\n return [number, number];\n }\n }\n\n if (typeof colorInput === 'string') {\n\n if (colorDictionary[colorInput]) {\n var color = colorDictionary[colorInput];\n if (color.hueRange) {\n return color.hueRange;\n }\n }\n }\n\n return [0, 360];\n }\n\n function getSaturationRange(hue) {\n return getColorInfo(hue).saturationRange;\n }\n\n function getColorInfo(hue) {\n\n // Maps red colors to make picking hue easier\n if (hue >= 334 && hue <= 360) {\n hue -= 360;\n }\n\n for (var colorName in colorDictionary) {\n var color = colorDictionary[colorName];\n if (color.hueRange && hue >= color.hueRange[0] && hue <= color.hueRange[1]) {\n return colorDictionary[colorName];\n }\n }\n return 'Color not found';\n }\n\n function randomWithin(range) {\n if (seed === null) {\n return Math.floor(range[0] + Math.random() * (range[1] + 1 - range[0]));\n } else {\n //Seeded random algorithm from http://indiegamr.com/generate-repeatable-random-numbers-in-js/\n var max = range[1] || 1;\n var min = range[0] || 0;\n seed = (seed * 9301 + 49297) % 233280;\n var rnd = seed / 233280.0;\n return Math.floor(min + rnd * (max - min));\n }\n }\n\n function HSVtoHex(hsv) {\n\n var rgb = HSVtoRGB(hsv);\n\n function componentToHex(c) {\n var hex = c.toString(16);\n return hex.length == 1 ? '0' + hex : hex;\n }\n\n var hex = '#' + componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);\n\n return hex;\n }\n\n function defineColor(name, hueRange, lowerBounds) {\n\n var sMin = lowerBounds[0][0],\n sMax = lowerBounds[lowerBounds.length - 1][0],\n bMin = lowerBounds[lowerBounds.length - 1][1],\n bMax = lowerBounds[0][1];\n\n colorDictionary[name] = {\n hueRange: hueRange,\n lowerBounds: lowerBounds,\n saturationRange: [sMin, sMax],\n brightnessRange: [bMin, bMax]\n };\n }\n\n function loadColorBounds() {\n\n defineColor('monochrome', null, [[0, 0], [100, 0]]);\n\n defineColor('red', [-26, 18], [[20, 100], [30, 92], [40, 89], [50, 85], [60, 78], [70, 70], [80, 60], [90, 55], [100, 50]]);\n\n defineColor('orange', [19, 46], [[20, 100], [30, 93], [40, 88], [50, 86], [60, 85], [70, 70], [100, 70]]);\n\n defineColor('yellow', [47, 62], [[25, 100], [40, 94], [50, 89], [60, 86], [70, 84], [80, 82], [90, 80], [100, 75]]);\n\n defineColor('green', [63, 178], [[30, 100], [40, 90], [50, 85], [60, 81], [70, 74], [80, 64], [90, 50], [100, 40]]);\n\n defineColor('blue', [179, 257], [[20, 100], [30, 86], [40, 80], [50, 74], [60, 60], [70, 52], [80, 44], [90, 39], [100, 35]]);\n\n defineColor('purple', [258, 282], [[20, 100], [30, 87], [40, 79], [50, 70], [60, 65], [70, 59], [80, 52], [90, 45], [100, 42]]);\n\n defineColor('pink', [283, 334], [[20, 100], [30, 90], [40, 86], [60, 84], [80, 80], [90, 75], [100, 73]]);\n }\n\n function HSVtoRGB(hsv) {\n\n // this doesn't work for the values of 0 and 360\n // here's the hacky fix\n var h = hsv[0];\n if (h === 0) {\n h = 1;\n }\n if (h === 360) {\n h = 359;\n }\n\n // Rebase the h,s,v values\n h = h / 360;\n var s = hsv[1] / 100,\n v = hsv[2] / 100;\n\n var h_i = Math.floor(h * 6),\n f = h * 6 - h_i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n r = 256,\n g = 256,\n b = 256;\n\n switch (h_i) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n var result = [Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)];\n return result;\n }\n\n function HSVtoHSL(hsv) {\n var h = hsv[0],\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n k = (2 - s) * v;\n\n return [h, Math.round(s * v / (k < 1 ? k : 2 - k) * 10000) / 100, k / 2 * 100];\n }\n\n function stringToInteger(string) {\n var total = 0;\n for (var i = 0; i !== string.length; i++) {\n if (total >= Number.MAX_SAFE_INTEGER) break;\n total += string.charCodeAt(i);\n }\n return total;\n }\n\n exports.default = randomColor;\n }, {}], 27: [function (require, module, exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n return typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n };\n\n // TinyColor v1.4.1\n // https://github.com/bgrins/TinyColor\n // Brian Grinstead, MIT License\n\n\n var trimLeft = /^\\s+/,\n trimRight = /\\s+$/,\n tinyCounter = 0,\n mathRound = Math.round,\n mathMin = Math.min,\n mathMax = Math.max,\n mathRandom = Math.random;\n\n function tinycolor(color, opts) {\n\n color = color ? color : '';\n opts = opts || {};\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n\n var rgb = inputToRGB(color);\n this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = mathRound(100 * this._a) / 100, this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) {\n this._r = mathRound(this._r);\n }\n if (this._g < 1) {\n this._g = mathRound(this._g);\n }\n if (this._b < 1) {\n this._b = mathRound(this._b);\n }\n\n this._ok = rgb.ok;\n this._tc_id = tinyCounter++;\n }\n\n tinycolor.prototype = {\n isDark: function isDark() {\n return this.getBrightness() < 128;\n },\n isLight: function isLight() {\n return !this.isDark();\n },\n isValid: function isValid() {\n return this._ok;\n },\n getOriginalInput: function getOriginalInput() {\n return this._originalInput;\n },\n getFormat: function getFormat() {\n return this._format;\n },\n getAlpha: function getAlpha() {\n return this._a;\n },\n getBrightness: function getBrightness() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function getLuminance() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r / 255;\n GsRGB = rgb.g / 255;\n BsRGB = rgb.b / 255;\n\n if (RsRGB <= 0.03928) {\n R = RsRGB / 12.92;\n } else {\n R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n }\n if (GsRGB <= 0.03928) {\n G = GsRGB / 12.92;\n } else {\n G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n }\n if (BsRGB <= 0.03928) {\n B = BsRGB / 12.92;\n } else {\n B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n }\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n },\n setAlpha: function setAlpha(value) {\n this._a = boundAlpha(value);\n this._roundA = mathRound(100 * this._a) / 100;\n return this;\n },\n toHsv: function toHsv() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };\n },\n toHsvString: function toHsvString() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = mathRound(hsv.h * 360),\n s = mathRound(hsv.s * 100),\n v = mathRound(hsv.v * 100);\n return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n },\n toHsl: function toHsl() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };\n },\n toHslString: function toHslString() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = mathRound(hsl.h * 360),\n s = mathRound(hsl.s * 100),\n l = mathRound(hsl.l * 100);\n return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n },\n toHex: function toHex(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function toHexString(allow3Char) {\n return '#' + this.toHex(allow3Char);\n },\n toHex8: function toHex8(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function toHex8String(allow4Char) {\n return '#' + this.toHex8(allow4Char);\n },\n toRgb: function toRgb() {\n return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };\n },\n toRgbString: function toRgbString() {\n return this._a == 1 ? \"rgb(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \")\" : \"rgba(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function toPercentageRgb() {\n return {\n r: mathRound(bound01(this._r, 255) * 100) + \"%\",\n g: mathRound(bound01(this._g, 255) * 100) + \"%\",\n b: mathRound(bound01(this._b, 255) * 100) + \"%\",\n a: this._a\n };\n },\n toPercentageRgbString: function toPercentageRgbString() {\n return this._a == 1 ? \"rgb(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function toName() {\n if (this._a === 0) {\n return \"transparent\";\n }\n\n if (this._a < 1) {\n return false;\n }\n\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function toFilter(secondColor) {\n var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n\n return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n },\n toString: function toString(format) {\n var formatSet = !!format;\n format = format || this._format;\n\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n\n return formattedString || this.toHexString();\n },\n clone: function clone() {\n return tinycolor(this.toString());\n },\n\n _applyModification: function _applyModification(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function lighten() {\n return this._applyModification(_lighten, arguments);\n },\n brighten: function brighten() {\n return this._applyModification(_brighten, arguments);\n },\n darken: function darken() {\n return this._applyModification(_darken, arguments);\n },\n desaturate: function desaturate() {\n return this._applyModification(_desaturate, arguments);\n },\n saturate: function saturate() {\n return this._applyModification(_saturate, arguments);\n },\n greyscale: function greyscale() {\n return this._applyModification(_greyscale, arguments);\n },\n spin: function spin() {\n return this._applyModification(_spin, arguments);\n },\n\n _applyCombination: function _applyCombination(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function analogous() {\n return this._applyCombination(_analogous, arguments);\n },\n complement: function complement() {\n return this._applyCombination(_complement, arguments);\n },\n monochromatic: function monochromatic() {\n return this._applyCombination(_monochromatic, arguments);\n },\n splitcomplement: function splitcomplement() {\n return this._applyCombination(_splitcomplement, arguments);\n },\n triad: function triad() {\n return this._applyCombination(_triad, arguments);\n },\n tetrad: function tetrad() {\n return this._applyCombination(_tetrad, arguments);\n }\n };\n\n // If input is an object, force 1 into \"1.0\" to handle ratios properly\n // String input requires \"1.0\" as input, so 1 will be treated as 1\n tinycolor.fromRatio = function (color, opts) {\n if ((typeof color === \"undefined\" ? \"undefined\" : _typeof(color)) == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n } else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n\n return tinycolor(color, opts);\n };\n\n // Given a string or object, convert that input to RGB\n // Possible string inputs:\n //\n // \"red\"\n // \"#f00\" or \"f00\"\n // \"#ff0000\" or \"ff0000\"\n // \"#ff000000\" or \"ff000000\"\n // \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n // \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n // \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n // \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n // \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n // \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n // \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n //\n function inputToRGB(color) {\n\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n\n if ((typeof color === \"undefined\" ? \"undefined\" : _typeof(color)) == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n\n a = boundAlpha(a);\n\n return {\n ok: ok,\n format: color.format || format,\n r: mathMin(255, mathMax(rgb.r, 0)),\n g: mathMin(255, mathMax(rgb.g, 0)),\n b: mathMin(255, mathMax(rgb.b, 0)),\n a: a\n };\n }\n\n // Conversion Functions\n // --------------------\n\n // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n // \n\n // `rgbToRgb`\n // Handle bounds / percentage checking to conform to CSS color spec\n // \n // *Assumes:* r, g, b in [0, 255] or [0, 1]\n // *Returns:* { r, g, b } in [0, 255]\n function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n }\n\n // `rgbToHsl`\n // Converts an RGB color value to HSL.\n // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n // *Returns:* { h, s, l } in [0,1]\n function rgbToHsl(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b),\n min = mathMin(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return { h: h, s: s, l: l };\n }\n\n // `hslToRgb`\n // Converts an HSL color value to RGB.\n // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n // *Returns:* { r, g, b } in the set [0, 255]\n function hslToRgb(h, s, l) {\n var r, g, b;\n\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n }\n\n // `rgbToHsv`\n // Converts an RGB color value to HSV\n // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n // *Returns:* { h, s, v } in [0,1]\n function rgbToHsv(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b),\n min = mathMin(r, g, b);\n var h,\n s,\n v = max;\n\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n }\n\n // `hsvToRgb`\n // Converts an HSV color value to RGB.\n // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n // *Returns:* { r, g, b } in the set [0, 255]\n function hsvToRgb(h, s, v) {\n\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n }\n\n // `rgbToHex`\n // Converts an RGB color to hex\n // Assumes r, g, and b are contained in the set [0, 255]\n // Returns a 3 or 6 character hex\n function rgbToHex(r, g, b, allow3Char) {\n\n var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n\n return hex.join(\"\");\n }\n\n // `rgbaToHex`\n // Converts an RGBA color plus alpha transparency to hex\n // Assumes r, g, b are contained in the set [0, 255] and\n // a in [0, 1]. Returns a 4 or 8 character rgba hex\n function rgbaToHex(r, g, b, a, allow4Char) {\n\n var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n\n return hex.join(\"\");\n }\n\n // `rgbaToArgbHex`\n // Converts an RGBA color to an ARGB Hex8 string\n // Rarely used, but required for \"toFilter()\"\n function rgbaToArgbHex(r, g, b, a) {\n\n var hex = [pad2(convertDecimalToHex(a)), pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];\n\n return hex.join(\"\");\n }\n\n // `equals`\n // Can be called with any tinycolor input\n tinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) {\n return false;\n }\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n };\n\n tinycolor.random = function () {\n return tinycolor.fromRatio({\n r: mathRandom(),\n g: mathRandom(),\n b: mathRandom()\n });\n };\n\n // Modification Functions\n // ----------------------\n // Thanks to less.js for some of the basics here\n // \n\n function _desaturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n }\n\n function _saturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n }\n\n function _greyscale(color) {\n return tinycolor(color).desaturate(100);\n }\n\n function _lighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n }\n\n function _brighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var rgb = tinycolor(color).toRgb();\n rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * -(amount / 100))));\n rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * -(amount / 100))));\n rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * -(amount / 100))));\n return tinycolor(rgb);\n }\n\n function _darken(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n }\n\n // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n // Values outside of this range will be wrapped into this range.\n function _spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n }\n\n // Combination Functions\n // ---------------------\n // Thanks to jQuery xColor for some of the ideas behind these\n // \n\n function _complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n }\n\n function _triad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })];\n }\n\n function _tetrad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })];\n }\n\n function _splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l })];\n }\n\n function _analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n\n for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n }\n\n function _monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h,\n s = hsv.s,\n v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n\n while (results--) {\n ret.push(tinycolor({ h: h, s: s, v: v }));\n v = (v + modification) % 1;\n }\n\n return ret;\n }\n\n // Utility Functions\n // ---------------------\n\n tinycolor.mix = function (color1, color2, amount) {\n amount = amount === 0 ? 0 : amount || 50;\n\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n\n var p = amount / 100;\n\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a\n };\n\n return tinycolor(rgba);\n };\n\n // Readability Functions\n // ---------------------\n // false\n // tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\n tinycolor.isReadable = function (color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n\n out = false;\n\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n };\n\n // `mostReadable`\n // Given a base color and a list of possible foreground or background\n // colors for that base, returns the most readable color.\n // Optionally returns Black or White if the most readable color is unreadable.\n // *Example*\n // tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n // tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n // tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n // tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\n tinycolor.mostReadable = function (baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors;\n level = args.level;\n size = args.size;\n\n for (var i = 0; i < colorList.length; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n\n if (tinycolor.isReadable(baseColor, bestColor, { \"level\": level, \"size\": size }) || !includeFallbackColors) {\n return bestColor;\n } else {\n args.includeFallbackColors = false;\n return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n }\n };\n\n // Big List of Colors\n // ------------------\n // \n var names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n };\n\n // Make it easy to access colors via `hexNames[hex]`\n var hexNames = tinycolor.hexNames = flip(names);\n\n // Utilities\n // ---------\n\n // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\n function flip(o) {\n var flipped = {};\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n }\n\n // Return a valid alpha value [0,1] with all invalid values being set to 1\n function boundAlpha(a) {\n a = parseFloat(a);\n\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n\n return a;\n }\n\n // Take input from [0, n] and return it as [0, 1]\n function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = \"100%\";\n }\n\n var processPercent = isPercentage(n);\n n = mathMin(max, mathMax(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n }\n\n // Force a number between 0 and 1\n function clamp01(val) {\n return mathMin(1, mathMax(0, val));\n }\n\n // Parse a base-16 hex value into a base-10 integer\n function parseIntFromHex(val) {\n return parseInt(val, 16);\n }\n\n // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n // \n function isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf('.') != -1 && parseFloat(n) === 1;\n }\n\n // Check to see if string passed in is a percentage\n function isPercentage(n) {\n return typeof n === \"string\" && n.indexOf('%') != -1;\n }\n\n // Force a hex value to have 2 characters\n function pad2(c) {\n return c.length == 1 ? '0' + c : '' + c;\n }\n\n // Replace a decimal with it's percentage value\n function convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n\n return n;\n }\n\n // Converts a decimal to a hex value\n function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n }\n // Converts a hex value to a decimal\n function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n }\n\n var matchers = function () {\n\n // \n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // \n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n }();\n\n // `isValidCSSUnit`\n // Take in a single string / number and check to see if it looks like a CSS unit\n // (see `matchers` above for definition).\n function isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n }\n\n // `stringInputToObject`\n // Permissive string parsing. Take in a number of formats, and output an object\n // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n function stringInputToObject(color) {\n\n color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n } else if (color == 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: \"name\" };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if (match = matchers.rgb.exec(color)) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n if (match = matchers.rgba.exec(color)) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n if (match = matchers.hsl.exec(color)) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n if (match = matchers.hsla.exec(color)) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n if (match = matchers.hsv.exec(color)) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n if (match = matchers.hsva.exec(color)) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n if (match = matchers.hex8.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if (match = matchers.hex4.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n a: convertHexToDecimal(match[4] + '' + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n\n return false;\n }\n\n function validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || { \"level\": \"AA\", \"size\": \"small\" };\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return { \"level\": level, \"size\": size };\n }\n\n exports.default = tinycolor;\n }, {}], 28: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n /**\r\n * Clone from https://github.com/jaxgeller/tweezer.js/blob/master/src/tweezer.js\r\n * Remove the 'Global reference: window'\r\n */\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var raf = require('./raf');\n\n var Tweezer = function () {\n function Tweezer() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, Tweezer);\n\n this.duration = opts.duration || 1000;\n this.ease = opts.easing || this._defaultEase;\n this.start = opts.start;\n this.end = opts.end;\n\n this.frame = null;\n this.next = null;\n this.isRunning = false;\n this.events = {};\n this.direction = this.start < this.end ? 'up' : 'down';\n }\n\n _createClass(Tweezer, [{\n key: 'begin',\n value: function begin() {\n if (!this.isRunning && this.next !== this.end) {\n this.frame = raf(this._tick.bind(this));\n }\n return this;\n }\n }, {\n key: 'stop',\n value: function stop() {\n raf.cancel(this.frame);\n this.isRunning = false;\n this.frame = null;\n this.timeStart = null;\n this.next = null;\n return this;\n }\n }, {\n key: 'on',\n value: function on(name, handler) {\n this.events[name] = this.events[name] || [];\n this.events[name].push(handler);\n return this;\n }\n }, {\n key: 'off',\n value: function off(name, handler) {\n if (!this.events[name]) {\n return this;\n }\n\n if (!handler) {\n this.events[name] = [];\n } else {\n var query = this.events[name];\n var index = query.findIndex(function (value) {\n return value === handler;\n });\n query.splice(index, 1);\n }\n return this;\n }\n }, {\n key: 'emit',\n value: function emit(name, val) {\n var _this = this;\n\n var e = this.events[name];\n e && e.forEach(function (handler) {\n return handler.call(_this, val);\n });\n }\n }, {\n key: '_tick',\n value: function _tick(currentTime) {\n this.isRunning = true;\n\n var lastTick = this.next || this.start;\n\n if (!this.timeStart) this.timeStart = currentTime;\n this.timeElapsed = currentTime - this.timeStart;\n this.next = Math.round(this.ease(this.timeElapsed, this.start, this.end - this.start, this.duration));\n\n if (this._shouldTick(lastTick)) {\n this.emit('tick', this.next);\n this.frame = raf(this._tick.bind(this));\n } else {\n this.emit('tick', this.end);\n this.emit('done', null);\n }\n }\n }, {\n key: '_shouldTick',\n value: function _shouldTick(lastTick) {\n return {\n up: this.next < this.end && lastTick <= this.next,\n down: this.next > this.end && lastTick >= this.next\n }[this.direction];\n }\n }, {\n key: '_defaultEase',\n value: function _defaultEase(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t + b;\n return -c / 2 * (--t * (t - 2) - 1) + b;\n }\n }]);\n\n return Tweezer;\n }();\n\n exports.default = Tweezer;\n }, { \"./raf\": 25 }], 29: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.WxCanvasRenderingContext2D = undefined;\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _helper = require('./helper');\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n // Chart default config\n var WX_CANVAS_DEFAULT_PROPERTY = {\n width: 300,\n height: 200\n };\n var WX_CANVAS_CTX_DEFAULT_PROPERTY = {\n fillStyle: '#000000',\n lineCap: 'butt',\n lineJoin: 'miter',\n miterLimit: 10,\n lineWidth: 1,\n strokeStyle: '#000000',\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n shadowColor: '#000000',\n font: '10px',\n textBaseline: 'alphabetic', // only support top, middle and alphabetic\n textAlign: 'start' // only support start, end and center\n };\n\n // Base text size\n var WX_BASE_TEXT_SIZE = 9;\n\n var pxReg = /([\\d.]+)px/;\n /**\n * Compatible canvas object\n */\n\n var WxCanvas = function () {\n function WxCanvas(id, config, contextOptions) {\n _classCallCheck(this, WxCanvas);\n\n var me = this;\n\n me.isWeiXinAPP = (0, _helper.checkWX)();\n me._config = (0, _helper.extend)({}, WX_CANVAS_DEFAULT_PROPERTY, me.initConfig(config));\n\n // Acquire canvas context\n\n var _acquireContext = this.acquireContext(id, config),\n canvas = _acquireContext.canvas,\n context = _acquireContext.context;\n\n me._canvas = canvas;\n me._ctx = context;\n me.wxCanvasRenderingContext2D = new WxCanvasRenderingContext2D(canvas, context, contextOptions);\n\n return me;\n }\n\n /**\n * Initialization WxCanvas config\n * @param {Object} config\n * @returns {boolean}\n */\n\n _createClass(WxCanvas, [{\n key: 'initConfig',\n value: function initConfig(config) {\n if (!config) {\n return;\n }\n\n if (typeof config.width != 'undefined') {\n config.width = (0, _helper.wxConverToPx)(config.width);\n }\n if (typeof config.height != 'undefined') {\n config.height = (0, _helper.wxConverToPx)(config.height);\n }\n return config;\n }\n\n /**\n * Create Canvas context\n * @param {String} id\n * @param {Object} config\n * @returns {*}\n */\n\n }, {\n key: 'acquireContext',\n value: function acquireContext(id, config) {\n var me = this,\n canvas = void 0,\n context = void 0;\n // Outer canvas config\n var handlerCanvas = config.canvas;\n\n if (me.isWeiXinAPP) {\n if (_helper.is.String(id)) {\n canvas = context = wx.createCanvasContext(id);\n } else {\n throw new Error('Should set an id');\n }\n } else {\n if (handlerCanvas) canvas = handlerCanvas;else canvas = _helper.is.String(id) ? document.getElementById(id) : typeof HTMLCanvasElement != 'undefined' && id instanceof HTMLCanvasElement ? id : null;\n if (typeof canvas != 'undefined') {\n context = canvas.getContext && canvas.getContext('2d');\n }\n }\n\n if (!canvas || !context) {\n console.error(\"Failed to create WxCanvas: can't acquire context!\");\n }\n\n this.initCanvas(canvas);\n return { canvas: canvas, context: context };\n }\n\n /**\n * Initializes the HTMLCanvasElement style and render size without modifying the canvas display size\n */\n\n }, {\n key: 'initCanvas',\n value: function initCanvas(canvas) {\n var config = this._config,\n renderHeight = void 0,\n renderWidth = void 0,\n display = void 0,\n height = void 0,\n width = void 0;\n height = config.height;\n width = config.width;\n\n if (this.isWeiXinAPP) {\n renderHeight = height;\n renderWidth = width;\n display = config.display;\n } else {\n var style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n renderHeight = canvas.getAttribute('height');\n renderWidth = canvas.getAttribute('width');\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n\n if (renderWidth === null || renderWidth === '') {\n var displayWidth = width || (0, _helper.readUsedSize)(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n width = displayWidth;\n }\n }\n\n if (renderHeight === null || renderHeight === '') {\n if (!height && canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = height = canvas.width / (config.aspectRatio || 2);\n } else {\n var displayHeight = height || (0, _helper.readUsedSize)(canvas, 'height');\n if (displayWidth !== undefined) {\n canvas.height = displayHeight;\n height = displayHeight;\n }\n }\n }\n }\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n config._wxChart = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: display,\n height: height,\n width: width\n }\n }\n };\n\n return canvas;\n }\n\n /**\n * Restores the canvas initial state, such as render/display sizes and style.\n */\n\n }, {\n key: 'releaseContext',\n value: function releaseContext() {\n var canvas = this._canvas,\n config = this._config;\n if (!config._wxChart) {\n return;\n }\n\n var initial = config._wxChart.initial;\n if (this.isWeiXinAPP) {\n // Do nothing\n } else {\n ['height', 'width'].forEach(function (prop) {\n var value = initial[prop];\n if (value === undefined || value === null) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n var style = initial.style;\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = Object.keys(style)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var key = _step.value;\n\n canvas.style[key] = style[key];\n }\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n canvas.width = canvas.width;\n }\n\n delete config._wxChart;\n }\n }, {\n key: 'getContext',\n value: function getContext(str) {\n if (str === '2d') {\n return this.wxCanvasRenderingContext2D;\n }\n }\n\n // Property\n\n }, {\n key: 'height',\n get: function get() {\n if (this.isWeiXinAPP) {\n return this._config.height;\n } else {\n var renderHeight = (0, _helper.wxConverToPx)(this._canvas.getAttribute('height'));\n if (renderHeight === null || renderHeight === '') {\n return (0, _helper.readUsedSize)(canvas, 'height');\n }\n return renderHeight;\n }\n },\n set: function set(val) {\n if (this.isWeiXinAPP) {\n // Can not set WeiXin app height\n } else {\n this._canvas.height = val;\n }\n }\n }, {\n key: 'width',\n get: function get() {\n if (this.isWeiXinAPP) {\n return this._config.width;\n } else {\n var renderWidth = (0, _helper.wxConverToPx)(this._canvas.getAttribute('width'));\n if (renderWidth === null || renderWidth === '') {\n return (0, _helper.readUsedSize)(canvas, 'width');\n }\n return renderWidth;\n }\n },\n set: function set(val) {\n if (this.isWeiXinAPP) {\n // Can not set WeiXin app height\n } else {\n this._canvas.width = val;\n }\n }\n }]);\n\n return WxCanvas;\n }();\n\n exports.default = WxCanvas;\n\n var WxCanvasRenderingContext2D = exports.WxCanvasRenderingContext2D = function () {\n function WxCanvasRenderingContext2D(canvas, context, options) {\n _classCallCheck(this, WxCanvasRenderingContext2D);\n\n var me = this;\n\n me.canvas = canvas;\n me._ctx = context;\n me.isWeiXinAPP = (0, _helper.checkWX)();\n\n // Canvas property cache stack\n me._ctxOptions = options;\n me._propertyCache = [(0, _helper.extend)({}, WX_CANVAS_CTX_DEFAULT_PROPERTY, options)];\n me.cp = me._propertyCache[0];\n\n me.createStyleProperty();\n me.createShadowsProperty();\n me.createTextProperty();\n me.createLineProperty();\n me.createRectProperty();\n me.createGradientProperty();\n me.createPathProperty();\n me.createTransformationProperty();\n me.createGlobalAlphaProperty();\n return me;\n }\n\n // Save function\n\n\n _createClass(WxCanvasRenderingContext2D, [{\n key: 'save',\n value: function save() {\n var me = this;\n me._ctx.save();\n var nProperty = (0, _helper.extend)({}, WX_CANVAS_CTX_DEFAULT_PROPERTY, me._ctxOptions);\n me._propertyCache.push(nProperty);\n me.cp = nProperty;\n return me.cp;\n }\n\n // Restore function\n\n }, {\n key: 'restore',\n value: function restore() {\n var me = this;\n me._ctx.restore();\n if (me.cp != null && me._propertyCache.length > 1) {\n me._propertyCache.pop();\n me.cp = me._propertyCache[me._propertyCache.length - 1];\n }\n return me.cp;\n }\n\n // Property\n\n }, {\n key: '_wxSetPropertyCallable',\n value: function _wxSetPropertyCallable(value, propertyName) {\n var wxSetName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'set' + propertyName.replace(/(\\w)/, function (v) {\n return v.toUpperCase();\n });\n\n var me = this;\n\n if (_helper.is.Null(value) || _helper.is.Undefined(value)) {\n return value;\n }\n\n //performance\n if (me.cp[propertyName] === value) {\n return value;\n }\n\n if (me.isWeiXinAPP) {\n me._ctx[wxSetName](value);\n me.cp[propertyName] = value;\n } else {\n me._ctx[propertyName] = value;\n me.cp[propertyName] = me._ctx[propertyName];\n }\n return value;\n }\n\n // Normally property weixin app not support\n\n }, {\n key: '_wxSetProperty',\n value: function _wxSetProperty(value, propertyName) {\n var setWX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var me = this;\n\n if (_helper.is.Null(value) || _helper.is.Undefined(value)) {\n return value;\n }\n\n //performance\n if (me.cp[propertyName] === value) {\n return value;\n }\n\n if (me.isWeiXinAPP) {\n me.cp[propertyName] = value;\n setWX ? me._ctx[propertyName] = value : null;\n } else {\n me._ctx[propertyName] = value;\n me.cp[propertyName] = me._ctx[propertyName];\n }\n return value;\n }\n }, {\n key: 'createStyleProperty',\n value: function createStyleProperty() {\n var me = this;\n\n var styleProperty = ['fillStyle', 'strokeStyle'];\n styleProperty.forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n if (value) {\n return me._wxSetPropertyCallable(value.toLowerCase(), p);\n }\n }\n });\n });\n }\n }, {\n key: 'createShadowsProperty',\n value: function createShadowsProperty() {\n var _this = this;\n\n var me = this;\n // Shadow property\n ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'shadowColor'].forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n var me = _this;\n // performance\n if (me.cp[p] === value) {\n return;\n }\n\n if (me.isWeiXinAPP) {\n me.cp[p] = value;\n me._ctx.setShadow(me.cp['shadowOffsetX'] || 0, me.cp['shadowOffsetY'] || 0, me.cp['shadowBlur'] || 0, me.cp['shadowColor'] || '#000000');\n } else if (!_helper.is.Null(value) && !_helper.is.Undefined(value)) {\n me._ctx[p] = value;\n me.cp[p] = value;\n }\n return value;\n }\n });\n });\n }\n\n // Text property\n\n }, {\n key: 'createTextProperty',\n value: function createTextProperty() {\n var me = this;\n\n ['textAlign', 'textBaseline'].forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n return me._wxSetProperty(value, p);\n }\n });\n });\n\n Object.defineProperty(me, 'font', {\n get: function get() {\n return me.cp.font;\n },\n set: function set(value) {\n if (me.isWeiXinAPP) {\n var m = value.match(pxReg);\n if (!!m && me.cp.font !== value) {\n var fontSize = +m[1];\n me._ctx.setFontSize(fontSize);\n me.cp.font = value;\n }\n } else {\n if (me.cp.font !== value) {\n me._ctx.font = value;\n me.cp.font = value;\n }\n }\n return me.cp.font;\n }\n });\n\n Object.defineProperty(me, 'fontSize', {\n get: function get() {\n return parseInt(me.cp.font);\n },\n set: function set(value) {\n var fontSize = parseInt(value);\n if (_helper.is.NaN(fontSize)) {\n return;\n }\n\n var currentFont = me.isWeiXinAPP ? me.cp.font : me._ctx.font;\n currentFont = currentFont.replace(pxReg, fontSize + 'px');\n if (currentFont === me.cp.font) {\n return me.cp.font;\n }\n if (me.isWeiXinAPP) {\n me._ctx.setFontSize(fontSize);\n me.cp.font = currentFont;\n } else {\n me._ctx.font = currentFont;\n me.cp.font = currentFont;\n }\n return me.cp.font;\n }\n });\n }\n // Wrapper 'measureText' function for WeiXin APP\n\n }, {\n key: 'measureText',\n value: function measureText(text) {\n var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.fontSize;\n\n var me = this;\n if (me.isWeiXinAPP) {\n if (!text) {\n return 0;\n }\n var textLen = text.length;\n var hanzi = text.match(new RegExp(_helper.REG_HANZI, 'g'));\n var hanziNum = !!hanzi ? hanzi.length : 0;\n var otherNum = textLen - hanziNum;\n\n return {\n 'width': fontSize * (otherNum + hanziNum * 2) / 2 + fontSize / 4\n };\n } else {\n return me._ctx.measureText(text);\n }\n }\n }, {\n key: '_calculateYForTextBaseline',\n value: function _calculateYForTextBaseline(y, text) {\n var baseNum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : WX_BASE_TEXT_SIZE;\n\n var me = this,\n culY = y;\n\n if (!me.isWeiXinAPP) {\n return culY;\n }\n\n var fontSize = me.fontSize;\n var textBaseline = me.textBaseline;\n switch (textBaseline) {\n case 'top':\n culY = fontSize * baseNum / 10 + y;\n break;\n case 'middle':\n culY = fontSize * baseNum / 20 + y;\n break;\n case 'alphabetic':\n break;\n }\n return culY;\n }\n }, {\n key: '_calculateXFortextAlign',\n value: function _calculateXFortextAlign(x, text) {\n var baseNum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : WX_BASE_TEXT_SIZE;\n\n var me = this,\n culX = x;\n if (!me.isWeiXinAPP) {\n return culX;\n }\n\n var textAlign = me.textAlign;\n switch (textAlign) {\n case 'end':\n culX = x - me.measureText(text).width;\n break;\n case 'center':\n culX = x - me.measureText(text).width / 2;\n break;\n case 'start':\n break;\n }\n return culX;\n }\n /**\n * Overwrite fillText\n * Weixin 0.12 not support 'textBaseline', 'textAlign' attribute, so we should figure out it.\n * @param text\n * @param x\n * @param y\n * @param options - [maxWidth, baseNum = WX_BASE_TEXT_SIZE]\n * @returns {*}\n */\n\n }, {\n key: 'fillText',\n value: function fillText(text, x, y) {\n for (var _len = arguments.length, options = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n options[_key - 3] = arguments[_key];\n }\n\n var me = this,\n maxWidth = 0 in options ? options[0] : undefined,\n baseNum = 1 in options ? options[1] : WX_BASE_TEXT_SIZE;\n if (me.isWeiXinAPP) {\n var culX = void 0,\n culY = void 0;\n culY = me._calculateYForTextBaseline(y, text, baseNum);\n culX = me._calculateXFortextAlign(x, text, baseNum);\n return me._ctx.fillText(text, culX, culY);\n } else {\n return me._ctx.fillText(text, x, y, maxWidth);\n }\n }\n }, {\n key: 'strokeText',\n value: function strokeText(text, x, y) {\n var me = this;\n\n for (var _len2 = arguments.length, options = Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {\n options[_key2 - 3] = arguments[_key2];\n }\n\n if (me.isWeiXinAPP) {\n return me.fillText.apply(me, [text, x, y].concat(options));\n } else {\n var _me$_ctx;\n\n return (_me$_ctx = me._ctx).strokeText.apply(_me$_ctx, [text, x, y].concat(options));\n }\n }\n\n // Line property\n\n }, {\n key: 'createLineProperty',\n value: function createLineProperty() {\n var me = this;\n var smProperty = ['lineCap', 'lineJoin', 'miterLimit', 'lineWidth'];\n smProperty.forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n return me._wxSetPropertyCallable(value, p);\n }\n });\n });\n\n ['lineDashOffset'].forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n return me._wxSetProperty(value, p);\n }\n });\n });\n }\n }, {\n key: 'setLineDash',\n value: function setLineDash() {}\n }, {\n key: 'getLineDash',\n value: function getLineDash() {}\n\n // Drawing rectangles\n\n }, {\n key: 'createRectProperty',\n value: function createRectProperty() {\n var me = this;\n ['clearRect', 'fillRect', 'strokeRect'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx2;\n\n return (_me$_ctx2 = me._ctx)[functionName].apply(_me$_ctx2, arguments);\n };\n });\n }\n\n // Gradient\n\n }, {\n key: 'createGradientProperty',\n value: function createGradientProperty() {\n var me = this;\n ['createLinearGradient'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx3;\n\n return (_me$_ctx3 = me._ctx)[functionName].apply(_me$_ctx3, arguments);\n };\n });\n }\n }, {\n key: 'createRadialGradient',\n value: function createRadialGradient(x0, y0, r0, x1, y1, r1) {\n var me = this;\n if (me.isWeiXinAPP) {\n return me._ctx.createCircularGradient(x0, y0, r0);\n } else {\n return me._ctx.createRadialGradient(x0, y0, r0, x1, y1, r1);\n }\n }\n\n // Paths and Drawing paths\n\n }, {\n key: 'createPathProperty',\n value: function createPathProperty() {\n var me = this;\n ['beginPath', 'closePath', 'moveTo', 'lineTo', 'bezierCurveTo', 'quadraticCurveTo', 'arc', 'rect'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx4;\n\n return (_me$_ctx4 = me._ctx)[functionName].apply(_me$_ctx4, arguments);\n };\n });\n\n ['fill', 'stroke'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx5;\n\n return (_me$_ctx5 = me._ctx)[functionName].apply(_me$_ctx5, arguments);\n };\n });\n }\n }, {\n key: 'clip',\n value: function clip() {\n var me = this;\n if (me.isWeiXinAPP) {\n throw new Error('WeiXin APP not support \"clip\" function yet!');\n } else {\n var _me$_ctx6;\n\n return (_me$_ctx6 = me._ctx).clip.apply(_me$_ctx6, arguments);\n }\n }\n\n // Transformations\n\n }, {\n key: 'createTransformationProperty',\n value: function createTransformationProperty() {\n var me = this;\n ['rotate', 'scale', 'translate'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx7;\n\n return (_me$_ctx7 = me._ctx)[functionName].apply(_me$_ctx7, arguments);\n };\n });\n }\n }, {\n key: 'transform',\n value: function transform() {\n var me = this;\n if (me.isWeiXinAPP) {\n throw new Error('WeiXin APP not support \"transform\" function yet!');\n } else {\n var _me$_ctx8;\n\n return (_me$_ctx8 = me._ctx).transform.apply(_me$_ctx8, _toConsumableArray(args));\n }\n }\n\n // globalAlpha\n\n }, {\n key: 'createGlobalAlphaProperty',\n value: function createGlobalAlphaProperty() {\n var me = this;\n ['globalAlpha'].forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n return me._wxSetPropertyCallable(value, p);\n }\n });\n });\n }\n // Draw function\n\n }, {\n key: 'draw',\n value: function draw() {\n var ctu = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n if (this.isWeiXinAPP) {\n this._ctx.draw(ctu);\n }\n }\n }]);\n\n return WxCanvasRenderingContext2D;\n }();\n }, { \"./helper\": 24 }], 30: [function (require, module, exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.WxBar = exports.WxLiner = exports.WxDoughnut = exports.WxChart = exports.getChartInstances = undefined;\n\n var _wxChart = require('./charts/wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _doughnut = require('./charts/doughnut');\n\n var _doughnut2 = _interopRequireDefault(_doughnut);\n\n var _liner = require('./charts/liner');\n\n var _liner2 = _interopRequireDefault(_liner);\n\n var _bar = require('./charts/bar');\n\n var _bar2 = _interopRequireDefault(_bar);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n exports.getChartInstances = _wxChart.getChartInstances;\n exports.WxChart = _wxChart2.default;\n exports.WxDoughnut = _doughnut2.default;\n exports.WxLiner = _liner2.default;\n exports.WxBar = _bar2.default;\n }, { \"./charts/bar\": 10, \"./charts/doughnut\": 11, \"./charts/liner\": 12, \"./charts/wxChart\": 13 }] }, {}, [30])(30);\n});"]}
\ No newline at end of file
+{"version":3,"sources":["/dist/wx-chart.min.js"],"names":["_typeof2","Symbol","iterator","obj","constructor","prototype","f","exports","module","define","amd","g","window","global","self","this","WxChart","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","./lib/bezier","2","getABC","S","B","E","utils","projectionratio","um","C","x","y","abcratio","A","abs","Math","min","max","acos","sqrt","pi","PI","ZERO","z","PolyBezier","Bezier","coords","args","forEach","slice","arguments","coordlen","newargs","point","d","push","higher","len","_3d","points","idx","step","order","dims","dimlen","curve","align","p1","p2","_linear","_t1","_t2","update","fromSVG","svgString","list","match","map","parseFloat","relative","test","v","quadraticFromPoints","p3","abc","cubicFromPoints","d1","dist","d2","selen","lx","ly","bx1","by1","bx2","by2","e1","e2","v1","v2","nc1","nc2","getUtils","valueOf","toString","pointsToString","toSVG","p","last","join","dpoints","c","dpt","j","computedirection","angle","clockwise","derivative","bind","_lut","getLUT","steps","compute","on","error","lut","hits","project","LUT","closest","mdist","mpos","pt","ft","t1","t2","get","mt","ret","b","mt2","dCpts","JSON","parse","stringify","splice","raise","pim","np","k","inflections","normal","__normal3","__normal2","q","r1","r2","q1","q2","m","R","hull","_p","lerp","split","left","right","result","span","subsplit","extrema","mfn","roots","dim","droots","concat","filter","sort","indexOf","values","bbox","getminmax","overlaps","lbbox","tbbox","bboxoverlap","offset","nv","reduced","reduce","scale","simple","a1","a2","n1","n2","segment","pass1","pass2","distanceFn","lli4","copy","ov","rc","outline","d3","d4","linearDistanceFunction","tlen","alen","slen","f1","f2","fcurves","bcurves","graduated","reverse","fs","fe","bs","be","ls","makeline","le","segments","outlineshapes","curveIntersectionThreshold","curves","shapes","shape","makeshape","startcap","virtual","endcap","intersects","lineIntersects","curveintersects","selfintersects","line","mx","my","MX","MY","between","results","c1","c2","pairs","intersections","pair","pairiteration","arcs","errorThreshold","circles","_iterate","_error","pc","np1","ref","safety","np2","np3","arc","prev_arc","done","curr_good","prev_good","prev_e","getccenter","interval","start","end","./poly-bezier.js","./utils.js","3","addCurve","expandbox","4","cos","sin","atan2","pow","crt","tau","quart","epsilon","nMax","Number","MAX_SAFE_INTEGER","nMin","MIN_SAFE_INTEGER","Tvalues","Cvalues","arcfn","derivativeFn","M","approximately","precision","sum","ds","de","ts","te","pointToString","dx1","dy1","dx2","dy2","cross","dot","round","pos","substring","dx","dy","bottom","top","lli8","x1","y1","x2","y2","x3","y3","x4","y4","nx","ny","p4","lli","findbbox","sections","mid","size","shapeintersections","s1","bbox1","s2","bbox2","forward","back","l1","l2","iss","bpl","fpl","tx","ty","m1","m2","u1","pa","pb","pd","discriminant","mp3","mp33","cosphi","phi","crtr","sd","v3","trm","sq","b1","b2","_bbox","c1b","c2b","threshold","cc1","cc2","_","dx1p","dy1p","dx2p","dy2p","mx1","my1","mx2","my2","mx1n","my1n","mx2n","my2n","./bezier","5","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","Mixins","value","mixins","context","options","opt","warn","mergeDuplicates","contextMethods","getOwnPropertyNames","reactMethods","undefined","Array","mixin","grabMethods","mm","currentMixin","cm","orig","newMethod","_this","mixinMethods","method","checkForMatch","_this2","ctxMethod","extendMethod","console","name","addNewMethod","mix","init","6","Ez","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","7","create","off","emit","8","process","getNanoSeconds","hrtime","loadTime","moduleLoadTime","nodeLoadTime","upTime","performance","now","hr","uptime","Date","getTime","_process","9","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","setTimeout","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","queue","queueIndex","drainQueue","timeout","run","Item","array","noop","nextTick","apply","title","browser","env","argv","version","versions","addListener","once","removeListener","removeAllListeners","binding","cwd","chdir","dir","umask","10","tinycolor","color","opts","rgb","inputToRGB","_originalInput","_r","_g","_b","_a","_roundA","mathRound","_format","format","_gradientType","gradientType","_ok","ok","_tc_id","tinyCounter","stringInputToObject","isValidCSSUnit","rgbToRgb","String","substr","h","convertToPercentage","hsvToRgb","hslToRgb","hasOwnProperty","boundAlpha","mathMin","mathMax","bound01","rgbToHsl","hue2rgb","rgbToHsv","floor","mod","rgbToHex","allow3Char","hex","pad2","charAt","rgbaToHex","allow4Char","convertDecimalToHex","rgbaToArgbHex","_desaturate","amount","hsl","toHsl","clamp01","_saturate","_greyscale","desaturate","_lighten","_brighten","toRgb","_darken","_spin","hue","_complement","_triad","_tetrad","_splitcomplement","_analogous","slices","part","_monochromatic","hsv","toHsv","modification","flip","flipped","isNaN","isOnePointZero","processPercent","isPercentage","parseInt","val","parseIntFromHex","convertHexToDecimal","matchers","CSS_UNIT","exec","replace","trimLeft","trimRight","toLowerCase","named","names","rgba","hsla","hsva","hex8","hex6","hex4","hex3","validateWCAG2Parms","parms","level","toUpperCase","mathRandom","random","isDark","getBrightness","isLight","isValid","getOriginalInput","getFormat","getAlpha","getLuminance","RsRGB","GsRGB","BsRGB","G","setAlpha","toHsvString","toHslString","toHex","toHexString","toHex8","toHex8String","toRgbString","toPercentageRgb","toPercentageRgbString","toName","hexNames","toFilter","secondColor","hex8String","secondHex8String","formatSet","formattedString","hasAlpha","needsAlphaFormat","clone","_applyModification","fn","lighten","brighten","darken","saturate","greyscale","spin","_applyCombination","analogous","complement","monochromatic","splitcomplement","triad","tetrad","fromRatio","newColor","equals","color1","color2","rgb1","rgb2","readability","isReadable","wcag2","wcag2Parms","out","mostReadable","baseColor","colorList","includeFallbackColors","bestColor","bestScore","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","burntsienna","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","CSS_INTEGER","CSS_NUMBER","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","RegExp","11","_interopRequireDefault","__esModule","default","_toConsumableArray","arr","isArray","arr2","from","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","setPrototypeOf","__proto__","_get","object","property","receiver","Function","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","_es6Mixins","_es6Mixins2","_helper","_randomColor","_randomColor2","_wxCanvas","_wxChart","_wxChart2","_title","_title2","_scale","_scale3","_scale4","_scale5","_scale6","_scale7","_scale8","_scale9","_scale10","_legend","_legend2","_layout","_layout2","_animation","_animation2","WX_BAR_LEGEND_DEFAULT_CONFIG","borderWidth","fillArea","fillAlpha","display","barPercentage","WX_BAR_DEFAULT_CONFIG","minBetweenPixel","pointPercentage","stacked","zeroLine","xScaleOptions","position","xScaleItemOptions","yScaleOptions","yScaleItemOptions","crossScaleOptions","xMargin","xBox","yBox","area","xScale","yScale","xScaleDatasets","calculateTickWidth","xFirstPointSpace","legends","legendOptions","luminosity","defaultKey","animate","animateOptions","duration","WX_BAR_ITEM_DEFAULT_CONFIG","showItem","WxBar","_WxChart","id","config","__drawBar","percent","box","legend","hasNeg","setBarItem","ctx","px","py","width","height","data","index","fillStyle","strokeStyle","label","_p$point","pointX","pointY","barWidth","barHeight","save","lineWidth","beginPath","globalAlpha","rect","fill","moveTo","lineTo","stroke","curFillStyle","textBaseline","barItem","is","itemX","measureText","itemY","fontSize","fillText","draw","restore","me","chartConfig","extend","PureObject","titleText","text","yAxis","xAxis","wxCrossScale","wxLayout","wxAnimation","legendsConfig","labels","datasets","_labels","_legends","removeAllBox","reset","_me$chartConfig","adjustBox","addBox","rColors","count","borderColor","_drawScale","barRuler","calculateBarRuler","barConfigs","legendIndex","dataset","visDatasets","calculateBarRect","bar","drawBar","animation","_darwZeroLine","baseY","getPoint","ex","barData","backgroundColor","animateOpt","dataLen","categoryTicks","lastData","toNext","dataIndex","currData","lastDataIndex","lastPercent","lastx","lasty","lastWidth","lastHeight","fillRect","clearRect","_lastData","_me$__drawBar","actionAnimation","_getAnimationDrawBar","pushActions","_drawBar","globalBarWidth","globalBarPercentage","legendLen","tickWidth","pointWidth","pointIntervalWidth","totalStandardPercentage","_standardPercentage","standardPercentage","barIntervalWidth","legendOpt","frontBarWidth","acc","cur","Null","Undefined","xPoint","yPoint","xPointInstance","_getStackPoint","__sumNeg","__sumPos","xDatasets","xScaleAxisDatas","yDatasets","yScaleAxisDatas","_me$wxCrossScale$draw","tickLimits","calculateTickLimit","_me$stackYScaleAxisLi","stackYScaleAxisLimit","buildDatasets","_visDatasets$reduce","pre","curValue","_max","_min","xScaleConfig","item","tmp","_getLegendConfig","set","../core/animation","../core/layout","../core/legend","../core/scale","../core/title","../scale/scale.category","../scale/scale.crosshelp","../scale/scale.liner","../scale/scale.stackhelp","../util/helper","../util/randomColor","../util/wxCanvas","./wxChart","es6-mixins","tinycolor2","12","WX_DOUGHNUT_DEFAULT_CONFIG","cutoutPercentage","rotation","padding","labelDistancePercentage","WX_DOUGHNUT_ITEM_DEFAULT_CONFIG","percentage","WxDoughnut","rBorderColor","legendDatasets","_box","outerWidth","outerHeight","minSize","outerRadius","totalValue","calculateTotal","longestLabelWidth","_longestLabel","maximalFontSize","_maximalLabelFontSize","shouldSpace","widthSpace","innerRadius","totalAngle","drawDoughnut","startAngle","endAngle","currentRadius","closePath","lineJoin","centerAngle","startX","startY","offsetRadius","turnRadius","turnX","turnY","adjustPoint","avoidCollision","textLen","endX","endY","textX","textY","_getAnimationDrawDoughnut","_drawDoughnut","aniTotal","lastt","currTotalAngle","drawAngle","drawData","initAvoidCollision","drawLabel","maxLabelWidth","_lastPoint","newPoint","centerPoint","avoidUnit","cpx","lpx","lpy","npx","npy","13","WX_LINE_LEGEND_DEFAULT_CONFIG","spanGaps","tension","WX_LINER_DEFAULT_CONFIG","discardNeg","WX_LINER_ITEM_DEFAULT_CONFIG","pointRadius","pointStyle","pointBorderWidth","pointBorderColor","WxLiner","_initialiseProps","lineConfigs","yAxisPoint","xAxisPoint","_me$_getStackValue","_getStackValue","sumPos","curr","drawLine","lineData","xAxisY","firstPoint","currPoint","_lineToPoint","_getNextPoint","__fillInHere","prePoint","_drawPoint","preData","_getAnimationDrawLine","_drawLine","_this3","_animateLineTick","ln","sp","bp","_getCurr","_getNext","nextDate","next","_getPre","preDate","_getPrePoint","controlPoints","splineCurve","bezierCurveTo","previous","_animateLineToPoint","pert","curt","p0","bz","sbz","startPoint","endPoint","totalPath","cosAngle","sinAngle","_p$data","drawCurrPoint","pret","ppPoint","diffIndex","bezier-js","14","getChartInstances","wxChartInstances","_wxCanvas2","_mitt","_mitt2","wxChartDefaultConfig","chartConf","canvas","getContext","isWeiXinAPP","checkWX","_id","uid","_config","initConfig","initContext","cvWidth","cvHeight","aspectRatio","toFixed","retinaScale","innerBox","BoxInstance","clear","releaseContext","defaultItemOpt","_datasets","_visDatasets","total","NaN","hidden","mitt","15","_interopRequireWildcard","newObj","wxAnimationActLinker","actions","action","_arguments","_len","_key","WxAnimation","_tweezer","_tweezer2","_ez","ez","currentActionIndex","handOverAction","stop","tweenzerHandler","started","resetActions","easeFun","easeType","easing","mit","preRet","caindex","nextAction","parallel","tickRet","actionsLen","rets","runTickParallel","runTick","tick","begin","../util/tweezer","ez.js","16","WxBaseComponent","wxChart","defaultOptions","calculateBox","isVisiable","redraw","../charts/wxChart","./layout","17","_base","_base2","margin","boxInstance","ey","rx","ry","marginLR","marginTB","WxLayout","_boxs","boxId","./base","18","_typeof","WX_LEGEND_DEFAULT_CONFIG","fullWidth","boxWidth","WX_LEGEND_DEFAULT_ITEM_CONFIG","WxLegend","_WxBaseComponent","calculateLegendItem","labelsConfig","textWidth","_prop","boxHeight","isHorizontal","lineNum","currentLineWidth","maxLineWidth","prop","_ret2","wh","currentLineNum","currentX","currentY","lineCap","_dataset$_prop","textAlign","thisX","strokeRect","19","WX_SCALE_DEFAULT_CONFIG","extendLeft","extendTop","titleFontSize","titleFontColor","gridLines","ticks","autoSkip","fontColor","minRotation","maxRotation","WX_SCALE_DEFAULT_ITEM_CONFIG","WxScale","maxTextLen","getTicksText","fixPadding","visTicks","firstTickText","lastTickText","calculateFixPadding","minWidth","minHeight","maxWidth","maxHeight","minFontRotation","toRadians","maxFontRotation","fontRadians","lineSpace","longestText","titleWidth","ticketWidth","defaultLineWidth","totalLineWidth","innerWidth","calculateTitleWidth","innerHeight","titleHeight","baseX","_getTicksLineWidthOffset","sx","sy","_initDrawATickText","translate","rotate","tickConfig","_me$getTicksPosition","getTicksPosition","currX","currY","_drawATickLine","_lineSpace","20","WX_TITLE_DEFAULT_CONFIG","WxTitle","21","_scale2","WxCategoryScale","_WxScale","maxIndex","minIndex","buildTicks","22","WX_CROSSSCALE_CONFIG","WxCrossScale","yScaleDatasets","_me$config","yMHeight","xMWidth","xOffset","xExtendLeft","xAxisXPoint","calXbox","setBox","23","WxLinerScale","maxTicks","stepSize","spacing","niceRange","niceNum","niceMin","niceMax","ceil","numSpaces","almostEquals","scaleOptions","tickOpts","maxTicksLimit","startVal","endVal","range","realWidth","realHeight","24","WxStackMixin","sumNeg","stackedVal","offsetValue","25","_assignGenerator","own","_copy","deep","source","Boolean","shift","sc","_target","so","to","wx","wxConverToPx","windowSize","getWindowSize","rpxReg","windowWidth","remReg","degrees","toDegrees","radians","windowHeight","getSystemInfoSync","getDPR","pixelRatio","devicePixelRatio","exponent","log10","fraction","niceFraction","middlePoint","afterPoint","current","d01","d12","s01","s12","fa","fb","getStyle","element","currentStyle","document","defaultView","getComputedStyle","getPropertyValue","readUsedSize","matches","style","ObjProto","type","class2type","hasOwn","fnToString","ObjectFunctionString","proto","Ctor","REG_HANZI","REG_ALPHABET","REG_NUMBER","REG_ALPHABET_NUMBER","extendOwn","26","root","isWx","vendors","suffix","raf","caf","frameDuration","callback","_now","cp","_i","cancelled","handle","_i2","_root","cancel","polyfill","requestAnimationFrame","cancelAnimationFrame","performance-now","27","pickHue","hueRange","getHueRange","randomWithin","pickSaturation","saturationRange","getSaturationRange","sMin","sMax","pickBrightness","H","bMin","getMinimumBrightness","bMax","setFormat","HSVtoHSL","hslColor","alpha","HSVtoRGB","rgbColor","HSVtoHex","lowerBounds","getColorInfo","colorInput","number","colorDictionary","colorName","seed","rnd","componentToHex","defineColor","brightnessRange","loadColorBounds","h_i","stringToInteger","string","charCodeAt","randomColor","totalColors","colors","28","Tweezer","ease","_defaultEase","frame","isRunning","events","direction","_tick","timeStart","handler","query","findIndex","currentTime","lastTick","timeElapsed","_shouldTick","up","down","./raf","29","WxCanvasRenderingContext2D","WX_CANVAS_DEFAULT_PROPERTY","WX_CANVAS_CTX_DEFAULT_PROPERTY","miterLimit","shadowBlur","shadowOffsetX","shadowOffsetY","shadowColor","font","WX_BASE_TEXT_SIZE","pxReg","WxCanvas","contextOptions","_acquireContext","acquireContext","_canvas","_ctx","wxCanvasRenderingContext2D","handlerCanvas","createCanvasContext","getElementById","HTMLCanvasElement","initCanvas","renderHeight","renderWidth","getAttribute","displayWidth","displayHeight","initial","removeAttribute","setAttribute","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","keys","err","return","str","_ctxOptions","_propertyCache","createStyleProperty","createShadowsProperty","createTextProperty","createLineProperty","createRectProperty","createGradientProperty","createPathProperty","createTransformationProperty","createGlobalAlphaProperty","nProperty","pop","propertyName","wxSetName","setWX","styleProperty","_wxSetPropertyCallable","setShadow","_wxSetProperty","setFontSize","currentFont","hanzi","hanziNum","otherNum","baseNum","culY","culX","_calculateYForTextBaseline","_calculateXFortextAlign","_len2","_key2","_me$_ctx","strokeText","smProperty","functionName","_me$_ctx2","_me$_ctx3","x0","y0","r0","createCircularGradient","createRadialGradient","_me$_ctx4","_me$_ctx5","_me$_ctx6","clip","_me$_ctx7","_me$_ctx8","transform","ctu","./helper","30","_doughnut","_doughnut2","_liner","_liner2","_bar","_bar2","./charts/bar","./charts/doughnut","./charts/liner","./charts/wxChart"],"mappings":"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","file":"wx-chart.min.js","sourcesContent":["\"use strict\";\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (f) {\n if ((typeof exports === \"undefined\" ? \"undefined\" : _typeof2(exports)) === \"object\" && typeof module !== \"undefined\") {\n module.exports = f();\n } else if (typeof define === \"function\" && define.amd) {\n define([], f);\n } else {\n var g;if (typeof window !== \"undefined\") {\n g = window;\n } else if (typeof global !== \"undefined\") {\n g = global;\n } else if (typeof self !== \"undefined\") {\n g = self;\n } else {\n g = this;\n }g.WxChart = f();\n }\n})(function () {\n var define, module, exports;return function e(t, n, r) {\n function s(o, u) {\n if (!n[o]) {\n if (!t[o]) {\n var a = typeof require == \"function\" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);var f = new Error(\"Cannot find module '\" + o + \"'\");throw f.code = \"MODULE_NOT_FOUND\", f;\n }var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) {\n var n = t[o][1][e];return s(n ? n : e);\n }, l, l.exports, e, t, n, r);\n }return n[o].exports;\n }var i = typeof require == \"function\" && require;for (var o = 0; o < r.length; o++) {\n s(r[o]);\n }return s;\n }({ 1: [function (require, module, exports) {\n module.exports = require('./lib/bezier');\n }, { \"./lib/bezier\": 2 }], 2: [function (require, module, exports) {\n /**\n A javascript Bezier curve library by Pomax.\n \n Based on http://pomax.github.io/bezierinfo\n \n This code is MIT licensed.\n **/\n (function () {\n \"use strict\";\n\n // math-inlining.\n\n var abs = Math.abs,\n min = Math.min,\n max = Math.max,\n acos = Math.acos,\n sqrt = Math.sqrt,\n pi = Math.PI,\n\n // a zero coordinate, which is surprisingly useful\n ZERO = { x: 0, y: 0, z: 0 };\n\n // quite needed\n var utils = require('./utils.js');\n\n // not quite needed, but eventually this'll be useful...\n var PolyBezier = require('./poly-bezier.js');\n\n /**\n * Bezier curve constructor. The constructor argument can be one of three things:\n *\n * 1. array/4 of {x:..., y:..., z:...}, z optional\n * 2. numerical array/8 ordered x1,y1,x2,y2,x3,y3,x4,y4\n * 3. numerical array/12 ordered x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4\n *\n */\n var Bezier = function Bezier(coords) {\n var args = coords && coords.forEach ? coords : [].slice.call(arguments);\n var coordlen = false;\n if (_typeof2(args[0]) === \"object\") {\n coordlen = args.length;\n var newargs = [];\n args.forEach(function (point) {\n ['x', 'y', 'z'].forEach(function (d) {\n if (typeof point[d] !== \"undefined\") {\n newargs.push(point[d]);\n }\n });\n });\n args = newargs;\n }\n var higher = false;\n var len = args.length;\n if (coordlen) {\n if (coordlen > 4) {\n if (arguments.length !== 1) {\n throw new Error(\"Only new Bezier(point[]) is accepted for 4th and higher order curves\");\n }\n higher = true;\n }\n } else {\n if (len !== 6 && len !== 8 && len !== 9 && len !== 12) {\n if (arguments.length !== 1) {\n throw new Error(\"Only new Bezier(point[]) is accepted for 4th and higher order curves\");\n }\n }\n }\n var _3d = !higher && (len === 9 || len === 12) || coords && coords[0] && typeof coords[0].z !== \"undefined\";\n this._3d = _3d;\n var points = [];\n for (var idx = 0, step = _3d ? 3 : 2; idx < len; idx += step) {\n var point = {\n x: args[idx],\n y: args[idx + 1]\n };\n if (_3d) {\n point.z = args[idx + 2];\n };\n points.push(point);\n }\n this.order = points.length - 1;\n this.points = points;\n var dims = ['x', 'y'];\n if (_3d) dims.push('z');\n this.dims = dims;\n this.dimlen = dims.length;\n\n (function (curve) {\n var order = curve.order;\n var points = curve.points;\n var a = utils.align(points, { p1: points[0], p2: points[order] });\n for (var i = 0; i < a.length; i++) {\n if (abs(a[i].y) > 0.0001) {\n curve._linear = false;\n return;\n }\n }\n curve._linear = true;\n })(this);\n\n this._t1 = 0;\n this._t2 = 1;\n this.update();\n };\n\n Bezier.fromSVG = function (svgString) {\n var list = svgString.match(/[-+]?\\d*\\.?\\d+(?:[eE][-+]?\\d+)?/g).map(parseFloat);\n var relative = /[cq]/.test(svgString);\n if (!relative) return new Bezier(list);\n list = list.map(function (v, i) {\n return i < 2 ? v : v + list[i % 2];\n });\n return new Bezier(list);\n };\n\n function getABC(n, S, B, E, t) {\n if (typeof t === \"undefined\") {\n t = 0.5;\n }\n var u = utils.projectionratio(t, n),\n um = 1 - u,\n C = {\n x: u * S.x + um * E.x,\n y: u * S.y + um * E.y\n },\n s = utils.abcratio(t, n),\n A = {\n x: B.x + (B.x - C.x) / s,\n y: B.y + (B.y - C.y) / s\n };\n return { A: A, B: B, C: C };\n }\n\n Bezier.quadraticFromPoints = function (p1, p2, p3, t) {\n if (typeof t === \"undefined\") {\n t = 0.5;\n }\n // shortcuts, although they're really dumb\n if (t === 0) {\n return new Bezier(p2, p2, p3);\n }\n if (t === 1) {\n return new Bezier(p1, p2, p2);\n }\n // real fitting.\n var abc = getABC(2, p1, p2, p3, t);\n return new Bezier(p1, abc.A, p3);\n };\n\n Bezier.cubicFromPoints = function (S, B, E, t, d1) {\n if (typeof t === \"undefined\") {\n t = 0.5;\n }\n var abc = getABC(3, S, B, E, t);\n if (typeof d1 === \"undefined\") {\n d1 = utils.dist(B, abc.C);\n }\n var d2 = d1 * (1 - t) / t;\n\n var selen = utils.dist(S, E),\n lx = (E.x - S.x) / selen,\n ly = (E.y - S.y) / selen,\n bx1 = d1 * lx,\n by1 = d1 * ly,\n bx2 = d2 * lx,\n by2 = d2 * ly;\n // derivation of new hull coordinates\n var e1 = { x: B.x - bx1, y: B.y - by1 },\n e2 = { x: B.x + bx2, y: B.y + by2 },\n A = abc.A,\n v1 = { x: A.x + (e1.x - A.x) / (1 - t), y: A.y + (e1.y - A.y) / (1 - t) },\n v2 = { x: A.x + (e2.x - A.x) / t, y: A.y + (e2.y - A.y) / t },\n nc1 = { x: S.x + (v1.x - S.x) / t, y: S.y + (v1.y - S.y) / t },\n nc2 = { x: E.x + (v2.x - E.x) / (1 - t), y: E.y + (v2.y - E.y) / (1 - t) };\n // ...done\n return new Bezier(S, nc1, nc2, E);\n };\n\n var getUtils = function getUtils() {\n return utils;\n };\n\n Bezier.getUtils = getUtils;\n\n Bezier.prototype = {\n getUtils: getUtils,\n valueOf: function valueOf() {\n return this.toString();\n },\n toString: function toString() {\n return utils.pointsToString(this.points);\n },\n toSVG: function toSVG(relative) {\n if (this._3d) return false;\n var p = this.points,\n x = p[0].x,\n y = p[0].y,\n s = [\"M\", x, y, this.order === 2 ? \"Q\" : \"C\"];\n for (var i = 1, last = p.length; i < last; i++) {\n s.push(p[i].x);\n s.push(p[i].y);\n }\n return s.join(\" \");\n },\n update: function update() {\n // one-time compute derivative coordinates\n this.dpoints = [];\n for (var p = this.points, d = p.length, c = d - 1; d > 1; d--, c--) {\n var list = [];\n for (var j = 0, dpt; j < c; j++) {\n dpt = {\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y)\n };\n if (this._3d) {\n dpt.z = c * (p[j + 1].z - p[j].z);\n }\n list.push(dpt);\n }\n this.dpoints.push(list);\n p = list;\n };\n this.computedirection();\n },\n computedirection: function computedirection() {\n var points = this.points;\n var angle = utils.angle(points[0], points[this.order], points[1]);\n this.clockwise = angle > 0;\n },\n length: function length() {\n return utils.length(this.derivative.bind(this));\n },\n _lut: [],\n getLUT: function getLUT(steps) {\n steps = steps || 100;\n if (this._lut.length === steps) {\n return this._lut;\n }\n this._lut = [];\n for (var t = 0; t <= steps; t++) {\n this._lut.push(this.compute(t / steps));\n }\n return this._lut;\n },\n on: function on(point, error) {\n error = error || 5;\n var lut = this.getLUT(),\n hits = [],\n c,\n t = 0;\n for (var i = 0; i < lut.length; i++) {\n c = lut[i];\n if (utils.dist(c, point) < error) {\n hits.push(c);\n t += i / lut.length;\n }\n }\n if (!hits.length) return false;\n return t /= hits.length;\n },\n project: function project(point) {\n // step 1: coarse check\n var LUT = this.getLUT(),\n l = LUT.length - 1,\n closest = utils.closest(LUT, point),\n mdist = closest.mdist,\n mpos = closest.mpos;\n if (mpos === 0 || mpos === l) {\n var t = mpos / l,\n pt = this.compute(t);\n pt.t = t;\n pt.d = mdist;\n return pt;\n }\n\n // step 2: fine check\n var ft,\n t,\n p,\n d,\n t1 = (mpos - 1) / l,\n t2 = (mpos + 1) / l,\n step = 0.1 / l;\n mdist += 1;\n for (t = t1, ft = t; t < t2 + step; t += step) {\n p = this.compute(t);\n d = utils.dist(point, p);\n if (d < mdist) {\n mdist = d;\n ft = t;\n }\n }\n p = this.compute(ft);\n p.t = ft;\n p.d = mdist;\n return p;\n },\n get: function get(t) {\n return this.compute(t);\n },\n point: function point(idx) {\n return this.points[idx];\n },\n compute: function compute(t) {\n // shortcuts\n if (t === 0) {\n return this.points[0];\n }\n if (t === 1) {\n return this.points[this.order];\n }\n\n var p = this.points;\n var mt = 1 - t;\n\n // linear?\n if (this.order === 1) {\n ret = {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y\n };\n if (this._3d) {\n ret.z = mt * p[0].z + t * p[1].z;\n }\n return ret;\n }\n\n // quadratic/cubic curve?\n if (this.order < 4) {\n var mt2 = mt * mt,\n t2 = t * t,\n a,\n b,\n c,\n d = 0;\n if (this.order === 2) {\n p = [p[0], p[1], p[2], ZERO];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (this.order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n var ret = {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y\n };\n if (this._3d) {\n ret.z = a * p[0].z + b * p[1].z + c * p[2].z + d * p[3].z;\n }\n return ret;\n }\n\n // higher order curves: use de Casteljau's computation\n var dCpts = JSON.parse(JSON.stringify(this.points));\n while (dCpts.length > 1) {\n for (var i = 0; i < dCpts.length - 1; i++) {\n dCpts[i] = {\n x: dCpts[i].x + (dCpts[i + 1].x - dCpts[i].x) * t,\n y: dCpts[i].y + (dCpts[i + 1].y - dCpts[i].y) * t\n };\n if (typeof dCpts[i].z !== \"undefined\") {\n dCpts[i] = dCpts[i].z + (dCpts[i + 1].z - dCpts[i].z) * t;\n }\n }\n dCpts.splice(dCpts.length - 1, 1);\n }\n return dCpts[0];\n },\n raise: function raise() {\n var p = this.points,\n np = [p[0]],\n i,\n k = p.length,\n pi,\n pim;\n for (var i = 1; i < k; i++) {\n pi = p[i];\n pim = p[i - 1];\n np[i] = {\n x: (k - i) / k * pi.x + i / k * pim.x,\n y: (k - i) / k * pi.y + i / k * pim.y\n };\n }\n np[k] = p[k - 1];\n return new Bezier(np);\n },\n derivative: function derivative(t) {\n var mt = 1 - t,\n a,\n b,\n c = 0,\n p = this.dpoints[0];\n if (this.order === 2) {\n p = [p[0], p[1], ZERO];a = mt;b = t;\n }\n if (this.order === 3) {\n a = mt * mt;b = mt * t * 2;c = t * t;\n }\n var ret = {\n x: a * p[0].x + b * p[1].x + c * p[2].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y\n };\n if (this._3d) {\n ret.z = a * p[0].z + b * p[1].z + c * p[2].z;\n }\n return ret;\n },\n inflections: function inflections() {\n return utils.inflections(this.points);\n },\n normal: function normal(t) {\n return this._3d ? this.__normal3(t) : this.__normal2(t);\n },\n __normal2: function __normal2(t) {\n var d = this.derivative(t);\n var q = sqrt(d.x * d.x + d.y * d.y);\n return { x: -d.y / q, y: d.x / q };\n },\n __normal3: function __normal3(t) {\n // see http://stackoverflow.com/questions/25453159\n var r1 = this.derivative(t),\n r2 = this.derivative(t + 0.01),\n q1 = sqrt(r1.x * r1.x + r1.y * r1.y + r1.z * r1.z),\n q2 = sqrt(r2.x * r2.x + r2.y * r2.y + r2.z * r2.z);\n r1.x /= q1;r1.y /= q1;r1.z /= q1;\n r2.x /= q2;r2.y /= q2;r2.z /= q2;\n // cross product\n var c = {\n x: r2.y * r1.z - r2.z * r1.y,\n y: r2.z * r1.x - r2.x * r1.z,\n z: r2.x * r1.y - r2.y * r1.x\n };\n var m = sqrt(c.x * c.x + c.y * c.y + c.z * c.z);\n c.x /= m;c.y /= m;c.z /= m;\n // rotation matrix\n var R = [c.x * c.x, c.x * c.y - c.z, c.x * c.z + c.y, c.x * c.y + c.z, c.y * c.y, c.y * c.z - c.x, c.x * c.z - c.y, c.y * c.z + c.x, c.z * c.z];\n // normal vector:\n var n = {\n x: R[0] * r1.x + R[1] * r1.y + R[2] * r1.z,\n y: R[3] * r1.x + R[4] * r1.y + R[5] * r1.z,\n z: R[6] * r1.x + R[7] * r1.y + R[8] * r1.z\n };\n return n;\n },\n hull: function hull(t) {\n var p = this.points,\n _p = [],\n pt,\n q = [],\n idx = 0,\n i = 0,\n l = 0;\n q[idx++] = p[0];\n q[idx++] = p[1];\n q[idx++] = p[2];\n if (this.order === 3) {\n q[idx++] = p[3];\n }\n // we lerp between all points at each iteration, until we have 1 point left.\n while (p.length > 1) {\n _p = [];\n for (i = 0, l = p.length - 1; i < l; i++) {\n pt = utils.lerp(t, p[i], p[i + 1]);\n q[idx++] = pt;\n _p.push(pt);\n }\n p = _p;\n }\n return q;\n },\n split: function split(t1, t2) {\n // shortcuts\n if (t1 === 0 && !!t2) {\n return this.split(t2).left;\n }\n if (t2 === 1) {\n return this.split(t1).right;\n }\n\n // no shortcut: use \"de Casteljau\" iteration.\n var q = this.hull(t1);\n var result = {\n left: this.order === 2 ? new Bezier([q[0], q[3], q[5]]) : new Bezier([q[0], q[4], q[7], q[9]]),\n right: this.order === 2 ? new Bezier([q[5], q[4], q[2]]) : new Bezier([q[9], q[8], q[6], q[3]]),\n span: q\n };\n\n // make sure we bind _t1/_t2 information!\n result.left._t1 = utils.map(0, 0, 1, this._t1, this._t2);\n result.left._t2 = utils.map(t1, 0, 1, this._t1, this._t2);\n result.right._t1 = utils.map(t1, 0, 1, this._t1, this._t2);\n result.right._t2 = utils.map(1, 0, 1, this._t1, this._t2);\n\n // if we have no t2, we're done\n if (!t2) {\n return result;\n }\n\n // if we have a t2, split again:\n t2 = utils.map(t2, t1, 1, 0, 1);\n var subsplit = result.right.split(t2);\n return subsplit.left;\n },\n extrema: function extrema() {\n var dims = this.dims,\n result = {},\n roots = [],\n p,\n mfn;\n dims.forEach(function (dim) {\n mfn = function mfn(v) {\n return v[dim];\n };\n p = this.dpoints[0].map(mfn);\n result[dim] = utils.droots(p);\n if (this.order === 3) {\n p = this.dpoints[1].map(mfn);\n result[dim] = result[dim].concat(utils.droots(p));\n }\n result[dim] = result[dim].filter(function (t) {\n return t >= 0 && t <= 1;\n });\n roots = roots.concat(result[dim].sort());\n }.bind(this));\n roots = roots.sort().filter(function (v, idx) {\n return roots.indexOf(v) === idx;\n });\n result.values = roots;\n return result;\n },\n bbox: function bbox() {\n var extrema = this.extrema(),\n result = {};\n this.dims.forEach(function (d) {\n result[d] = utils.getminmax(this, d, extrema[d]);\n }.bind(this));\n return result;\n },\n overlaps: function overlaps(curve) {\n var lbbox = this.bbox(),\n tbbox = curve.bbox();\n return utils.bboxoverlap(lbbox, tbbox);\n },\n offset: function offset(t, d) {\n if (typeof d !== \"undefined\") {\n var c = this.get(t);\n var n = this.normal(t);\n var ret = {\n c: c,\n n: n,\n x: c.x + n.x * d,\n y: c.y + n.y * d\n };\n if (this._3d) {\n ret.z = c.z + n.z * d;\n };\n return ret;\n }\n if (this._linear) {\n var nv = this.normal(0);\n var coords = this.points.map(function (p) {\n var ret = {\n x: p.x + t * nv.x,\n y: p.y + t * nv.y\n };\n if (p.z && n.z) {\n ret.z = p.z + t * nv.z;\n }\n return ret;\n });\n return [new Bezier(coords)];\n }\n var reduced = this.reduce();\n return reduced.map(function (s) {\n return s.scale(t);\n });\n },\n simple: function simple() {\n if (this.order === 3) {\n var a1 = utils.angle(this.points[0], this.points[3], this.points[1]);\n var a2 = utils.angle(this.points[0], this.points[3], this.points[2]);\n if (a1 > 0 && a2 < 0 || a1 < 0 && a2 > 0) return false;\n }\n var n1 = this.normal(0);\n var n2 = this.normal(1);\n var s = n1.x * n2.x + n1.y * n2.y;\n if (this._3d) {\n s += n1.z * n2.z;\n }\n var angle = abs(acos(s));\n return angle < pi / 3;\n },\n reduce: function reduce() {\n var i,\n t1 = 0,\n t2 = 0,\n step = 0.01,\n segment,\n pass1 = [],\n pass2 = [];\n // first pass: split on extrema\n var extrema = this.extrema().values;\n if (extrema.indexOf(0) === -1) {\n extrema = [0].concat(extrema);\n }\n if (extrema.indexOf(1) === -1) {\n extrema.push(1);\n }\n\n for (t1 = extrema[0], i = 1; i < extrema.length; i++) {\n t2 = extrema[i];\n segment = this.split(t1, t2);\n segment._t1 = t1;\n segment._t2 = t2;\n pass1.push(segment);\n t1 = t2;\n }\n\n // second pass: further reduce these segments to simple segments\n pass1.forEach(function (p1) {\n t1 = 0;\n t2 = 0;\n while (t2 <= 1) {\n for (t2 = t1 + step; t2 <= 1 + step; t2 += step) {\n segment = p1.split(t1, t2);\n if (!segment.simple()) {\n t2 -= step;\n if (abs(t1 - t2) < step) {\n // we can never form a reduction\n return [];\n }\n segment = p1.split(t1, t2);\n segment._t1 = utils.map(t1, 0, 1, p1._t1, p1._t2);\n segment._t2 = utils.map(t2, 0, 1, p1._t1, p1._t2);\n pass2.push(segment);\n t1 = t2;\n break;\n }\n }\n }\n if (t1 < 1) {\n segment = p1.split(t1, 1);\n segment._t1 = utils.map(t1, 0, 1, p1._t1, p1._t2);\n segment._t2 = p1._t2;\n pass2.push(segment);\n }\n });\n return pass2;\n },\n scale: function scale(d) {\n var order = this.order;\n var distanceFn = false;\n if (typeof d === \"function\") {\n distanceFn = d;\n }\n if (distanceFn && order === 2) {\n return this.raise().scale(distanceFn);\n }\n\n // TODO: add special handling for degenerate (=linear) curves.\n var clockwise = this.clockwise;\n var r1 = distanceFn ? distanceFn(0) : d;\n var r2 = distanceFn ? distanceFn(1) : d;\n var v = [this.offset(0, 10), this.offset(1, 10)];\n var o = utils.lli4(v[0], v[0].c, v[1], v[1].c);\n if (!o) {\n throw new Error(\"cannot scale this curve. Try reducing it first.\");\n }\n // move all points by distance 'd' wrt the origin 'o'\n var points = this.points,\n np = [];\n\n // move end points by fixed distance along normal.\n [0, 1].forEach(function (t) {\n var p = np[t * order] = utils.copy(points[t * order]);\n p.x += (t ? r2 : r1) * v[t].n.x;\n p.y += (t ? r2 : r1) * v[t].n.y;\n }.bind(this));\n\n if (!distanceFn) {\n // move control points to lie on the intersection of the offset\n // derivative vector, and the origin-through-control vector\n [0, 1].forEach(function (t) {\n if (this.order === 2 && !!t) return;\n var p = np[t * order];\n var d = this.derivative(t);\n var p2 = { x: p.x + d.x, y: p.y + d.y };\n np[t + 1] = utils.lli4(p, p2, o, points[t + 1]);\n }.bind(this));\n return new Bezier(np);\n }\n\n // move control points by \"however much necessary to\n // ensure the correct tangent to endpoint\".\n [0, 1].forEach(function (t) {\n if (this.order === 2 && !!t) return;\n var p = points[t + 1];\n var ov = {\n x: p.x - o.x,\n y: p.y - o.y\n };\n var rc = distanceFn ? distanceFn((t + 1) / order) : d;\n if (distanceFn && !clockwise) rc = -rc;\n var m = sqrt(ov.x * ov.x + ov.y * ov.y);\n ov.x /= m;\n ov.y /= m;\n np[t + 1] = {\n x: p.x + rc * ov.x,\n y: p.y + rc * ov.y\n };\n }.bind(this));\n return new Bezier(np);\n },\n outline: function outline(d1, d2, d3, d4) {\n d2 = typeof d2 === \"undefined\" ? d1 : d2;\n var reduced = this.reduce(),\n len = reduced.length,\n fcurves = [],\n bcurves = [],\n p,\n alen = 0,\n tlen = this.length();\n\n var graduated = typeof d3 !== \"undefined\" && typeof d4 !== \"undefined\";\n\n function linearDistanceFunction(s, e, tlen, alen, slen) {\n return function (v) {\n var f1 = alen / tlen,\n f2 = (alen + slen) / tlen,\n d = e - s;\n return utils.map(v, 0, 1, s + f1 * d, s + f2 * d);\n };\n };\n\n // form curve oulines\n reduced.forEach(function (segment) {\n slen = segment.length();\n if (graduated) {\n fcurves.push(segment.scale(linearDistanceFunction(d1, d3, tlen, alen, slen)));\n bcurves.push(segment.scale(linearDistanceFunction(-d2, -d4, tlen, alen, slen)));\n } else {\n fcurves.push(segment.scale(d1));\n bcurves.push(segment.scale(-d2));\n }\n alen += slen;\n });\n\n // reverse the \"return\" outline\n bcurves = bcurves.map(function (s) {\n p = s.points;\n if (p[3]) {\n s.points = [p[3], p[2], p[1], p[0]];\n } else {\n s.points = [p[2], p[1], p[0]];\n }\n return s;\n }).reverse();\n\n // form the endcaps as lines\n var fs = fcurves[0].points[0],\n fe = fcurves[len - 1].points[fcurves[len - 1].points.length - 1],\n bs = bcurves[len - 1].points[bcurves[len - 1].points.length - 1],\n be = bcurves[0].points[0],\n ls = utils.makeline(bs, fs),\n le = utils.makeline(fe, be),\n segments = [ls].concat(fcurves).concat([le]).concat(bcurves),\n slen = segments.length;\n\n return new PolyBezier(segments);\n },\n outlineshapes: function outlineshapes(d1, d2, curveIntersectionThreshold) {\n d2 = d2 || d1;\n var outline = this.outline(d1, d2).curves;\n var shapes = [];\n for (var i = 1, len = outline.length; i < len / 2; i++) {\n var shape = utils.makeshape(outline[i], outline[len - i], curveIntersectionThreshold);\n shape.startcap.virtual = i > 1;\n shape.endcap.virtual = i < len / 2 - 1;\n shapes.push(shape);\n }\n return shapes;\n },\n intersects: function intersects(curve, curveIntersectionThreshold) {\n if (!curve) return this.selfintersects(curveIntersectionThreshold);\n if (curve.p1 && curve.p2) {\n return this.lineIntersects(curve);\n }\n if (curve instanceof Bezier) {\n curve = curve.reduce();\n }\n return this.curveintersects(this.reduce(), curve, curveIntersectionThreshold);\n },\n lineIntersects: function lineIntersects(line) {\n var mx = min(line.p1.x, line.p2.x),\n my = min(line.p1.y, line.p2.y),\n MX = max(line.p1.x, line.p2.x),\n MY = max(line.p1.y, line.p2.y),\n self = this;\n return utils.roots(this.points, line).filter(function (t) {\n var p = self.get(t);\n return utils.between(p.x, mx, MX) && utils.between(p.y, my, MY);\n });\n },\n selfintersects: function selfintersects(curveIntersectionThreshold) {\n var reduced = this.reduce();\n // \"simple\" curves cannot intersect with their direct\n // neighbour, so for each segment X we check whether\n // it intersects [0:x-2][x+2:last].\n var i,\n len = reduced.length - 2,\n results = [],\n result,\n left,\n right;\n for (i = 0; i < len; i++) {\n left = reduced.slice(i, i + 1);\n right = reduced.slice(i + 2);\n result = this.curveintersects(left, right, curveIntersectionThreshold);\n results = results.concat(result);\n }\n return results;\n },\n curveintersects: function curveintersects(c1, c2, curveIntersectionThreshold) {\n var pairs = [];\n // step 1: pair off any overlapping segments\n c1.forEach(function (l) {\n c2.forEach(function (r) {\n if (l.overlaps(r)) {\n pairs.push({ left: l, right: r });\n }\n });\n });\n // step 2: for each pairing, run through the convergence algorithm.\n var intersections = [];\n pairs.forEach(function (pair) {\n var result = utils.pairiteration(pair.left, pair.right, curveIntersectionThreshold);\n if (result.length > 0) {\n intersections = intersections.concat(result);\n }\n });\n return intersections;\n },\n arcs: function arcs(errorThreshold) {\n errorThreshold = errorThreshold || 0.5;\n var circles = [];\n return this._iterate(errorThreshold, circles);\n },\n _error: function _error(pc, np1, s, e) {\n var q = (e - s) / 4,\n c1 = this.get(s + q),\n c2 = this.get(e - q),\n ref = utils.dist(pc, np1),\n d1 = utils.dist(pc, c1),\n d2 = utils.dist(pc, c2);\n return abs(d1 - ref) + abs(d2 - ref);\n },\n _iterate: function _iterate(errorThreshold, circles) {\n var s = 0,\n e = 1,\n safety;\n // we do a binary search to find the \"good `t` closest to no-longer-good\"\n do {\n safety = 0;\n\n // step 1: start with the maximum possible arc\n e = 1;\n\n // points:\n var np1 = this.get(s),\n np2,\n np3,\n arc,\n prev_arc;\n\n // booleans:\n var curr_good = false,\n prev_good = false,\n done;\n\n // numbers:\n var m = e,\n prev_e = 1,\n step = 0;\n\n // step 2: find the best possible arc\n do {\n prev_good = curr_good;\n prev_arc = arc;\n m = (s + e) / 2;\n step++;\n\n np2 = this.get(m);\n np3 = this.get(e);\n\n arc = utils.getccenter(np1, np2, np3);\n\n //also save the t values\n arc.interval = {\n start: s,\n end: e\n };\n\n var error = this._error(arc, np1, s, e);\n curr_good = error <= errorThreshold;\n\n done = prev_good && !curr_good;\n if (!done) prev_e = e;\n\n // this arc is fine: we can move 'e' up to see if we can find a wider arc\n if (curr_good) {\n\n // if e is already at max, then we're done for this arc.\n if (e >= 1) {\n arc.interval.end = prev_e = 1;\n prev_arc = arc;\n break;\n }\n // if not, move it up by half the iteration distance\n e = e + (e - s) / 2;\n }\n\n // this is a bad arc: we need to move 'e' down to find a good arc\n else {\n e = m;\n }\n } while (!done && safety++ < 100);\n\n if (safety >= 100) {\n break;\n }\n\n // console.log(\"L835: [F] arc found\", s, prev_e, prev_arc.x, prev_arc.y, prev_arc.s, prev_arc.e);\n\n prev_arc = prev_arc ? prev_arc : arc;\n circles.push(prev_arc);\n s = prev_e;\n } while (e < 1);\n return circles;\n }\n };\n\n module.exports = Bezier;\n })();\n }, { \"./poly-bezier.js\": 3, \"./utils.js\": 4 }], 3: [function (require, module, exports) {\n (function () {\n \"use strict\";\n\n var utils = require('./utils.js');\n\n /**\n * Poly Bezier\n * @param {[type]} curves [description]\n */\n var PolyBezier = function PolyBezier(curves) {\n this.curves = [];\n this._3d = false;\n if (!!curves) {\n this.curves = curves;\n this._3d = this.curves[0]._3d;\n }\n };\n\n PolyBezier.prototype = {\n valueOf: function valueOf() {\n return this.toString();\n },\n toString: function toString() {\n return \"[\" + this.curves.map(function (curve) {\n return utils.pointsToString(curve.points);\n }).join(\", \") + \"]\";\n },\n addCurve: function addCurve(curve) {\n this.curves.push(curve);\n this._3d = this._3d || curve._3d;\n },\n length: function length() {\n return this.curves.map(function (v) {\n return v.length();\n }).reduce(function (a, b) {\n return a + b;\n });\n },\n curve: function curve(idx) {\n return this.curves[idx];\n },\n bbox: function bbox() {\n var c = this.curves;\n var bbox = c[0].bbox();\n for (var i = 1; i < c.length; i++) {\n utils.expandbox(bbox, c[i].bbox());\n }\n return bbox;\n },\n offset: function offset(d) {\n var offset = [];\n this.curves.forEach(function (v) {\n offset = offset.concat(v.offset(d));\n });\n return new PolyBezier(offset);\n }\n };\n\n module.exports = PolyBezier;\n })();\n }, { \"./utils.js\": 4 }], 4: [function (require, module, exports) {\n (function () {\n \"use strict\";\n\n // math-inlining.\n\n var abs = Math.abs,\n cos = Math.cos,\n sin = Math.sin,\n acos = Math.acos,\n atan2 = Math.atan2,\n sqrt = Math.sqrt,\n pow = Math.pow,\n\n // cube root function yielding real roots\n crt = function crt(v) {\n return v < 0 ? -pow(-v, 1 / 3) : pow(v, 1 / 3);\n },\n\n // trig constants\n pi = Math.PI,\n tau = 2 * pi,\n quart = pi / 2,\n\n // float precision significant decimal\n epsilon = 0.000001,\n\n // extremas used in bbox calculation and similar algorithms\n nMax = Number.MAX_SAFE_INTEGER,\n nMin = Number.MIN_SAFE_INTEGER;\n\n // Bezier utility functions\n var utils = {\n // Legendre-Gauss abscissae with n=24 (x_i values, defined at i=n as the roots of the nth order Legendre polynomial Pn(x))\n Tvalues: [-0.0640568928626056260850430826247450385909, 0.0640568928626056260850430826247450385909, -0.1911188674736163091586398207570696318404, 0.1911188674736163091586398207570696318404, -0.3150426796961633743867932913198102407864, 0.3150426796961633743867932913198102407864, -0.4337935076260451384870842319133497124524, 0.4337935076260451384870842319133497124524, -0.5454214713888395356583756172183723700107, 0.5454214713888395356583756172183723700107, -0.6480936519369755692524957869107476266696, 0.6480936519369755692524957869107476266696, -0.7401241915785543642438281030999784255232, 0.7401241915785543642438281030999784255232, -0.8200019859739029219539498726697452080761, 0.8200019859739029219539498726697452080761, -0.8864155270044010342131543419821967550873, 0.8864155270044010342131543419821967550873, -0.9382745520027327585236490017087214496548, 0.9382745520027327585236490017087214496548, -0.9747285559713094981983919930081690617411, 0.9747285559713094981983919930081690617411, -0.9951872199970213601799974097007368118745, 0.9951872199970213601799974097007368118745],\n\n // Legendre-Gauss weights with n=24 (w_i values, defined by a function linked to in the Bezier primer article)\n Cvalues: [0.1279381953467521569740561652246953718517, 0.1279381953467521569740561652246953718517, 0.1258374563468282961213753825111836887264, 0.1258374563468282961213753825111836887264, 0.1216704729278033912044631534762624256070, 0.1216704729278033912044631534762624256070, 0.1155056680537256013533444839067835598622, 0.1155056680537256013533444839067835598622, 0.1074442701159656347825773424466062227946, 0.1074442701159656347825773424466062227946, 0.0976186521041138882698806644642471544279, 0.0976186521041138882698806644642471544279, 0.0861901615319532759171852029837426671850, 0.0861901615319532759171852029837426671850, 0.0733464814110803057340336152531165181193, 0.0733464814110803057340336152531165181193, 0.0592985849154367807463677585001085845412, 0.0592985849154367807463677585001085845412, 0.0442774388174198061686027482113382288593, 0.0442774388174198061686027482113382288593, 0.0285313886289336631813078159518782864491, 0.0285313886289336631813078159518782864491, 0.0123412297999871995468056670700372915759, 0.0123412297999871995468056670700372915759],\n\n arcfn: function arcfn(t, derivativeFn) {\n var d = derivativeFn(t);\n var l = d.x * d.x + d.y * d.y;\n if (typeof d.z !== \"undefined\") {\n l += d.z * d.z;\n }\n return sqrt(l);\n },\n\n between: function between(v, m, M) {\n return m <= v && v <= M || utils.approximately(v, m) || utils.approximately(v, M);\n },\n\n approximately: function approximately(a, b, precision) {\n return abs(a - b) <= (precision || epsilon);\n },\n\n length: function length(derivativeFn) {\n var z = 0.5,\n sum = 0,\n len = utils.Tvalues.length,\n i,\n t;\n for (i = 0; i < len; i++) {\n t = z * utils.Tvalues[i] + z;\n sum += utils.Cvalues[i] * utils.arcfn(t, derivativeFn);\n }\n return z * sum;\n },\n\n map: function map(v, ds, de, ts, te) {\n var d1 = de - ds,\n d2 = te - ts,\n v2 = v - ds,\n r = v2 / d1;\n return ts + d2 * r;\n },\n\n lerp: function lerp(r, v1, v2) {\n var ret = {\n x: v1.x + r * (v2.x - v1.x),\n y: v1.y + r * (v2.y - v1.y)\n };\n if (!!v1.z && !!v2.z) {\n ret.z = v1.z + r * (v2.z - v1.z);\n }\n return ret;\n },\n\n pointToString: function pointToString(p) {\n var s = p.x + \"/\" + p.y;\n if (typeof p.z !== \"undefined\") {\n s += \"/\" + p.z;\n }\n return s;\n },\n\n pointsToString: function pointsToString(points) {\n return \"[\" + points.map(utils.pointToString).join(\", \") + \"]\";\n },\n\n copy: function copy(obj) {\n return JSON.parse(JSON.stringify(obj));\n },\n\n angle: function angle(o, v1, v2) {\n var dx1 = v1.x - o.x,\n dy1 = v1.y - o.y,\n dx2 = v2.x - o.x,\n dy2 = v2.y - o.y,\n cross = dx1 * dy2 - dy1 * dx2,\n dot = dx1 * dx2 + dy1 * dy2;\n return atan2(cross, dot);\n },\n\n // round as string, to avoid rounding errors\n round: function round(v, d) {\n var s = '' + v;\n var pos = s.indexOf(\".\");\n return parseFloat(s.substring(0, pos + 1 + d));\n },\n\n dist: function dist(p1, p2) {\n var dx = p1.x - p2.x,\n dy = p1.y - p2.y;\n return sqrt(dx * dx + dy * dy);\n },\n\n closest: function closest(LUT, point) {\n var mdist = pow(2, 63),\n mpos,\n d;\n LUT.forEach(function (p, idx) {\n d = utils.dist(point, p);\n if (d < mdist) {\n mdist = d;\n mpos = idx;\n }\n });\n return { mdist: mdist, mpos: mpos };\n },\n\n abcratio: function abcratio(t, n) {\n // see ratio(t) note on http://pomax.github.io/bezierinfo/#abc\n if (n !== 2 && n !== 3) {\n return false;\n }\n if (typeof t === \"undefined\") {\n t = 0.5;\n } else if (t === 0 || t === 1) {\n return t;\n }\n var bottom = pow(t, n) + pow(1 - t, n),\n top = bottom - 1;\n return abs(top / bottom);\n },\n\n projectionratio: function projectionratio(t, n) {\n // see u(t) note on http://pomax.github.io/bezierinfo/#abc\n if (n !== 2 && n !== 3) {\n return false;\n }\n if (typeof t === \"undefined\") {\n t = 0.5;\n } else if (t === 0 || t === 1) {\n return t;\n }\n var top = pow(1 - t, n),\n bottom = pow(t, n) + top;\n return top / bottom;\n },\n\n lli8: function lli8(x1, y1, x2, y2, x3, y3, x4, y4) {\n var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n if (d == 0) {\n return false;\n }\n return { x: nx / d, y: ny / d };\n },\n\n lli4: function lli4(p1, p2, p3, p4) {\n var x1 = p1.x,\n y1 = p1.y,\n x2 = p2.x,\n y2 = p2.y,\n x3 = p3.x,\n y3 = p3.y,\n x4 = p4.x,\n y4 = p4.y;\n return utils.lli8(x1, y1, x2, y2, x3, y3, x4, y4);\n },\n\n lli: function lli(v1, v2) {\n return utils.lli4(v1, v1.c, v2, v2.c);\n },\n\n makeline: function makeline(p1, p2) {\n var Bezier = require('./bezier');\n var x1 = p1.x,\n y1 = p1.y,\n x2 = p2.x,\n y2 = p2.y,\n dx = (x2 - x1) / 3,\n dy = (y2 - y1) / 3;\n return new Bezier(x1, y1, x1 + dx, y1 + dy, x1 + 2 * dx, y1 + 2 * dy, x2, y2);\n },\n\n findbbox: function findbbox(sections) {\n var mx = nMax,\n my = nMax,\n MX = nMin,\n MY = nMin;\n sections.forEach(function (s) {\n var bbox = s.bbox();\n if (mx > bbox.x.min) mx = bbox.x.min;\n if (my > bbox.y.min) my = bbox.y.min;\n if (MX < bbox.x.max) MX = bbox.x.max;\n if (MY < bbox.y.max) MY = bbox.y.max;\n });\n return {\n x: { min: mx, mid: (mx + MX) / 2, max: MX, size: MX - mx },\n y: { min: my, mid: (my + MY) / 2, max: MY, size: MY - my }\n };\n },\n\n shapeintersections: function shapeintersections(s1, bbox1, s2, bbox2, curveIntersectionThreshold) {\n if (!utils.bboxoverlap(bbox1, bbox2)) return [];\n var intersections = [];\n var a1 = [s1.startcap, s1.forward, s1.back, s1.endcap];\n var a2 = [s2.startcap, s2.forward, s2.back, s2.endcap];\n a1.forEach(function (l1) {\n if (l1.virtual) return;\n a2.forEach(function (l2) {\n if (l2.virtual) return;\n var iss = l1.intersects(l2, curveIntersectionThreshold);\n if (iss.length > 0) {\n iss.c1 = l1;\n iss.c2 = l2;\n iss.s1 = s1;\n iss.s2 = s2;\n intersections.push(iss);\n }\n });\n });\n return intersections;\n },\n\n makeshape: function makeshape(forward, back, curveIntersectionThreshold) {\n var bpl = back.points.length;\n var fpl = forward.points.length;\n var start = utils.makeline(back.points[bpl - 1], forward.points[0]);\n var end = utils.makeline(forward.points[fpl - 1], back.points[0]);\n var shape = {\n startcap: start,\n forward: forward,\n back: back,\n endcap: end,\n bbox: utils.findbbox([start, forward, back, end])\n };\n var self = utils;\n shape.intersections = function (s2) {\n return self.shapeintersections(shape, shape.bbox, s2, s2.bbox, curveIntersectionThreshold);\n };\n return shape;\n },\n\n getminmax: function getminmax(curve, d, list) {\n if (!list) return { min: 0, max: 0 };\n var min = nMax,\n max = nMin,\n t,\n c;\n if (list.indexOf(0) === -1) {\n list = [0].concat(list);\n }\n if (list.indexOf(1) === -1) {\n list.push(1);\n }\n for (var i = 0, len = list.length; i < len; i++) {\n t = list[i];\n c = curve.get(t);\n if (c[d] < min) {\n min = c[d];\n }\n if (c[d] > max) {\n max = c[d];\n }\n }\n return { min: min, mid: (min + max) / 2, max: max, size: max - min };\n },\n\n align: function align(points, line) {\n var tx = line.p1.x,\n ty = line.p1.y,\n a = -atan2(line.p2.y - ty, line.p2.x - tx),\n d = function d(v) {\n return {\n x: (v.x - tx) * cos(a) - (v.y - ty) * sin(a),\n y: (v.x - tx) * sin(a) + (v.y - ty) * cos(a)\n };\n };\n return points.map(d);\n },\n\n roots: function roots(points, line) {\n line = line || { p1: { x: 0, y: 0 }, p2: { x: 1, y: 0 } };\n var order = points.length - 1;\n var p = utils.align(points, line);\n var reduce = function reduce(t) {\n return 0 <= t && t <= 1;\n };\n\n if (order === 2) {\n var a = p[0].y,\n b = p[1].y,\n c = p[2].y,\n d = a - 2 * b + c;\n if (d !== 0) {\n var m1 = -sqrt(b * b - a * c),\n m2 = -a + b,\n v1 = -(m1 + m2) / d,\n v2 = -(-m1 + m2) / d;\n return [v1, v2].filter(reduce);\n } else if (b !== c && d === 0) {\n return [(2 * b - c) / 2 * (b - c)].filter(reduce);\n }\n return [];\n }\n\n // see http://www.trans4mind.com/personal_development/mathematics/polynomials/cubicAlgebra.htm\n var pa = p[0].y,\n pb = p[1].y,\n pc = p[2].y,\n pd = p[3].y,\n d = -pa + 3 * pb - 3 * pc + pd,\n a = (3 * pa - 6 * pb + 3 * pc) / d,\n b = (-3 * pa + 3 * pb) / d,\n c = pa / d,\n p = (3 * b - a * a) / 3,\n p3 = p / 3,\n q = (2 * a * a * a - 9 * a * b + 27 * c) / 27,\n q2 = q / 2,\n discriminant = q2 * q2 + p3 * p3 * p3,\n u1,\n v1,\n x1,\n x2,\n x3;\n if (discriminant < 0) {\n var mp3 = -p / 3,\n mp33 = mp3 * mp3 * mp3,\n r = sqrt(mp33),\n t = -q / (2 * r),\n cosphi = t < -1 ? -1 : t > 1 ? 1 : t,\n phi = acos(cosphi),\n crtr = crt(r),\n t1 = 2 * crtr;\n x1 = t1 * cos(phi / 3) - a / 3;\n x2 = t1 * cos((phi + tau) / 3) - a / 3;\n x3 = t1 * cos((phi + 2 * tau) / 3) - a / 3;\n return [x1, x2, x3].filter(reduce);\n } else if (discriminant === 0) {\n u1 = q2 < 0 ? crt(-q2) : -crt(q2);\n x1 = 2 * u1 - a / 3;\n x2 = -u1 - a / 3;\n return [x1, x2].filter(reduce);\n } else {\n var sd = sqrt(discriminant);\n u1 = crt(-q2 + sd);\n v1 = crt(q2 + sd);\n return [u1 - v1 - a / 3].filter(reduce);;\n }\n },\n\n droots: function droots(p) {\n // quadratic roots are easy\n if (p.length === 3) {\n var a = p[0],\n b = p[1],\n c = p[2],\n d = a - 2 * b + c;\n if (d !== 0) {\n var m1 = -sqrt(b * b - a * c),\n m2 = -a + b,\n v1 = -(m1 + m2) / d,\n v2 = -(-m1 + m2) / d;\n return [v1, v2];\n } else if (b !== c && d === 0) {\n return [(2 * b - c) / (2 * (b - c))];\n }\n return [];\n }\n\n // linear roots are even easier\n if (p.length === 2) {\n var a = p[0],\n b = p[1];\n if (a !== b) {\n return [a / (a - b)];\n }\n return [];\n }\n },\n\n inflections: function inflections(points) {\n if (points.length < 4) return [];\n\n // FIXME: TODO: add in inflection abstraction for quartic+ curves?\n\n var p = utils.align(points, { p1: points[0], p2: points.slice(-1)[0] }),\n a = p[2].x * p[1].y,\n b = p[3].x * p[1].y,\n c = p[1].x * p[2].y,\n d = p[3].x * p[2].y,\n v1 = 18 * (-3 * a + 2 * b + 3 * c - d),\n v2 = 18 * (3 * a - b - 3 * c),\n v3 = 18 * (c - a);\n\n if (utils.approximately(v1, 0)) {\n if (!utils.approximately(v2, 0)) {\n var t = -v3 / v2;\n if (0 <= t && t <= 1) return [t];\n }\n return [];\n }\n\n var trm = v2 * v2 - 4 * v1 * v3,\n sq = Math.sqrt(trm),\n d = 2 * v1;\n\n if (utils.approximately(d, 0)) return [];\n\n return [(sq - v2) / d, -(v2 + sq) / d].filter(function (r) {\n return 0 <= r && r <= 1;\n });\n },\n\n bboxoverlap: function bboxoverlap(b1, b2) {\n var dims = ['x', 'y'],\n len = dims.length,\n i,\n dim,\n l,\n t,\n d;\n for (i = 0; i < len; i++) {\n dim = dims[i];\n l = b1[dim].mid;\n t = b2[dim].mid;\n d = (b1[dim].size + b2[dim].size) / 2;\n if (abs(l - t) >= d) return false;\n }\n return true;\n },\n\n expandbox: function expandbox(bbox, _bbox) {\n if (_bbox.x.min < bbox.x.min) {\n bbox.x.min = _bbox.x.min;\n }\n if (_bbox.y.min < bbox.y.min) {\n bbox.y.min = _bbox.y.min;\n }\n if (_bbox.z && _bbox.z.min < bbox.z.min) {\n bbox.z.min = _bbox.z.min;\n }\n if (_bbox.x.max > bbox.x.max) {\n bbox.x.max = _bbox.x.max;\n }\n if (_bbox.y.max > bbox.y.max) {\n bbox.y.max = _bbox.y.max;\n }\n if (_bbox.z && _bbox.z.max > bbox.z.max) {\n bbox.z.max = _bbox.z.max;\n }\n bbox.x.mid = (bbox.x.min + bbox.x.max) / 2;\n bbox.y.mid = (bbox.y.min + bbox.y.max) / 2;\n if (bbox.z) {\n bbox.z.mid = (bbox.z.min + bbox.z.max) / 2;\n }\n bbox.x.size = bbox.x.max - bbox.x.min;\n bbox.y.size = bbox.y.max - bbox.y.min;\n if (bbox.z) {\n bbox.z.size = bbox.z.max - bbox.z.min;\n }\n },\n\n pairiteration: function pairiteration(c1, c2, curveIntersectionThreshold) {\n var c1b = c1.bbox(),\n c2b = c2.bbox(),\n r = 100000,\n threshold = curveIntersectionThreshold || 0.5;\n if (c1b.x.size + c1b.y.size < threshold && c2b.x.size + c2b.y.size < threshold) {\n return [(r * (c1._t1 + c1._t2) / 2 | 0) / r + \"/\" + (r * (c2._t1 + c2._t2) / 2 | 0) / r];\n }\n var cc1 = c1.split(0.5),\n cc2 = c2.split(0.5),\n pairs = [{ left: cc1.left, right: cc2.left }, { left: cc1.left, right: cc2.right }, { left: cc1.right, right: cc2.right }, { left: cc1.right, right: cc2.left }];\n pairs = pairs.filter(function (pair) {\n return utils.bboxoverlap(pair.left.bbox(), pair.right.bbox());\n });\n var results = [];\n if (pairs.length === 0) return results;\n pairs.forEach(function (pair) {\n results = results.concat(utils.pairiteration(pair.left, pair.right, threshold));\n });\n results = results.filter(function (v, i) {\n return results.indexOf(v) === i;\n });\n return results;\n },\n\n getccenter: function getccenter(p1, p2, p3) {\n var dx1 = p2.x - p1.x,\n dy1 = p2.y - p1.y,\n dx2 = p3.x - p2.x,\n dy2 = p3.y - p2.y;\n var dx1p = dx1 * cos(quart) - dy1 * sin(quart),\n dy1p = dx1 * sin(quart) + dy1 * cos(quart),\n dx2p = dx2 * cos(quart) - dy2 * sin(quart),\n dy2p = dx2 * sin(quart) + dy2 * cos(quart);\n // chord midpoints\n var mx1 = (p1.x + p2.x) / 2,\n my1 = (p1.y + p2.y) / 2,\n mx2 = (p2.x + p3.x) / 2,\n my2 = (p2.y + p3.y) / 2;\n // midpoint offsets\n var mx1n = mx1 + dx1p,\n my1n = my1 + dy1p,\n mx2n = mx2 + dx2p,\n my2n = my2 + dy2p;\n // intersection of these lines:\n var arc = utils.lli8(mx1, my1, mx1n, my1n, mx2, my2, mx2n, my2n),\n r = utils.dist(arc, p1),\n\n // arc start/end values, over mid point:\n s = atan2(p1.y - arc.y, p1.x - arc.x),\n m = atan2(p2.y - arc.y, p2.x - arc.x),\n e = atan2(p3.y - arc.y, p3.x - arc.x),\n _;\n // determine arc direction (cw/ccw correction)\n if (s < e) {\n // if s m || m > e) {\n s += tau;\n }\n if (s > e) {\n _ = e;e = s;s = _;\n }\n } else {\n // if e -1) {\n _this2.extendMethod(mm, ctxMethod, currentMixin);\n } else {\n if (_this2.opt.warn) {\n console.warn(mm + ' method already exists within the ' + _this2.context.constructor.name + ' component.');\n }\n if (_this2.opt.mergeDuplicates) {\n _this2.extendMethod(mm, ctxMethod, currentMixin);\n }\n }\n }\n });\n this.addNewMethod(mm, currentMixin);\n }\n }]);\n\n return Mixins;\n }();\n\n var mix = new Mixins();\n\n module.exports = mix.init.bind(mix);\n }, {}], 6: [function (require, module, exports) {\n (function (global) {\n (function (f) {\n if ((typeof exports === \"undefined\" ? \"undefined\" : _typeof2(exports)) === \"object\" && typeof module !== \"undefined\") {\n module.exports = f();\n } else if (typeof define === \"function\" && define.amd) {\n define([], f);\n } else {\n var g;if (typeof window !== \"undefined\") {\n g = window;\n } else if (typeof global !== \"undefined\") {\n g = global;\n } else if (typeof self !== \"undefined\") {\n g = self;\n } else {\n g = this;\n }g.Ez = f();\n }\n })(function () {\n var define, module, exports;return function e(t, n, r) {\n function s(o, u) {\n if (!n[o]) {\n if (!t[o]) {\n var a = typeof require == \"function\" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);var f = new Error(\"Cannot find module '\" + o + \"'\");throw f.code = \"MODULE_NOT_FOUND\", f;\n }var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) {\n var n = t[o][1][e];return s(n ? n : e);\n }, l, l.exports, e, t, n, r);\n }return n[o].exports;\n }var i = typeof require == \"function\" && require;for (var o = 0; o < r.length; o++) {\n s(r[o]);\n }return s;\n }({ 1: [function (require, module, exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.easeInQuad = easeInQuad;\n exports.easeOutQuad = easeOutQuad;\n exports.easeInOutQuad = easeInOutQuad;\n exports.easeInCubic = easeInCubic;\n exports.easeOutCubic = easeOutCubic;\n exports.easeInOutCubic = easeInOutCubic;\n exports.easeInQuart = easeInQuart;\n exports.easeOutQuart = easeOutQuart;\n exports.easeInOutQuart = easeInOutQuart;\n exports.easeInQuint = easeInQuint;\n exports.easeOutQuint = easeOutQuint;\n exports.easeInOutQuint = easeInOutQuint;\n exports.easeInSine = easeInSine;\n exports.easeOutSine = easeOutSine;\n exports.easeInOutSine = easeInOutSine;\n exports.easeInExpo = easeInExpo;\n exports.easeOutExpo = easeOutExpo;\n exports.easeInOutExpo = easeInOutExpo;\n exports.easeInCirc = easeInCirc;\n exports.easeOutCirc = easeOutCirc;\n exports.easeInOutCirc = easeInOutCirc;\n exports.easeInElastic = easeInElastic;\n exports.easeOutElastic = easeOutElastic;\n exports.easeInOutElastic = easeInOutElastic;\n exports.easeInBack = easeInBack;\n exports.easeOutBack = easeOutBack;\n exports.easeInOutBack = easeInOutBack;\n exports.easeInBounce = easeInBounce;\n exports.easeOutBounce = easeOutBounce;\n exports.easeInOutBounce = easeInOutBounce;\n\n function easeInQuad(t, b, c, d) {\n return c * (t /= d) * t + b;\n }\n\n function easeOutQuad(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n }\n\n function easeInOutQuad(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t + b;\n return -c / 2 * (--t * (t - 2) - 1) + b;\n }\n\n function easeInCubic(t, b, c, d) {\n return c * (t /= d) * t * t + b;\n }\n\n function easeOutCubic(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }\n\n function easeInOutCubic(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n\n function easeInQuart(t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }\n\n function easeOutQuart(t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }\n\n function easeInOutQuart(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n\n function easeInQuint(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }\n\n function easeOutQuint(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }\n\n function easeInOutQuint(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n\n function easeInSine(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n function easeOutSine(t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }\n\n function easeInOutSine(t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }\n\n function easeInExpo(t, b, c, d) {\n return t == 0 ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }\n\n function easeOutExpo(t, b, c, d) {\n return t == d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }\n\n function easeInOutExpo(t, b, c, d) {\n if (t == 0) return b;\n if (t == d) return b + c;\n if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n\n function easeInCirc(t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }\n\n function easeOutCirc(t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }\n\n function easeInOutCirc(t, b, c, d) {\n if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n\n function easeInElastic(t, b, c, d) {\n var s = 1.70158;var p = 0;var a = c;\n if (t == 0) return b;if ((t /= d) == 1) return b + c;if (!p) p = d * .3;\n\n if (a < Math.abs(c)) {\n a = c;var s = p / 4;\n } else var s = p / (2 * Math.PI) * Math.asin(c / a);\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n }\n\n function easeOutElastic(t, b, c, d) {\n var s = 1.70158;var p = 0;var a = c;\n if (t == 0) return b;if ((t /= d) == 1) return b + c;if (!p) p = d * .3;\n\n if (a < Math.abs(c)) {\n a = c;var s = p / 4;\n } else var s = p / (2 * Math.PI) * Math.asin(c / a);\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n }\n\n function easeInOutElastic(t, b, c, d) {\n var s = 1.70158;var p = 0;var a = c;\n if (t == 0) return b;if ((t /= d / 2) == 2) return b + c;if (!p) p = d * (.3 * 1.5);\n\n if (a < Math.abs(c)) {\n a = c;var s = p / 4;\n } else var s = p / (2 * Math.PI) * Math.asin(c / a);\n if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;\n }\n\n function easeInBack(t, b, c, d, s) {\n if (s == undefined) s = 1.70158;\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }\n\n function easeOutBack(t, b, c, d, s) {\n if (s == undefined) s = 1.70158;\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n\n function easeInOutBack(t, b, c, d, s) {\n if (s == undefined) s = 1.70158;\n if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n\n function easeInBounce(t, b, c, d) {\n return c - easeOutBounce(d - t, 0, c, d) + b;\n }\n\n function easeOutBounce(t, b, c, d) {\n\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + .75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + .9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + .984375) + b;\n }\n }\n\n function easeInOutBounce(t, b, c, d) {\n if (t < d / 2) return easeInBounce(t * 2, 0, c, d) * .5 + b;\n return easeOutBounce(t * 2 - d, 0, c, d) * .5 + c * .5 + b;\n }\n }, {}] }, {}, [1])(1);\n });\n }).call(this, typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {});\n }, {}], 7: [function (require, module, exports) {\n function n(n) {\n return n = n || Object.create(null), { on: function on(t, o) {\n (n[t] || (n[t] = [])).push(o);\n }, off: function off(t, o) {\n n[t] && n[t].splice(n[t].indexOf(o) >>> 0, 1);\n }, emit: function emit(t, o) {\n (n[t] || []).map(function (n) {\n n(o);\n }), (n[\"*\"] || []).map(function (n) {\n n(t, o);\n });\n } };\n }module.exports = n;\n }, {}], 8: [function (require, module, exports) {\n (function (process) {\n // Generated by CoffeeScript 1.12.2\n (function () {\n var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;\n\n if (typeof performance !== \"undefined\" && performance !== null && performance.now) {\n module.exports = function () {\n return performance.now();\n };\n } else if (typeof process !== \"undefined\" && process !== null && process.hrtime) {\n module.exports = function () {\n return (getNanoSeconds() - nodeLoadTime) / 1e6;\n };\n hrtime = process.hrtime;\n getNanoSeconds = function getNanoSeconds() {\n var hr;\n hr = hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n moduleLoadTime = getNanoSeconds();\n upTime = process.uptime() * 1e9;\n nodeLoadTime = moduleLoadTime - upTime;\n } else if (Date.now) {\n module.exports = function () {\n return Date.now() - loadTime;\n };\n loadTime = Date.now();\n } else {\n module.exports = function () {\n return new Date().getTime() - loadTime;\n };\n loadTime = new Date().getTime();\n }\n }).call(this);\n }).call(this, require('_process'));\n }, { \"_process\": 9 }], 9: [function (require, module, exports) {\n // shim for using process in browser\n var process = module.exports = {};\n\n // cached from whatever global is present so that test runners that stub it\n // don't break things. But we need to wrap it in a try catch in case it is\n // wrapped in strict mode code which doesn't define any globals. It's inside a\n // function because try/catches deoptimize in certain engines.\n\n var cachedSetTimeout;\n var cachedClearTimeout;\n\n function defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n }\n function defaultClearTimeout() {\n throw new Error('clearTimeout has not been defined');\n }\n (function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n })();\n function runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n }\n function runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n }\n var queue = [];\n var draining = false;\n var currentQueue;\n var queueIndex = -1;\n\n function cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n }\n\n function drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while (len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n }\n\n process.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n };\n\n // v8 likes predictible objects\n function Item(fun, array) {\n this.fun = fun;\n this.array = array;\n }\n Item.prototype.run = function () {\n this.fun.apply(null, this.array);\n };\n process.title = 'browser';\n process.browser = true;\n process.env = {};\n process.argv = [];\n process.version = ''; // empty string to avoid regexp issues\n process.versions = {};\n\n function noop() {}\n\n process.on = noop;\n process.addListener = noop;\n process.once = noop;\n process.off = noop;\n process.removeListener = noop;\n process.removeAllListeners = noop;\n process.emit = noop;\n\n process.binding = function (name) {\n throw new Error('process.binding is not supported');\n };\n\n process.cwd = function () {\n return '/';\n };\n process.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n };\n process.umask = function () {\n return 0;\n };\n }, {}], 10: [function (require, module, exports) {\n // TinyColor v1.4.1\n // https://github.com/bgrins/TinyColor\n // Brian Grinstead, MIT License\n\n (function (Math) {\n\n var trimLeft = /^\\s+/,\n trimRight = /\\s+$/,\n tinyCounter = 0,\n mathRound = Math.round,\n mathMin = Math.min,\n mathMax = Math.max,\n mathRandom = Math.random;\n\n function tinycolor(color, opts) {\n\n color = color ? color : '';\n opts = opts || {};\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n\n var rgb = inputToRGB(color);\n this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = mathRound(100 * this._a) / 100, this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) {\n this._r = mathRound(this._r);\n }\n if (this._g < 1) {\n this._g = mathRound(this._g);\n }\n if (this._b < 1) {\n this._b = mathRound(this._b);\n }\n\n this._ok = rgb.ok;\n this._tc_id = tinyCounter++;\n }\n\n tinycolor.prototype = {\n isDark: function isDark() {\n return this.getBrightness() < 128;\n },\n isLight: function isLight() {\n return !this.isDark();\n },\n isValid: function isValid() {\n return this._ok;\n },\n getOriginalInput: function getOriginalInput() {\n return this._originalInput;\n },\n getFormat: function getFormat() {\n return this._format;\n },\n getAlpha: function getAlpha() {\n return this._a;\n },\n getBrightness: function getBrightness() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function getLuminance() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r / 255;\n GsRGB = rgb.g / 255;\n BsRGB = rgb.b / 255;\n\n if (RsRGB <= 0.03928) {\n R = RsRGB / 12.92;\n } else {\n R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n }\n if (GsRGB <= 0.03928) {\n G = GsRGB / 12.92;\n } else {\n G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n }\n if (BsRGB <= 0.03928) {\n B = BsRGB / 12.92;\n } else {\n B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n }\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n },\n setAlpha: function setAlpha(value) {\n this._a = boundAlpha(value);\n this._roundA = mathRound(100 * this._a) / 100;\n return this;\n },\n toHsv: function toHsv() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };\n },\n toHsvString: function toHsvString() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = mathRound(hsv.h * 360),\n s = mathRound(hsv.s * 100),\n v = mathRound(hsv.v * 100);\n return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n },\n toHsl: function toHsl() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };\n },\n toHslString: function toHslString() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = mathRound(hsl.h * 360),\n s = mathRound(hsl.s * 100),\n l = mathRound(hsl.l * 100);\n return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n },\n toHex: function toHex(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function toHexString(allow3Char) {\n return '#' + this.toHex(allow3Char);\n },\n toHex8: function toHex8(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function toHex8String(allow4Char) {\n return '#' + this.toHex8(allow4Char);\n },\n toRgb: function toRgb() {\n return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };\n },\n toRgbString: function toRgbString() {\n return this._a == 1 ? \"rgb(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \")\" : \"rgba(\" + mathRound(this._r) + \", \" + mathRound(this._g) + \", \" + mathRound(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function toPercentageRgb() {\n return { r: mathRound(bound01(this._r, 255) * 100) + \"%\", g: mathRound(bound01(this._g, 255) * 100) + \"%\", b: mathRound(bound01(this._b, 255) * 100) + \"%\", a: this._a };\n },\n toPercentageRgbString: function toPercentageRgbString() {\n return this._a == 1 ? \"rgb(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + mathRound(bound01(this._r, 255) * 100) + \"%, \" + mathRound(bound01(this._g, 255) * 100) + \"%, \" + mathRound(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function toName() {\n if (this._a === 0) {\n return \"transparent\";\n }\n\n if (this._a < 1) {\n return false;\n }\n\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function toFilter(secondColor) {\n var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n\n return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n },\n toString: function toString(format) {\n var formatSet = !!format;\n format = format || this._format;\n\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n\n return formattedString || this.toHexString();\n },\n clone: function clone() {\n return tinycolor(this.toString());\n },\n\n _applyModification: function _applyModification(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function lighten() {\n return this._applyModification(_lighten, arguments);\n },\n brighten: function brighten() {\n return this._applyModification(_brighten, arguments);\n },\n darken: function darken() {\n return this._applyModification(_darken, arguments);\n },\n desaturate: function desaturate() {\n return this._applyModification(_desaturate, arguments);\n },\n saturate: function saturate() {\n return this._applyModification(_saturate, arguments);\n },\n greyscale: function greyscale() {\n return this._applyModification(_greyscale, arguments);\n },\n spin: function spin() {\n return this._applyModification(_spin, arguments);\n },\n\n _applyCombination: function _applyCombination(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function analogous() {\n return this._applyCombination(_analogous, arguments);\n },\n complement: function complement() {\n return this._applyCombination(_complement, arguments);\n },\n monochromatic: function monochromatic() {\n return this._applyCombination(_monochromatic, arguments);\n },\n splitcomplement: function splitcomplement() {\n return this._applyCombination(_splitcomplement, arguments);\n },\n triad: function triad() {\n return this._applyCombination(_triad, arguments);\n },\n tetrad: function tetrad() {\n return this._applyCombination(_tetrad, arguments);\n }\n };\n\n // If input is an object, force 1 into \"1.0\" to handle ratios properly\n // String input requires \"1.0\" as input, so 1 will be treated as 1\n tinycolor.fromRatio = function (color, opts) {\n if ((typeof color === \"undefined\" ? \"undefined\" : _typeof2(color)) == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n } else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n\n return tinycolor(color, opts);\n };\n\n // Given a string or object, convert that input to RGB\n // Possible string inputs:\n //\n // \"red\"\n // \"#f00\" or \"f00\"\n // \"#ff0000\" or \"ff0000\"\n // \"#ff000000\" or \"ff000000\"\n // \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n // \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n // \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n // \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n // \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n // \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n // \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n //\n function inputToRGB(color) {\n\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n\n if ((typeof color === \"undefined\" ? \"undefined\" : _typeof2(color)) == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n\n a = boundAlpha(a);\n\n return {\n ok: ok,\n format: color.format || format,\n r: mathMin(255, mathMax(rgb.r, 0)),\n g: mathMin(255, mathMax(rgb.g, 0)),\n b: mathMin(255, mathMax(rgb.b, 0)),\n a: a\n };\n }\n\n // Conversion Functions\n // --------------------\n\n // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n // \n\n // `rgbToRgb`\n // Handle bounds / percentage checking to conform to CSS color spec\n // \n // *Assumes:* r, g, b in [0, 255] or [0, 1]\n // *Returns:* { r, g, b } in [0, 255]\n function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n }\n\n // `rgbToHsl`\n // Converts an RGB color value to HSL.\n // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n // *Returns:* { h, s, l } in [0,1]\n function rgbToHsl(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b),\n min = mathMin(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);break;\n case g:\n h = (b - r) / d + 2;break;\n case b:\n h = (r - g) / d + 4;break;\n }\n\n h /= 6;\n }\n\n return { h: h, s: s, l: l };\n }\n\n // `hslToRgb`\n // Converts an HSL color value to RGB.\n // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n // *Returns:* { r, g, b } in the set [0, 255]\n function hslToRgb(h, s, l) {\n var r, g, b;\n\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n }\n\n // `rgbToHsv`\n // Converts an RGB color value to HSV\n // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n // *Returns:* { h, s, v } in [0,1]\n function rgbToHsv(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b),\n min = mathMin(r, g, b);\n var h,\n s,\n v = max;\n\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);break;\n case g:\n h = (b - r) / d + 2;break;\n case b:\n h = (r - g) / d + 4;break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n }\n\n // `hsvToRgb`\n // Converts an HSV color value to RGB.\n // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n // *Returns:* { r, g, b } in the set [0, 255]\n function hsvToRgb(h, s, v) {\n\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n }\n\n // `rgbToHex`\n // Converts an RGB color to hex\n // Assumes r, g, and b are contained in the set [0, 255]\n // Returns a 3 or 6 character hex\n function rgbToHex(r, g, b, allow3Char) {\n\n var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n\n return hex.join(\"\");\n }\n\n // `rgbaToHex`\n // Converts an RGBA color plus alpha transparency to hex\n // Assumes r, g, b are contained in the set [0, 255] and\n // a in [0, 1]. Returns a 4 or 8 character rgba hex\n function rgbaToHex(r, g, b, a, allow4Char) {\n\n var hex = [pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n\n return hex.join(\"\");\n }\n\n // `rgbaToArgbHex`\n // Converts an RGBA color to an ARGB Hex8 string\n // Rarely used, but required for \"toFilter()\"\n function rgbaToArgbHex(r, g, b, a) {\n\n var hex = [pad2(convertDecimalToHex(a)), pad2(mathRound(r).toString(16)), pad2(mathRound(g).toString(16)), pad2(mathRound(b).toString(16))];\n\n return hex.join(\"\");\n }\n\n // `equals`\n // Can be called with any tinycolor input\n tinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) {\n return false;\n }\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n };\n\n tinycolor.random = function () {\n return tinycolor.fromRatio({\n r: mathRandom(),\n g: mathRandom(),\n b: mathRandom()\n });\n };\n\n // Modification Functions\n // ----------------------\n // Thanks to less.js for some of the basics here\n // \n\n function _desaturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n }\n\n function _saturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n }\n\n function _greyscale(color) {\n return tinycolor(color).desaturate(100);\n }\n\n function _lighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n }\n\n function _brighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var rgb = tinycolor(color).toRgb();\n rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * -(amount / 100))));\n rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * -(amount / 100))));\n rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * -(amount / 100))));\n return tinycolor(rgb);\n }\n\n function _darken(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n }\n\n // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n // Values outside of this range will be wrapped into this range.\n function _spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n }\n\n // Combination Functions\n // ---------------------\n // Thanks to jQuery xColor for some of the ideas behind these\n // \n\n function _complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n }\n\n function _triad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })];\n }\n\n function _tetrad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })];\n }\n\n function _splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }), tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l })];\n }\n\n function _analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n\n for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n }\n\n function _monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h,\n s = hsv.s,\n v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n\n while (results--) {\n ret.push(tinycolor({ h: h, s: s, v: v }));\n v = (v + modification) % 1;\n }\n\n return ret;\n }\n\n // Utility Functions\n // ---------------------\n\n tinycolor.mix = function (color1, color2, amount) {\n amount = amount === 0 ? 0 : amount || 50;\n\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n\n var p = amount / 100;\n\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a\n };\n\n return tinycolor(rgba);\n };\n\n // Readability Functions\n // ---------------------\n // false\n // tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\n tinycolor.isReadable = function (color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n\n out = false;\n\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n };\n\n // `mostReadable`\n // Given a base color and a list of possible foreground or background\n // colors for that base, returns the most readable color.\n // Optionally returns Black or White if the most readable color is unreadable.\n // *Example*\n // tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n // tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n // tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n // tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\n tinycolor.mostReadable = function (baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors;\n level = args.level;\n size = args.size;\n\n for (var i = 0; i < colorList.length; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n\n if (tinycolor.isReadable(baseColor, bestColor, { \"level\": level, \"size\": size }) || !includeFallbackColors) {\n return bestColor;\n } else {\n args.includeFallbackColors = false;\n return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n }\n };\n\n // Big List of Colors\n // ------------------\n // \n var names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n };\n\n // Make it easy to access colors via `hexNames[hex]`\n var hexNames = tinycolor.hexNames = flip(names);\n\n // Utilities\n // ---------\n\n // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\n function flip(o) {\n var flipped = {};\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n }\n\n // Return a valid alpha value [0,1] with all invalid values being set to 1\n function boundAlpha(a) {\n a = parseFloat(a);\n\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n\n return a;\n }\n\n // Take input from [0, n] and return it as [0, 1]\n function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = \"100%\";\n }\n\n var processPercent = isPercentage(n);\n n = mathMin(max, mathMax(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n }\n\n // Force a number between 0 and 1\n function clamp01(val) {\n return mathMin(1, mathMax(0, val));\n }\n\n // Parse a base-16 hex value into a base-10 integer\n function parseIntFromHex(val) {\n return parseInt(val, 16);\n }\n\n // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n // \n function isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf('.') != -1 && parseFloat(n) === 1;\n }\n\n // Check to see if string passed in is a percentage\n function isPercentage(n) {\n return typeof n === \"string\" && n.indexOf('%') != -1;\n }\n\n // Force a hex value to have 2 characters\n function pad2(c) {\n return c.length == 1 ? '0' + c : '' + c;\n }\n\n // Replace a decimal with it's percentage value\n function convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n\n return n;\n }\n\n // Converts a decimal to a hex value\n function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n }\n // Converts a hex value to a decimal\n function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n }\n\n var matchers = function () {\n\n // \n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // \n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n }();\n\n // `isValidCSSUnit`\n // Take in a single string / number and check to see if it looks like a CSS unit\n // (see `matchers` above for definition).\n function isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n }\n\n // `stringInputToObject`\n // Permissive string parsing. Take in a number of formats, and output an object\n // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\n function stringInputToObject(color) {\n\n color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n } else if (color == 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: \"name\" };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if (match = matchers.rgb.exec(color)) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n if (match = matchers.rgba.exec(color)) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n if (match = matchers.hsl.exec(color)) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n if (match = matchers.hsla.exec(color)) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n if (match = matchers.hsv.exec(color)) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n if (match = matchers.hsva.exec(color)) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n if (match = matchers.hex8.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if (match = matchers.hex4.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n a: convertHexToDecimal(match[4] + '' + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + '' + match[1]),\n g: parseIntFromHex(match[2] + '' + match[2]),\n b: parseIntFromHex(match[3] + '' + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n\n return false;\n }\n\n function validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || { \"level\": \"AA\", \"size\": \"small\" };\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return { \"level\": level, \"size\": size };\n }\n\n // Node: Export function\n if (typeof module !== \"undefined\" && module.exports) {\n module.exports = tinycolor;\n }\n // AMD/requirejs: Define the module\n else if (typeof define === 'function' && define.amd) {\n define(function () {\n return tinycolor;\n });\n }\n // Browser: Expose to window\n else {\n window.tinycolor = tinycolor;\n }\n })(Math);\n }, {}], 11: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _es6Mixins = require('es6-mixins');\n\n var _es6Mixins2 = _interopRequireDefault(_es6Mixins);\n\n var _helper = require('../util/helper');\n\n var _randomColor = require('../util/randomColor');\n\n var _randomColor2 = _interopRequireDefault(_randomColor);\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _wxChart = require('./wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _title = require('../core/title');\n\n var _title2 = _interopRequireDefault(_title);\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _scale3 = require('../scale/scale.liner');\n\n var _scale4 = _interopRequireDefault(_scale3);\n\n var _scale5 = require('../scale/scale.crosshelp');\n\n var _scale6 = _interopRequireDefault(_scale5);\n\n var _scale7 = require('../scale/scale.stackhelp');\n\n var _scale8 = _interopRequireDefault(_scale7);\n\n var _scale9 = require('../scale/scale.category');\n\n var _scale10 = _interopRequireDefault(_scale9);\n\n var _legend = require('../core/legend');\n\n var _legend2 = _interopRequireDefault(_legend);\n\n var _layout = require('../core/layout');\n\n var _layout2 = _interopRequireDefault(_layout);\n\n var _animation = require('../core/animation');\n\n var _animation2 = _interopRequireDefault(_animation);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n var tinycolor = require(\"tinycolor2\");\n // Bar legend's default config\n var WX_BAR_LEGEND_DEFAULT_CONFIG = {\n borderWidth: 1,\n fillArea: true,\n fillAlpha: 0.5,\n display: true,\n // barWidth: 'auto' //Set each bar's width. If not set, the bars are sized automatically.\n barPercentage: 0.8 // Percent (0-1) of the available width each bar should be within the data point space,like the flexible layout~\n // fillStyle\n // strokeStyle\n };\n // Bar default config\n var WX_BAR_DEFAULT_CONFIG = {\n minBetweenPixel: 5, // The minisize space between each bar.\n pointPercentage: 0.8, // Percent (0-1) of the space for each data point\n stacked: false, // If true, bars are stacked on the x-axis\n zeroLine: false,\n // barPercentage: 0.8 // If stacked is true, global \"barPercentage\" setting will be effective. Otherwise, legend's setting priorities.\n // Scale options\n xScaleOptions: {\n position: 'bottom'\n },\n xScaleItemOptions: undefined,\n yScaleOptions: {\n position: 'left'\n },\n yScaleItemOptions: undefined,\n crossScaleOptions: {\n xMargin: function xMargin(xBox, yBox, area, xScale, yScale, xScaleDatasets) {\n return xScale.calculateTickWidth(xScaleDatasets, xBox);\n },\n xFirstPointSpace: 0\n },\n // The title text or a title config object\n title: undefined,\n\n // The legend of line chart\n legends: [], // borderWidth, fillArea, fillAlpha can be set in here\n legendOptions: {\n 'position': 'bottom'\n },\n\n point: {},\n\n // The randomColor scheme\n // See https://github.com/davidmerfield/randomColor\n color: {\n hue: 'red',\n luminosity: 'light'\n },\n\n // The dataset's default key\n defaultKey: 'value',\n\n // Animation\n animate: true,\n animateOptions: {\n start: 1,\n end: 1001,\n duration: 1000\n }\n };\n\n var WX_BAR_ITEM_DEFAULT_CONFIG = {\n showItem: true,\n // format: // title format function\n //borderWidth: 1,\n //fillArea: true,\n //fillAlpha: 0.5,\n //strokeStyle: '#ffffff',\n display: true\n };\n\n var WxBar = function (_WxChart) {\n _inherits(WxBar, _WxChart);\n\n /**\r\n * WxBar chart\r\n * @constructor\r\n * @param {string} id - The canvas element's id\r\n * @param {Object} config\r\n * @param {number} [config.width=300] - The width of canvas.\r\n * @param {number} [config.height=200] - The height of canvas.\r\n * @param {number} [config.padding=] - The padding of canvas.\r\n * @param {string} [config.display=block] - The display style of chart.\r\n *\r\n * @param {Object} config.legendOptions=[] - The legend & label options.You should set 'key' to bind the attribute in datasets which is the value of the point.\r\n * @param {(string|Object)} [config.title=] - The title text or title options of chart.\r\n * @example\r\n *datasets:[{\r\n * valueA: 30,\r\n * valueB: 40,\r\n * label: '一月'\r\n * }, {\r\n * valueA: 20,\r\n * valueB: 50,\r\n * pointRadius: 2,\r\n * label: '二月'\r\n *},...]\r\n *\r\n * legends: [{\r\n * 'text': 'valueA Text',\r\n * 'key': 'valueA',\r\n * 'strokeStyle': '#3385ff',\r\n * 'barPercentage': 0.8\r\n * }, {\r\n * text: 'valueB Text',\r\n * key: 'valueB'\r\n * }]\r\n */\n function WxBar(id, config) {\n _classCallCheck(this, WxBar);\n\n var _this = _possibleConstructorReturn(this, (WxBar.__proto__ || Object.getPrototypeOf(WxBar)).call(this, id, config));\n\n _this.__drawBar = function (p, percent, box, legend, stacked, hasNeg, setBarItem) {\n var ctx = _this.ctx;\n var px = void 0,\n py = void 0,\n width = void 0,\n height = void 0;\n\n var value = p.value,\n data = p.data,\n point = p.point,\n index = p.index;\n var borderWidth = legend.borderWidth,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n var showItem = data.showItem,\n format = data.format,\n label = data.label;\n\n if (!p || !p.point) {\n return { px: px, py: py, width: width, height: height };\n }\n\n var _p$point = p.point,\n pointX = _p$point.x,\n pointY = _p$point.y,\n barWidth = _p$point.barWidth,\n barHeight = _p$point.barHeight;\n\n if (stacked && hasNeg) {\n width = barWidth;\n height = barHeight * percent;\n px = pointX;\n py = pointY + barHeight / 2 - height / 2;\n } else {\n px = pointX;\n width = barWidth;\n height = barHeight * percent;\n py = pointY + barHeight * (1 - percent);\n }\n\n ctx.save();\n\n ctx.fillStyle = fillStyle;\n ctx.strokeStyle = strokeStyle;\n ctx.lineWidth = borderWidth;\n // First, fill\n if (fillArea) {\n ctx.beginPath();\n ctx.globalAlpha = fillAlpha;\n ctx.rect(px, py, width, height);\n ctx.fill();\n ctx.globalAlpha = 1;\n }\n // Next, stroke\n if (borderWidth) {\n ctx.beginPath();\n if (stacked && hasNeg) {\n ctx.rect(px, py, width, height);\n } else {\n ctx.moveTo(px, py + height);\n ctx.lineTo(px, py);\n ctx.lineTo(px + width, py);\n ctx.lineTo(px + width, py + height);\n }\n ctx.stroke();\n }\n\n // Show bar item\n if (!!setBarItem && !!showItem && !stacked) {\n var curFillStyle = ctx.fillStyle;\n ctx.textBaseline = \"bottom\";\n ctx.fillStyle = tinycolor(curFillStyle).darken(15).toString();\n ctx.fillStyle = curFillStyle;\n\n var barItem = _helper.is.Function(format) ? format.call(_this, label, value, index) : p.value + '';\n\n var boxX = box.x,\n boxY = box.y;\n\n var itemX = px + barWidth / 2 - ctx.measureText(barItem).width / 2,\n itemY = py - ctx.fontSize / 4;\n\n // Check box's X,Y\n if (itemX < box.x) {\n itemX = box.x;\n }\n if (itemY < box.y) {\n itemY = box.y;\n }\n\n ctx.fillText(barItem, itemX, itemY);\n }\n\n ctx.draw();\n ctx.restore();\n\n return { px: px, py: py, width: width, height: height };\n };\n\n (0, _es6Mixins2.default)([_scale8.default], _this, {\n // Mixins will create a new method to nested call all duplicate method\n mergeDuplicates: false\n });\n\n var me = _this;\n me.chartConfig = (0, _helper.extend)({}, WX_BAR_DEFAULT_CONFIG, config);\n\n me.title = null;\n // Initialize title and legend\n if (me.chartConfig.title) {\n me.title = new _title2.default(me, _helper.is.PureObject(me.chartConfig.title) ? me.chartConfig.title : null);\n me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;\n }\n\n // Initialize legend\n me.legend = new _legend2.default(me, me.chartConfig.legendOptions);\n\n // Initialize x,y Scale\n me.yAxis = new _scale4.default(me, me.chartConfig.yScaleOptions);\n me.xAxis = new _scale10.default(me, me.chartConfig.xScaleOptions);\n me.wxCrossScale = new _scale6.default(me.xAxis, me.yAxis, me.chartConfig.crossScaleOptions);\n me.wxLayout = new _layout2.default(me);\n\n // Initialize wxAnimation\n if (me.chartConfig.animate) me.wxAnimation = new _animation2.default(me.chartConfig.animateOptions);\n\n me.emit('init', {\n options: me.chartConfig\n });\n return _this;\n }\n\n // Get/Set labels\n\n\n _createClass(WxBar, [{\n key: '_getLegendConfig',\n\n /**\r\n * Build legends config\r\n * @private\r\n */\n value: function _getLegendConfig() {\n var me = this,\n defaultKey = me.chartConfig.defaultKey || 'value',\n legendsConfig = me.chartConfig.legends;\n if (!legendsConfig) {\n if (me.labels && me.labels.length) {\n legendsConfig = me.labels.map(function (label) {\n return { 'text': label, 'key': defaultKey };\n });\n } else {\n throw new Error('Can not get legend config!');\n }\n } else {\n legendsConfig = legendsConfig.map(function (legend) {\n return (0, _helper.extend)(true, {\n 'key': defaultKey\n }, legend);\n });\n }\n return legendsConfig;\n }\n /**\r\n * Update a datesets of chart and reDraw\r\n * @param {Object} datasets - data sets\r\n * @param {string} [datasets[].display] - Disaply the bar or not\r\n * @param {string} [datasets[].borderWidth=1] - Bar's border width\r\n * @param {string} [datasets[].strokeStyle] - Bar's border color\r\n * @param {number} [datasets[].fillArea=true] - Fill color or not\r\n * @param {number} [datasets[].fillAlpha=0.6] - Fill color Alpha\r\n * @param {number} [datasets[].fillStyle] - Fill color. The default color will randomly assigned by 'color' option.\r\n * @returns {*}\r\n */\n\n }, {\n key: 'update',\n value: function update(datasets) {\n var me = this;\n me._labels = null;\n me._legends = null;\n _get(WxBar.prototype.__proto__ || Object.getPrototypeOf(WxBar.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_BAR_ITEM_DEFAULT_CONFIG, me.chartConfig.point));\n me.wxLayout.removeAllBox();\n if (me.wxAnimation) me.wxAnimation.reset();\n return me.draw();\n }\n /**\r\n * Draw chart\r\n */\n\n }, {\n key: 'draw',\n value: function draw() {\n var box = void 0,\n me = this,\n ctx = me.ctx,\n animate = me.chartConfig.animate,\n wxLayout = me.wxLayout;\n var _me$chartConfig = me.chartConfig,\n pointPercentage = _me$chartConfig.pointPercentage,\n minBetweenPixel = _me$chartConfig.minBetweenPixel,\n stacked = _me$chartConfig.stacked,\n color = _me$chartConfig.color,\n zeroLine = _me$chartConfig.zeroLine;\n\n me.emit('beforeDraw', {\n options: me.chartConfig\n });\n\n // First, we draw title\n box = wxLayout.adjustBox();\n if (me.title) {\n me.title.update(me.titleText, box);\n wxLayout.addBox(me.title.box);\n }\n\n // Second, random color and get legend datasets\n box = wxLayout.adjustBox();\n var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.legends.length }));\n\n me.legends = me.legends.map(function (legend, index) {\n if (!legend.strokeStyle) {\n legend.strokeStyle = legend.borderColor || tinycolor(rColors[index]).darken(10).toString();\n }\n\n return (0, _helper.extend)(true, {\n fillStyle: rColors[index]\n }, WX_BAR_LEGEND_DEFAULT_CONFIG, legend);\n });\n me.legend.update(me.legends, box);\n wxLayout.addBox(me.legend.box);\n\n // Thirdly, draw scale\n me._drawScale(wxLayout);\n\n box = wxLayout.adjustBox();\n // Calculate bar ruler\n me.barRuler = me.calculateBarRuler();\n // Finally, draw bar\n var hasNeg = false;\n var barConfigs = me.legends.map(function (legend, legendIndex) {\n var config = {\n box: box,\n legend: legend\n };\n var key = legend.key;\n config.dataset = me.visDatasets.map(function (data, index) {\n hasNeg = hasNeg || data[key] < 0;\n return {\n value: data[key],\n data: data,\n point: me.calculateBarRect(index, legendIndex),\n index: index\n };\n });\n return config;\n });\n\n barConfigs.forEach(function (bar) {\n return me.drawBar(bar, hasNeg);\n });\n\n if (animate) {\n me.emit('animate', { animation: me.wxAnimation });\n me.wxAnimation.run(true);\n me.wxAnimation.on('done', function () {\n if (zeroLine) me._darwZeroLine();\n me.emit('draw', {\n options: barConfigs\n });\n });\n } else {\n if (zeroLine) me._darwZeroLine();\n me.emit('draw', {\n options: barConfigs\n });\n }\n }\n\n /**\r\n * Draw zero line\r\n * @private\r\n */\n\n }, {\n key: '_darwZeroLine',\n value: function _darwZeroLine() {\n var me = this,\n ctx = me.ctx;\n // zero line\n ctx.save();\n ctx.fillStyle = me.xAxis.config.color;\n ctx.lineWidth = me.xAxis.config.lineWidth;\n\n var baseY = me.yAxis.getPoint(0).y;\n ctx.beginPath();\n ctx.moveTo(me.xAxis.getPoint(-1).x, baseY);\n ctx.lineTo(me.xAxis.box.ex, baseY);\n ctx.stroke();\n ctx.restore();\n }\n }, {\n key: '_getAnimationDrawBar',\n\n /**\r\n * Return a animate tick func\r\n * @param barData\r\n * @param hasNeg\r\n * @return {function(*, *, *)|null}\r\n * @private\r\n */\n value: function _getAnimationDrawBar(barData, hasNeg) {\n var me = this,\n backgroundColor = me.config.backgroundColor,\n stacked = me.chartConfig.stacked,\n animate = me.chartConfig.animate,\n animateOpt = me.chartConfig.animateOptions,\n ctx = me.ctx;\n\n var box = barData.box,\n legend = barData.legend,\n dataset = barData.dataset;\n var display = legend.display,\n borderWidth = legend.borderWidth,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n // Animation dynamic options\n\n var dataLen = dataset.length,\n categoryTicks = (animateOpt.end - animateOpt.start) / dataLen;\n\n if (!display) {\n return;\n }\n\n return function (t, lastData, toNext) {\n var dataIndex = Math.floor(t / categoryTicks);\n var currData = dataIndex < dataLen ? dataset[dataIndex] : dataset[dataLen - 1];\n var point = currData.point;\n\n var percent = t % categoryTicks / categoryTicks;\n\n if (lastData) {\n var lastDataIndex = lastData.dataIndex,\n lastPercent = lastData.percent,\n lastt = lastData.t,\n lastx = lastData.x,\n lasty = lastData.y,\n lastWidth = lastData.width,\n lastHeight = lastData.height;\n\n if (lastDataIndex < dataLen && lastx) {\n ctx.save();\n // TODO: optimize clear check!!\n if (backgroundColor) {\n ctx.beginPath();\n ctx.lineWidth = borderWidth;\n ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';\n ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';\n ctx.fillRect(lastx, lasty, lastWidth, lastHeight);\n } else {\n ctx.clearRect(lastx, lasty, lastWidth, lastHeight);\n }\n if (borderWidth) {\n ctx.beginPath();\n ctx.lineWidth = borderWidth + 0.5;\n ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';\n ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';\n if (stacked && hasNeg) {\n ctx.rect(lastx, lasty, lastWidth, lastHeight);\n } else {\n ctx.moveTo(lastx, lasty + lastHeight);\n ctx.lineTo(lastx, lasty);\n ctx.lineTo(lastx + lastWidth, lasty);\n ctx.lineTo(lastx + lastWidth, lasty + lastHeight);\n }\n ctx.stroke();\n }\n ctx.draw();\n ctx.restore();\n }\n\n if (lastDataIndex !== dataIndex && !!lastPercent) {\n // End the lasted bar\n var _lastData = lastDataIndex < dataLen ? dataset[lastDataIndex] : dataset[dataLen - 1];\n me.__drawBar(_lastData, 1, box, legend, stacked, hasNeg, true);\n }\n }\n\n var px = void 0,\n py = void 0,\n width = void 0,\n height = void 0;\n if (dataIndex < dataLen && (!!percent || !point)) {\n var _me$__drawBar = me.__drawBar(currData, percent, box, legend, stacked, hasNeg);\n\n px = _me$__drawBar.px;\n py = _me$__drawBar.py;\n width = _me$__drawBar.width;\n height = _me$__drawBar.height;\n }\n\n return {\n dataIndex: dataIndex,\n percent: percent,\n t: t,\n x: px,\n y: py,\n width: width,\n height: height\n };\n };\n }\n }, {\n key: '_drawBar',\n value: function _drawBar(barData, hasNeg) {\n var me = this,\n stacked = me.chartConfig.stacked,\n ctx = me.ctx;\n var box = barData.box,\n legend = barData.legend,\n dataset = barData.dataset;\n var display = legend.display,\n borderWidth = legend.borderWidth,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n if (!display) {\n return;\n }\n\n dataset.forEach(function (d) {\n me.__drawBar(d, 1, box, legend, stacked, hasNeg, true);\n // if (stacked && hasNeg) {\n // ctx.beginPath();\n // ctx.rect(point.x ,point.y ,point.barWidth, point.barHeight);\n // if (borderWidth) {\n // ctx.stroke();\n // }\n // if (fillArea) {\n // ctx.globalAlpha = fillAlpha;\n // ctx.fill();\n // ctx.globalAlpha = 1;\n // }\n // } else {\n // // | 1 2 |\n // // | 0 3 |\n // let points = [\n // [point.x, point.y + point.barHeight],\n // [point.x, point.y],\n // [point.x + point.barWidth, point.y],\n // [point.x + point.barWidth, point.y + point.barHeight]\n // ];\n //\n // ctx.moveTo(...points[0]);\n // ctx.lineTo(...points[1]);\n // ctx.lineTo(...points[2]);\n // ctx.lineTo(...points[3]);\n //\n // if (borderWidth) {\n // ctx.stroke();\n // }\n // if (fillArea) {\n // ctx.globalAlpha = fillAlpha;\n // ctx.fill();\n // ctx.globalAlpha = 1;\n // }\n // }\n });\n }\n\n /**\r\n * Draw one line\r\n * @param {Object} barData - Line dataset\r\n * @param {Object} barData.legend - Legend's config\r\n * @param {Object[]} barData[].value - Data of each line point\r\n * @param {Object[]} barData[].data - The data object\r\n * @param {Object[]} barData[].point - The point for rending.\r\n * @parma {boolean} hasNeg - Has negative value or not\r\n * @private\r\n */\n\n }, {\n key: 'drawBar',\n value: function drawBar(barData, hasNeg) {\n var me = this,\n animate = me.chartConfig.animate;\n\n if (animate) {\n var actionAnimation = me._getAnimationDrawBar(barData, hasNeg);\n me.wxAnimation.pushActions(actionAnimation);\n // me.wxAnimation.on('done', () => {\n // me._drawBar(barData, hasNeg);\n // })\n } else {\n me._drawBar(barData, hasNeg);\n }\n }\n\n /**\r\n * Bar's render ruler\r\n * @typedef {Object} BarRuler\r\n * @property {number} tickWidth - The width of one ticket.\r\n * @property {number} pointPercentage - Percent (0-1) of the space for each data point\r\n * @property {number} pointWidth - The width of each data point\r\n * @property {number} pointIntervalWidth - The remaining width of the space for each data point\r\n * @property {number} barIntervalWidth - The remaining width of each bar\r\n * @property {Object[]} legends - legends's setting\r\n * @property {number} legends.barPercentage - Percent (0-1) of the available width each bar should be within the data point space\r\n * @property {number} legends._standardPercentage - The real percent of the available with at each point scope\r\n * @property {number} legends.barWidth - The width of bar\r\n */\n\n /**\r\n * Calculate the bar's base ruler\r\n * @param {WxScale} [scale=this.xAxis] - Bar's scale\r\n * @return {BarRuler} Bar ruler\r\n */\n\n }, {\n key: 'calculateBarRuler',\n value: function calculateBarRuler() {\n var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.xAxis;\n\n var me = this;\n var globalBarWidth = void 0,\n globalBarPercentage = me.chartConfig.barPercentage,\n pointPercentage = me.chartConfig.pointPercentage,\n stacked = me.chartConfig.stacked,\n legends = me.legends;\n var legendLen = legends.length;\n\n var tickWidth = scale.calculateTickWidth();\n // One scale's point space\n var pointWidth = tickWidth * pointPercentage;\n var pointIntervalWidth = (tickWidth - pointWidth) / 2;\n\n // Standardization every bar's percentage\n var totalStandardPercentage = 0;\n if (!globalBarPercentage) {\n globalBarPercentage = stacked ? Math.max.apply(Math, _toConsumableArray(legends.map(function (x) {\n return x.barPercentage || 0.8;\n }))) || 0.8 : 0.8;\n }\n globalBarWidth = Math.max.apply(Math, _toConsumableArray([globalBarPercentage * pointWidth].concat(legends.map(function (x) {\n return _helper.is.Number(x.barWidth) ? x.barWidth : 0;\n }))));\n\n legends.forEach(function (legend) {\n if (stacked) {\n legend.barWidth = globalBarWidth;\n legend.barPercentage = globalBarPercentage;\n legend._standardPercentage = globalBarPercentage / legendLen;\n } else {\n var standardPercentage = void 0;\n var barPercentage = legend.barPercentage ? legend.barPercentage > 1 ? 1.0 : legend.barPercentage : globalBarPercentage;\n\n if (legend.barWidth) {\n // Bar fixed width...\n standardPercentage = legend.barWidth / tickWidth;\n } else {\n standardPercentage = barPercentage / legendLen;\n legend.barWidth = pointWidth * standardPercentage;\n }\n totalStandardPercentage += standardPercentage;\n legend._standardPercentage = standardPercentage;\n }\n });\n\n // Check total percentage\n if (totalStandardPercentage > 1) {\n throw Error('Bar\\'s width too large!');\n } else if (stacked) {\n totalStandardPercentage = globalBarPercentage;\n }\n\n var barIntervalWidth = legendLen > 1 ? pointWidth * (1 - totalStandardPercentage) / (legendLen - 1) : pointWidth * (1 - totalStandardPercentage);\n\n return { tickWidth: tickWidth, pointPercentage: pointPercentage, pointWidth: pointWidth, pointIntervalWidth: pointIntervalWidth, legends: legends, barIntervalWidth: barIntervalWidth };\n }\n\n /**\r\n * Calculate the box of one \"rect\"\r\n * @param {number} index - The index of item\r\n * @param {number} legendIndex - The index of legend\r\n * @param {WxScale} [xScale=this.xAxis] - Bar's x-axis\r\n * @param {WxScale} [yScale=this.yAxis] - Bar's x-axis\r\n */\n\n }, {\n key: 'calculateBarRect',\n value: function calculateBarRect(index, legendIndex) {\n var xScale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.xAxis;\n var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;\n\n var me = this,\n stacked = me.chartConfig.stacked,\n barRuler = me.barRuler || me.calculateBarRuler(xScale);\n\n var legendOpt = me.legends[legendIndex];\n if (!legendOpt) {\n return;\n }\n // Calculate the bar's width in front of this legend\n var frontBarWidth = me.legends.slice(0, legendIndex).reduce(function (acc, cur) {\n return acc + cur.barWidth;\n }, 0);\n var data = me.visDatasets[index];\n var value = legendOpt.key && typeof data[legendOpt.key] !== 'undefined' ? data[legendOpt.key] : null;\n if (_helper.is.Null(value) || _helper.is.Undefined(value)) {\n return;\n }\n\n var xPoint = void 0,\n yPoint = void 0,\n barWidth = void 0,\n barHeight = void 0;\n var xPointInstance = xScale.getPoint(index);\n if (stacked) {\n xPoint = xPointInstance.x - barRuler.pointWidth / 2 + barRuler.barIntervalWidth / 2;\n yPoint = me._getStackPoint(index, legendIndex).y;\n barWidth = legendOpt.barWidth;\n\n // TODO: Find another way to replace this variable :__sumNeg __sumPos\n var baseY = yScale.getPoint(0).y;\n barHeight = value < 0 ? value / data.__sumNeg * (yScale.getPoint(data.__sumNeg).y - baseY) : value / data.__sumPos * (baseY - yScale.getPoint(data.__sumPos).y);\n\n yPoint = value < 0 ? yPoint - barHeight : yPoint;\n } else {\n xPoint = xPointInstance.x - barRuler.pointWidth / 2 + frontBarWidth + barRuler.barIntervalWidth / 2 * (legendIndex + 1);\n yPoint = yScale.getPoint(value).y;\n barWidth = legendOpt.barWidth;\n barHeight = xPointInstance.y - yPoint;\n }\n\n return { x: xPoint, y: yPoint, barWidth: barWidth, barHeight: barHeight };\n }\n\n /**\r\n * Draw the scale of chart\r\n *\r\n * @private\r\n */\n\n }, {\n key: '_drawScale',\n value: function _drawScale(wxLayout) {\n var box = void 0,\n me = this;\n\n box = wxLayout.adjustBox();\n var xDatasets = me.xScaleAxisDatas(),\n yDatasets = me.yScaleAxisDatas(box);\n\n var _me$wxCrossScale$draw = me.wxCrossScale.draw(box, xDatasets, yDatasets),\n xBox = _me$wxCrossScale$draw.xBox,\n yBox = _me$wxCrossScale$draw.yBox;\n\n wxLayout.addBox(xBox);\n wxLayout.addBox(yBox);\n }\n\n /**\r\n * Build the yAxis datasets\r\n * @param {BoxInstance} area - The area of chart\r\n */\n\n }, {\n key: 'yScaleAxisDatas',\n value: function yScaleAxisDatas(area) {\n var me = this,\n stacked = me.chartConfig.stacked,\n ctx = me.ctx;\n var yScaleItemOptions = me.chartConfig.yScaleItemOptions;\n var tickLimits = me.yAxis.calculateTickLimit(area, ctx);\n\n if (stacked) {\n //let {max, min} = me.stackYScaleAxisLimit();\n var _me$stackYScaleAxisLi = me.stackYScaleAxisLimit(),\n max = _me$stackYScaleAxisLi.max,\n min = _me$stackYScaleAxisLi.min;\n\n return me.yAxis.buildDatasets(max, min, tickLimits, undefined, yScaleItemOptions);\n } else {\n // First, get all available values and calculate the max/min value\n var _visDatasets$reduce = this.visDatasets.reduce(function (pre, cur) {\n var max = pre.max,\n min = pre.min;\n\n if (cur.display) {\n var curValue = me.legends.map(function (legend) {\n if (legend.key) {\n return cur[legend.key] || 0;\n }\n }).concat(max, min);\n max = Math.max.apply(Math, curValue);\n min = Math.min.apply(Math, curValue);\n }\n return { max: max, min: min };\n }, {\n max: 0,\n min: 0\n }),\n _max = _visDatasets$reduce.max,\n _min = _visDatasets$reduce.min;\n\n return me.yAxis.buildDatasets(_max, _min, tickLimits, undefined, yScaleItemOptions);\n }\n }\n\n /**\r\n * Build the xAxis datasets\r\n */\n\n }, {\n key: 'xScaleAxisDatas',\n value: function xScaleAxisDatas() {\n var me = this;\n var xScaleItemOptions = me.chartConfig.xScaleItemOptions;\n var xScaleConfig = me.labels.map(function (label) {\n var item = {\n 'text': label\n };\n if (typeof xScaleItemOptions !== 'undefined') {\n item = (0, _helper.extend)(item, xScaleItemOptions);\n }\n return item;\n });\n\n return me.xAxis.buildDatasets(xScaleConfig);\n }\n }, {\n key: 'labels',\n get: function get() {\n var me = this,\n tmp = void 0;\n if (me._labels) {\n return me._labels;\n } else if (tmp = me.chartConfig.labels) {\n if (_helper.is.Array(tmp)) {\n return tmp;\n }\n }\n me._labels = me.visDatasets.map(function (dataset) {\n return dataset.label;\n });\n return me._labels;\n }\n }, {\n key: 'legends',\n get: function get() {\n var me = this;\n if (!me._legends) {\n me._legends = me._getLegendConfig();\n }\n return me._legends;\n },\n set: function set(value) {\n this._legends = value;\n }\n }]);\n\n return WxBar;\n }(_wxChart2.default);\n\n exports.default = WxBar;\n }, { \"../core/animation\": 15, \"../core/layout\": 17, \"../core/legend\": 18, \"../core/scale\": 19, \"../core/title\": 20, \"../scale/scale.category\": 21, \"../scale/scale.crosshelp\": 22, \"../scale/scale.liner\": 23, \"../scale/scale.stackhelp\": 24, \"../util/helper\": 25, \"../util/randomColor\": 27, \"../util/wxCanvas\": 29, \"./wxChart\": 14, \"es6-mixins\": 5, \"tinycolor2\": 10 }], 12: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _wxChart = require('./wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _title = require('../core/title');\n\n var _title2 = _interopRequireDefault(_title);\n\n var _layout = require('../core/layout');\n\n var _layout2 = _interopRequireDefault(_layout);\n\n var _legend = require('../core/legend');\n\n var _legend2 = _interopRequireDefault(_legend);\n\n var _randomColor = require('../util/randomColor');\n\n var _randomColor2 = _interopRequireDefault(_randomColor);\n\n var _helper = require('../util/helper');\n\n var _animation = require('../core/animation');\n\n var _animation2 = _interopRequireDefault(_animation);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Doughnut default config\n var WX_DOUGHNUT_DEFAULT_CONFIG = {\n legendOptions: {\n 'position': 'bottom'\n },\n // The percentage of the chart that we cut out of the middle.\n cutoutPercentage: 50,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: Math.PI * -0.5,\n\n // The randomColor scheme\n // See https://github.com/davidmerfield/randomColor\n color: {\n hue: 'red',\n luminosity: 'light'\n },\n\n point: {},\n\n // The title text or a title config object\n title: undefined,\n\n // The borderWidth\n borderWidth: 2,\n\n // Chart padding, default auto set\n padding: undefined,\n\n labelDistancePercentage: 0.15,\n // Animation\n animate: true,\n animateOptions: {\n start: 1,\n end: 501,\n duration: 1000\n }\n };\n\n /**\n * Doughnut item config\n *\n * value: The value of chart\n * label: The legend text\n * color: The color of item ,by default we use the randomColour scheme to create color\n * radius: The percentage of radius, default is '100'\n * legend: [Object] legend options\n */\n var WX_DOUGHNUT_ITEM_DEFAULT_CONFIG = {\n showItem: true,\n // format: // title format function\n display: true,\n fontSize: 11,\n percentage: 100\n };\n\n var WxDoughnut = function (_WxChart) {\n _inherits(WxDoughnut, _WxChart);\n\n /**\n * WxDoughnut chart\n * @constructor\n * @param {string} id - The canvas element's id\n * @param {Object} config\n * @param {number} [config.width=300] - The width of canvas.\n * @param {number} [config.height=200] - The height of canvas.\n * @param {number} [config.padding=] - The padding of canvas.\n * @param {string} [config.display=block] - The display style of chart.\n *\n * @param {number} [config.cutoutPercentage=50] - The percentage of the chart that we cut out of the middle.\n * @param {number} [config.rotation=Math.PI * -0.5] - The rotation of the chart, where the first data arc begins.\n * @param {Object} [config.color=red] - The randomColor options.\n * @param {(string|Object)} [config.title=] - The title text or title options of chart.\n * @param {Object} [config.legendOptions=] - The legend options of chart.\n */\n function WxDoughnut(id, config) {\n _classCallCheck(this, WxDoughnut);\n\n var _this = _possibleConstructorReturn(this, (WxDoughnut.__proto__ || Object.getPrototypeOf(WxDoughnut)).call(this, id, config));\n\n var me = _this;\n me.chartConfig = (0, _helper.extend)({}, WX_DOUGHNUT_DEFAULT_CONFIG, config);\n\n me.title = null;\n // Initialize title and legend\n if (me.chartConfig.title) {\n me.title = new _title2.default(me, _helper.is.PureObject(me.chartConfig.title) ? me.chartConfig.title : null);\n me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;\n }\n\n me.legend = new _legend2.default(me, me.chartConfig.legendOptions);\n me.wxLayout = new _layout2.default(me);\n\n // Initialize wxAnimation\n if (me.chartConfig.animate) me.wxAnimation = new _animation2.default(me.chartConfig.animateOptions);\n\n me.emit('init', {\n options: me.chartConfig\n });\n return _this;\n }\n\n /**\n * Update a datesets of chart and reDraw\n * @param {Object[]} datasets\n * @param {string} [datasets[].display=true] - Display or not.\n * @param {string} datasets[].label - The label text of an dataset.\n * @param {function} datasets[].format - The label text format function.\n * @param {number} datasets[].value - The value of an dataset.\n * @param {string} [datasets[].color] - The color of an dataset.\n * @param {string} [datasets[].borderColor]- The border color of an dataset.\n * @param {string} [datasets[].percentage=100] - The percentage of radius, default is '100'\n * @param {string} [datasets[].legend] - The legend option of an dataset. We will set legend text as same as label text.\n *\n */\n\n _createClass(WxDoughnut, [{\n key: 'update',\n value: function update(datasets) {\n var me = this;\n _get(WxDoughnut.prototype.__proto__ || Object.getPrototypeOf(WxDoughnut.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_DOUGHNUT_ITEM_DEFAULT_CONFIG, me.chartConfig.point));\n me.wxLayout.removeAllBox();\n if (me.wxAnimation) me.wxAnimation.reset();\n return me.draw();\n }\n\n /**\n * Draw chart\n */\n\n }, {\n key: 'draw',\n value: function draw() {\n var box = void 0,\n me = this,\n animate = me.chartConfig.animate,\n labelDistancePercentage = me.chartConfig.labelDistancePercentage,\n wxLayout = me.wxLayout;\n var _me$chartConfig = me.chartConfig,\n cutoutPercentage = _me$chartConfig.cutoutPercentage,\n rotation = _me$chartConfig.rotation,\n color = _me$chartConfig.color,\n title = _me$chartConfig.title,\n borderWidth = _me$chartConfig.borderWidth,\n padding = _me$chartConfig.padding;\n\n me.emit('beforeDraw', {\n options: me.chartConfig\n });\n\n box = wxLayout.adjustBox();\n // First, we draw title\n if (me.title) {\n me.title.update(me.titleText, box);\n wxLayout.addBox(me.title.box);\n }\n\n box = wxLayout.adjustBox();\n // Second, random color and get legend datasets\n var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.visDatasets.length }));\n var rBorderColor = (0, _randomColor2.default)({\n hue: color.hue || 'black',\n luminosity: 'dark',\n count: 1\n });\n var legendDatasets = [];\n me.visDatasets.forEach(function (dataset, index) {\n if (!dataset.color) {\n dataset.color = rColors[index];\n }\n if (!dataset.borderColor) {\n dataset.borderColor = me.config.backgroundColor || \"#ffffff\";\n }\n\n var legend = dataset.legend;\n if (!legend || _helper.is.String(legend)) {\n legendDatasets.push({\n display: dataset.display,\n text: _helper.is.String(legend) ? legend : dataset.label,\n fillStyle: dataset.color,\n strokeStyle: rBorderColor[0]\n });\n } else if (_helper.is.PureObject(legend)) {\n legendDatasets.push((0, _helper.extend)({\n display: dataset.display\n }, legend));\n }\n });\n me.legend.update(legendDatasets, box);\n wxLayout.addBox(me.legend.box);\n\n box = wxLayout.adjustBox();\n padding = padding || box.width * 0.1;\n box.width -= padding;\n box.height -= padding;\n me.box = box;\n\n var _box = box,\n x = _box.x,\n y = _box.y,\n width = _box.width,\n height = _box.height,\n outerWidth = _box.outerWidth,\n outerHeight = _box.outerHeight;\n\n var minSize = Math.min(width, height);\n var outerRadius = Math.max((minSize - borderWidth * 2) / 2, 0) - 10;\n var totalValue = me.calculateTotal(),\n longestLabelWidth = me._longestLabel(totalValue),\n maximalFontSize = me._maximalLabelFontSize(),\n shouldSpace = longestLabelWidth + maximalFontSize + outerRadius * labelDistancePercentage;\n\n // Calculate the space between pie's border and margin of chart\n var widthSpace = (width - (outerRadius + borderWidth) * 2) / 2;\n if (widthSpace < shouldSpace) {\n outerRadius -= shouldSpace - widthSpace;\n }\n\n var innerRadius = cutoutPercentage ? outerRadius / 100 * cutoutPercentage : 0,\n innerRadiusColor = me.config.backgroundColor || \"#ffffff\";\n var pointX = x + outerWidth / 2,\n pointY = y + outerHeight / 2;\n\n var opt = {\n box: box,\n pointX: pointX,\n pointY: pointY,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n totalValue: totalValue,\n borderWidth: borderWidth,\n rotation: rotation,\n totalAngle: Math.PI * 2.0\n };\n\n me.drawDoughnut(me.visDatasets, opt);\n if (animate) {\n me.emit('animate', { animation: me.wxAnimation });\n me.wxAnimation.run(true);\n me.wxAnimation.on('done', function () {\n me.emit('draw', {\n options: opt\n });\n });\n } else {\n me.emit('draw', {\n options: opt\n });\n }\n wxLayout.addBox(me.box);\n }\n }, {\n key: 'drawData',\n value: function drawData(dataset, options) {\n var me = this,\n ctx = me.ctx;\n var pointX = options.pointX,\n pointY = options.pointY,\n startAngle = options.startAngle,\n endAngle = options.endAngle,\n outerRadius = options.outerRadius,\n innerRadius = options.innerRadius,\n totalValue = options.totalValue,\n borderWidth = options.borderWidth;\n var label = dataset.label,\n value = dataset.value,\n color = dataset.color,\n borderColor = dataset.borderColor,\n percentage = dataset.percentage,\n display = dataset.display;\n\n if (!display) {\n return endAngle;\n }\n\n var centerAngle = startAngle + (endAngle - startAngle) / 2;\n var currentRadius = outerRadius / 100 * percentage;\n\n ctx.beginPath();\n\n ctx.arc(pointX, pointY, currentRadius, startAngle, endAngle);\n ctx.arc(pointX, pointY, innerRadius, endAngle, startAngle, true);\n\n ctx.closePath();\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth || 0;\n ctx.fillStyle = color;\n\n ctx.fill();\n ctx.lineJoin = 'bevel';\n\n if (borderWidth) {\n ctx.stroke();\n }\n ctx.draw();\n return endAngle;\n }\n }, {\n key: 'drawLabel',\n value: function drawLabel(dataset, options) {\n var me = this,\n ctx = me.ctx;\n var labelDistancePercentage = me.chartConfig.labelDistancePercentage || 0.2;\n var pointX = options.pointX,\n pointY = options.pointY,\n startAngle = options.startAngle,\n endAngle = options.endAngle,\n outerRadius = options.outerRadius,\n innerRadius = options.innerRadius,\n totalValue = options.totalValue,\n borderWidth = options.borderWidth;\n var label = dataset.label,\n value = dataset.value,\n color = dataset.color,\n borderColor = dataset.borderColor,\n fontSize = dataset.fontSize,\n percentage = dataset.percentage,\n format = dataset.format,\n showItem = dataset.showItem,\n display = dataset.display;\n\n if (!display || !showItem) {\n return;\n }\n\n var centerAngle = startAngle + (endAngle - startAngle) / 2;\n var currentRadius = outerRadius / 100 * percentage;\n label = _helper.is.Function(format) ? format.call(me, label, value, totalValue, currentRadius, dataset, options) : label;\n\n // Line start point\n var startX = Math.cos(centerAngle) * currentRadius + pointX;\n var startY = Math.sin(centerAngle) * currentRadius + pointY;\n\n // Line turn around point\n var offsetRadius = currentRadius * labelDistancePercentage,\n turnRadius = currentRadius + offsetRadius;\n var turnX = Math.cos(centerAngle) * turnRadius + pointX;\n var turnY = Math.sin(centerAngle) * turnRadius + pointY;\n\n // Avoid Collision\n var adjustPoint = me.avoidCollision({\n x: turnX,\n y: turnY\n }, {\n x: pointX,\n y: pointY\n });\n turnX = adjustPoint.x;\n turnY = adjustPoint.y;\n\n var textLen = ctx.measureText(label).width;\n var endX = turnX + (turnX - pointX > 0 ? offsetRadius : -offsetRadius),\n endY = turnY;\n var textX = turnX - pointX > 0 ? endX + 4 : endX - 4 - textLen,\n textY = endY + ctx.fontSize / 2;\n\n ctx.beginPath();\n ctx.lineWidth = 1;\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.fontSize = fontSize;\n ctx.moveTo(startX, startY);\n ctx.lineTo(turnX, turnY);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n ctx.fillText(label, textX, textY);\n ctx.draw();\n }\n }, {\n key: 'drawDoughnut',\n\n /**\n * Draw Doughnut\n * @param {Object} dateset - Doughnut data\n * @param {Object} opt - Draw options\n */\n value: function drawDoughnut(dataset, opt) {\n var me = this,\n animate = me.chartConfig.animate,\n animateOpt = me.chartConfig.animateOptions;\n\n if (animate) {\n var actionAnimation = me._getAnimationDrawDoughnut(dataset, opt);\n if (!actionAnimation) {\n return;\n }\n me.wxAnimation.pushActions(actionAnimation);\n } else {\n me._drawDoughnut(dataset, opt);\n }\n }\n }, {\n key: '_getAnimationDrawDoughnut',\n value: function _getAnimationDrawDoughnut(dataset, opt) {\n var me = this,\n ctx = me.ctx,\n animateOpt = me.chartConfig.animateOptions,\n backgroundColor = me.config.backgroundColor;\n var box = opt.box,\n pointX = opt.pointX,\n pointY = opt.pointY,\n totalValue = opt.totalValue,\n rotation = opt.rotation,\n outerRadius = opt.outerRadius,\n borderWidth = opt.borderWidth,\n totalAngle = opt.totalAngle;\n\n var aniTotal = animateOpt.end - animateOpt.start;\n\n return function (t, lastt, toNext) {\n var percent = t / aniTotal;\n var currTotalAngle = totalAngle * percent;\n\n // Clear\n ctx.save();\n ctx.beginPath();\n\n var bdWidth = borderWidth || 0;\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.strokeStyle = backgroundColor;\n ctx.fillRect(box.x, box.y, box.outerWidth, box.outerHeight);\n } else {\n ctx.clearRect(box.x, box.y, box.outerWidth, box.outerHeight);\n }\n\n // ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);\n // ctx.fill();\n // if (borderWidth) {\n // ctx.beginPath();\n // ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);\n // ctx.lineJoin = 'bevel';\n // ctx.lineWidth = borderWidth;\n // ctx.stroke();\n // }\n ctx.draw();\n\n if (animateOpt.end === t) {\n me._drawDoughnut(dataset, opt);\n } else {\n (function () {\n var drawAngle = rotation;\n dataset.forEach(function (data) {\n var startAngle = drawAngle,\n endAngle = startAngle + currTotalAngle * (data.value / totalValue);\n var o = (0, _helper.extend)({ startAngle: startAngle, endAngle: endAngle }, opt);\n me.drawData(data, o);\n drawAngle = endAngle;\n });\n })();\n }\n ctx.restore();\n return t;\n };\n }\n }, {\n key: '_drawDoughnut',\n value: function _drawDoughnut(dataset, opt) {\n var me = this;\n var totalValue = opt.totalValue,\n rotation = opt.rotation,\n totalAngle = opt.totalAngle;\n\n var drawAngle = rotation;\n me.initAvoidCollision();\n dataset.forEach(function (data) {\n var startAngle = drawAngle,\n endAngle = startAngle + totalAngle * (data.value / totalValue);\n var o = (0, _helper.extend)({ startAngle: startAngle, endAngle: endAngle }, opt);\n me.drawData(data, o);\n me.drawLabel(data, o);\n drawAngle = endAngle;\n });\n }\n\n // Get longest label\n\n }, {\n key: '_longestLabel',\n value: function _longestLabel(totalValue) {\n var me = this,\n visDatasets = me.visDatasets,\n ctx = me.ctx;\n var maxLabelWidth = 0;\n visDatasets.forEach(function (dataset) {\n var label = dataset.label,\n value = dataset.value,\n format = dataset.format;\n\n label = _helper.is.Function(format) ? format.call(me, label, value, totalValue, 0, dataset) : label;\n var textLen = ctx.measureText(label).width;\n\n maxLabelWidth = textLen > maxLabelWidth ? textLen : maxLabelWidth;\n });\n return maxLabelWidth;\n }\n // Get maximal font size of label\n\n }, {\n key: '_maximalLabelFontSize',\n value: function _maximalLabelFontSize() {\n var me = this,\n visDatasets = me.visDatasets;\n var max = 0;\n visDatasets.forEach(function (dataset) {\n var fontSize = dataset.fontSize;\n\n max = fontSize > max ? fontSize : max;\n });\n return max;\n }\n // Avoid Collision\n\n }, {\n key: 'initAvoidCollision',\n value: function initAvoidCollision() {\n this._lastPoint = null;\n }\n }, {\n key: 'avoidCollision',\n value: function avoidCollision(newPoint, centerPoint) {\n var avoidUnit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.ctx.fontSize + 4;\n\n var me = this,\n box = me.box;\n var cpx = centerPoint.x,\n cpy = centerPoint.y;\n if (me._lastPoint) {\n var lpx = me._lastPoint.x,\n lpy = me._lastPoint.y;\n var npx = newPoint.x,\n npy = newPoint.y;\n if ((npx - cpx) * (lpx - cpx) > 0 && Math.abs(lpy - npy) < avoidUnit) {\n var ny = npx - cpx > 0 ? lpy + avoidUnit : lpy - avoidUnit;\n newPoint.y = ny;\n }\n }\n this._lastPoint = newPoint;\n return newPoint;\n }\n }]);\n\n return WxDoughnut;\n }(_wxChart2.default);\n\n exports.default = WxDoughnut;\n }, { \"../core/animation\": 15, \"../core/layout\": 17, \"../core/legend\": 18, \"../core/title\": 20, \"../util/helper\": 25, \"../util/randomColor\": 27, \"../util/wxCanvas\": 29, \"./wxChart\": 14 }], 13: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _es6Mixins = require('es6-mixins');\n\n var _es6Mixins2 = _interopRequireDefault(_es6Mixins);\n\n var _helper = require('../util/helper');\n\n var _randomColor = require('../util/randomColor');\n\n var _randomColor2 = _interopRequireDefault(_randomColor);\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _wxChart = require('./wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _title = require('../core/title');\n\n var _title2 = _interopRequireDefault(_title);\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _scale3 = require('../scale/scale.liner');\n\n var _scale4 = _interopRequireDefault(_scale3);\n\n var _scale5 = require('../scale/scale.crosshelp');\n\n var _scale6 = _interopRequireDefault(_scale5);\n\n var _scale7 = require('../scale/scale.stackhelp');\n\n var _scale8 = _interopRequireDefault(_scale7);\n\n var _scale9 = require('../scale/scale.category');\n\n var _scale10 = _interopRequireDefault(_scale9);\n\n var _legend = require('../core/legend');\n\n var _legend2 = _interopRequireDefault(_legend);\n\n var _layout = require('../core/layout');\n\n var _layout2 = _interopRequireDefault(_layout);\n\n var _animation = require('../core/animation');\n\n var _animation2 = _interopRequireDefault(_animation);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n var Bezier = require('bezier-js');\n var tinycolor = require(\"tinycolor2\");\n\n // Line legend's default config\n var WX_LINE_LEGEND_DEFAULT_CONFIG = {\n lineWidth: 1,\n // 'capStyle': 'butt', //Default line cap is cap,\n lineJoin: 'miter',\n fillArea: false,\n fillAlpha: 0.5,\n display: true,\n spanGaps: false, // If set true, will draw line between the null point\n tension: 0.4 // Default bezier curve tension. Set to 0 for no bezier curves.\n };\n // Line default config\n var WX_LINER_DEFAULT_CONFIG = {\n // Scale options\n xScaleOptions: {\n position: 'bottom'\n },\n xScaleItemOptions: undefined,\n yScaleOptions: {\n position: 'left'\n },\n yScaleItemOptions: undefined,\n crossScaleOptions: {},\n // The title text or a title config object\n title: undefined,\n\n stacked: false, // If true, line are stacked on the x-axis\n discardNeg: false,\n\n // The legend of line chart\n legends: [], // lineWidth, lineJoin, fillStyle, strokeStyle, fillArea can be set in here\n legendOptions: {\n 'position': 'bottom'\n },\n\n // Point global options\n point: {},\n\n // The randomColor scheme\n // See https://github.com/davidmerfield/randomColor\n color: {\n hue: 'red',\n luminosity: 'light'\n },\n\n // The dataset's default key\n defaultKey: 'value',\n\n // Animation\n animate: true,\n animateOptions: {\n start: 1,\n end: 1001,\n duration: 1000\n }\n };\n\n var WX_LINER_ITEM_DEFAULT_CONFIG = {\n showItem: true,\n // format: // title format function\n pointRadius: 2,\n pointStyle: 'circle', // Support triangle, rect and Image object\n pointBorderWidth: 1,\n pointBorderColor: '#ffffff',\n display: true\n };\n\n var WxLiner = function (_WxChart) {\n _inherits(WxLiner, _WxChart);\n\n /**\r\n * WxLiner chart\r\n * @constructor\r\n * @param {string} id - The canvas element's id\r\n * @param {Object} config\r\n * @param {number} [config.width=300] - The width of canvas.\r\n * @param {number} [config.height=200] - The height of canvas.\r\n * @param {number} [config.padding=] - The padding of canvas.\r\n * @param {string} [config.display=block] - The display style of chart.\r\n *\r\n * @param {Object} config.legendOptions=[] - The legend & label options.You should set 'key' to bind the attribute in datasets which is the value of the point.\r\n * @param {(string|Object)} [config.title=] - The title text or title options of chart.\r\n * @example\r\n * datasets:[{\r\n * valueA: 30,\r\n * valueB: 40,\r\n * label: '一月'\r\n * }, {\r\n * valueA: 20,\r\n * valueB: 50,\r\n * pointRadius: 2,\r\n * label: '二月'\r\n * },...]\r\n *\r\n * legends: [{\r\n * 'text': 'valueA Text',\r\n * 'key': 'valueA',\r\n * 'strokeStyle': '#3385ff'\r\n * }, {\r\n * text: 'valueB Text',\r\n * key: 'valueB'\r\n * }]\r\n */\n function WxLiner(id, config) {\n _classCallCheck(this, WxLiner);\n\n var _this = _possibleConstructorReturn(this, (WxLiner.__proto__ || Object.getPrototypeOf(WxLiner)).call(this, id, config));\n\n _initialiseProps.call(_this);\n\n (0, _es6Mixins2.default)([_scale8.default], _this, {\n // Mixins will create a new method to nested call all duplicate method\n mergeDuplicates: false\n });\n\n var me = _this;\n me.chartConfig = (0, _helper.extend)({}, WX_LINER_DEFAULT_CONFIG, config);\n\n me.title = null;\n // Initialize title and legend\n if (me.chartConfig.title) {\n me.title = new _title2.default(me, _helper.is.PureObject(me.chartConfig.title) ? me.chartConfig.title : null);\n me.titleText = _helper.is.String(me.chartConfig.title) ? me.chartConfig.title : me.chartConfig.title.text;\n }\n\n // Initialize legend\n me.legend = new _legend2.default(me, me.chartConfig.legendOptions);\n\n // Initialize x,y Scale\n me.yAxis = new _scale4.default(me, me.chartConfig.yScaleOptions);\n me.xAxis = new _scale10.default(me, me.chartConfig.xScaleOptions);\n me.wxCrossScale = new _scale6.default(me.xAxis, me.yAxis, me.chartConfig.crossScaleOptions);\n me.wxLayout = new _layout2.default(me);\n\n // Initialize wxAnimation\n if (me.chartConfig.animate) me.wxAnimation = new _animation2.default(me.chartConfig.animateOptions);\n\n me.emit('init', {\n options: me.chartConfig\n });\n return _this;\n }\n\n // Get/Set labels\n\n\n _createClass(WxLiner, [{\n key: '_getLegendConfig',\n\n /**\r\n * Build legends config\r\n * @private\r\n */\n value: function _getLegendConfig() {\n var me = this,\n defaultKey = me.chartConfig.defaultKey || 'value',\n legendsConfig = me.chartConfig.legends;\n if (!legendsConfig) {\n if (me.labels && me.labels.length) {\n legendsConfig = me.labels.map(function (label) {\n return { 'text': label, 'key': defaultKey };\n });\n } else {\n throw new Error('Can not get legend config!');\n }\n } else {\n legendsConfig = legendsConfig.map(function (legend) {\n return (0, _helper.extend)(true, {\n 'key': defaultKey\n }, legend);\n });\n }\n return legendsConfig;\n }\n\n /**\r\n * Update a datesets of chart and reDraw\r\n * @param {Object} datasets - data sets\r\n * @param {string} [datasets[].display] - Disaply the bar or not\r\n * @param {number} [datasets[].fillStyle] - Point fill color. The default color will randomly assigned by 'color' option.\r\n * @param {string} [datasets[].strokeStyle='#ffffff'] - Point's border color\r\n * @param {string} [datasets[].pointStyle='circle'] - Point style, support triangle, rect and Image object\r\n * @param {number} [datasets[].pointRadius=3] - Point radius if style is circle\r\n * @param {number} [datasets[].pointBorderWidth=1.5] - Point border width\r\n * @param {string} [datasets[].pointBorderColor='auto'] - Point border color. If not set, will same as lineColor(luminosity+50%)\r\n * @param {number} [datasets[].display=true] - display the point or not\r\n * @returns {*}\r\n */\n\n }, {\n key: 'update',\n value: function update(datasets) {\n var me = this;\n me._labels = null;\n me._legends = null;\n _get(WxLiner.prototype.__proto__ || Object.getPrototypeOf(WxLiner.prototype), 'update', this).call(this, datasets, (0, _helper.extend)({}, WX_LINER_ITEM_DEFAULT_CONFIG, me.chartConfig.point));\n me.wxLayout.removeAllBox();\n if (me.wxAnimation) me.wxAnimation.reset();\n return me.draw();\n }\n\n /**\r\n * Draw chart\r\n */\n\n }, {\n key: 'draw',\n value: function draw() {\n var box = void 0,\n me = this,\n animate = me.chartConfig.animate,\n stacked = me.chartConfig.stacked,\n discardNeg = me.chartConfig.discardNeg,\n wxLayout = me.wxLayout;\n var _me$chartConfig = me.chartConfig,\n cutoutPercentage = _me$chartConfig.cutoutPercentage,\n rotation = _me$chartConfig.rotation,\n color = _me$chartConfig.color,\n borderWidth = _me$chartConfig.borderWidth,\n padding = _me$chartConfig.padding;\n\n me.emit('beforeDraw', {\n options: me.chartConfig\n });\n\n // First, we draw title\n box = wxLayout.adjustBox();\n if (me.title) {\n me.title.update(me.titleText, box);\n wxLayout.addBox(me.title.box);\n }\n\n // Second, random color and get legend datasets\n box = wxLayout.adjustBox();\n var rColors = (0, _randomColor2.default)((0, _helper.extend)(true, {}, color, { count: me.legends.length }));\n\n me.legends = me.legends.map(function (legend, index) {\n if (!legend.strokeStyle) {\n legend.strokeStyle = me.chartConfig.backgroundColor || legend.borderColor || rColors[index];\n }\n\n return (0, _helper.extend)(true, {\n fillStyle: rColors[index]\n }, WX_LINE_LEGEND_DEFAULT_CONFIG, legend);\n });\n me.legend.update(me.legends, box);\n wxLayout.addBox(me.legend.box);\n\n // Thirdly, draw scale\n me._drawScale(wxLayout);\n\n box = wxLayout.adjustBox();\n // Finally, draw line\n var lineConfigs = me.legends.map(function (legend, legendIndex) {\n var config = {\n box: box,\n legend: legend\n };\n var key = legend.key;\n // config.dataset = me.visDatasets.map(data => {return {value: data[key], data: data}});\n config.dataset = me.visDatasets.map(function (data, index) {\n var value = data[key],\n point = void 0;\n\n if (value) {\n var yAxisPoint = void 0,\n xAxisPoint = me.xAxis.getPoint(index);\n if (stacked) {\n if (discardNeg) {\n var _me$_getStackValue = me._getStackValue(index, legendIndex),\n sumPos = _me$_getStackValue.sumPos;\n\n yAxisPoint = value < 0 ? me.yAxis.getPoint(sumPos) : me.yAxis.getPoint(sumPos + value);\n } else {\n yAxisPoint = me._getStackPoint(index, legendIndex);\n }\n } else {\n yAxisPoint = me.yAxis.getPoint(value);\n }\n\n point = {\n x: xAxisPoint.x,\n y: yAxisPoint.y\n };\n }\n\n return { value: value, point: point, data: data, index: index };\n });\n return config;\n });\n\n lineConfigs.reduce(function (pre, curr) {\n me.drawLine(curr, pre);\n return curr;\n }, null);\n\n if (animate) {\n me.emit('animate', { animation: me.wxAnimation });\n me.wxAnimation.run(true);\n me.wxAnimation.on('done', function () {\n me.emit('draw', {\n options: lineConfigs\n });\n });\n } else {\n me.emit('draw', {\n options: lineConfigs\n });\n }\n // lineConfigs.forEach(line => me._drawLine(line));\n }\n\n /**\r\n * /**\r\n * Draw the scale of chart\r\n *\r\n * @param wxLayout\r\n * @private\r\n */\n\n }, {\n key: '_drawScale',\n value: function _drawScale(wxLayout) {\n var box = void 0,\n me = this;\n\n box = wxLayout.adjustBox();\n var xDatasets = me.xScaleAxisDatas(),\n yDatasets = me.yScaleAxisDatas(box);\n\n var _me$wxCrossScale$draw = me.wxCrossScale.draw(box, xDatasets, yDatasets),\n xBox = _me$wxCrossScale$draw.xBox,\n yBox = _me$wxCrossScale$draw.yBox;\n\n wxLayout.addBox(xBox);\n wxLayout.addBox(yBox);\n }\n\n /**\r\n *\r\n * @param {number} n - The total tick\r\n * @param {number} ln - The space between category x-axis\r\n * @param {number} sp - If has an gap, total gap space space\r\n * @param {number} bp - If has an gap, the gap space before the current point\r\n * @return {number}\r\n * @private\r\n */\n\n /**\r\n * Draw a line\r\n * @param pre\r\n * @param p\r\n * @param next\r\n * @param tension\r\n * @private\r\n */\n\n /**\r\n * Draw a animate line\r\n * @param pre\r\n * @param p\r\n * @param next\r\n * @param pert\r\n * @param curt\r\n * @param tension\r\n * @return {*}\r\n * @private\r\n */\n\n /**\r\n * Return a animate tick func\r\n * @param lineData\r\n * @param preData\r\n * @return {function(*, *, *)|null}\r\n * @private\r\n */\n\n }, {\n key: '_drawLine',\n\n /**\r\n * Draw one line\r\n * @param {Object} lineData - Line dataset\r\n * @param {Object} lineData.box - Draw box config\r\n * @param {Object} lineData.legend - Legend's config\r\n * @param {Object[]} lineData.dataset[].value - Data of each line point\r\n * @param {Object[]} lineData.dataset[].data - The data object\r\n * @param {Object[]} lineData.dataset[].point - The point for rending.\r\n * @private\r\n *\r\n */\n value: function _drawLine(lineData) {\n var _this2 = this;\n\n var me = this,\n ctx = me.ctx;\n var box = lineData.box,\n legend = lineData.legend,\n dataset = lineData.dataset;\n var display = legend.display,\n spanGaps = legend.spanGaps,\n tension = legend.tension,\n lineWidth = legend.lineWidth,\n lineJoin = legend.lineJoin,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n var xAxisY = me.xAxis.getPoint(0).y - me.xAxis.config.lineWidth / 2;\n if (!display) {\n return;\n }\n\n ctx.save();\n\n ctx.lineWidth = lineWidth;\n ctx.lineJoin = lineJoin;\n ctx.strokeStyle = strokeStyle;\n ctx.fillStyle = fillStyle;\n // Draw fill area\n if (fillArea) {\n (function () {\n ctx.beginPath();\n\n var firstPoint = void 0,\n currPoint = void 0;\n dataset.forEach(function (d, index) {\n var point = d.point;\n\n if (!!currPoint) {\n if (point) {\n _this2._lineToPoint(currPoint, point, me._getNextPoint(dataset, index, spanGaps), tension);\n } else if (!spanGaps) {\n // Not spanGap, close path and fill\n _this2.__fillInHere(firstPoint, currPoint, xAxisY, fillAlpha);\n // First point reset\n firstPoint = undefined;\n } else {\n // SpanGap, not record this point.\n return;\n }\n } else {\n if (point) {\n //ctx.moveTo(point.x, point.y);\n _this2._lineToPoint(currPoint, point, me._getNextPoint(dataset, index, spanGaps), tension);\n firstPoint = point;\n }\n }\n currPoint = point;\n });\n if (currPoint && firstPoint) {\n _this2.__fillInHere(firstPoint, currPoint, xAxisY, tension, fillAlpha);\n }\n })();\n }\n\n ctx.beginPath();\n\n // Draw line\n var prePoint = void 0;\n dataset.forEach(function (d, index) {\n var point = d.point;\n\n if (point) {\n _this2._lineToPoint(prePoint, point, me._getNextPoint(dataset, index, spanGaps), tension);\n //!!currPoint ? ctx.lineTo(point.x, point.y): ctx.moveTo(point.x, point.y);\n // !!currPoint ?\n // lineToPoint(currPoint, point, getNextPoint(dataset, index, spanGaps)):\n // ctx.moveTo(point.x, point.y);\n } else if (spanGaps) {\n // SpanGap, not record this point.\n return;\n }\n prePoint = point;\n });\n ctx.stroke();\n\n // Draw Point\n dataset.forEach(function (d, index) {\n me._drawPoint(ctx, box, d);\n });\n\n ctx.draw();\n ctx.restore();\n\n return;\n }\n\n /**\r\n * Draw one line\r\n * @param {Object} lineData - Line dataset\r\n * @param {Object} lineData.box - Draw box config\r\n * @param {Object} lineData.legend - Legend's config\r\n * @param {Object[]} lineData.dataset[].value - Data of each line point\r\n * @param {Object[]} lineData.dataset[].data - The data object\r\n * @param {Object[]} lineData.dataset[].point - The point for rending.\r\n * @param {Object} preData - Previous line dataset\r\n * @private\r\n *\r\n */\n\n }, {\n key: 'drawLine',\n value: function drawLine(lineData, preData) {\n var me = this,\n animate = me.chartConfig.animate,\n animateOpt = me.chartConfig.animateOptions;\n\n if (animate) {\n var actionAnimation = me._getAnimationDrawLine(lineData, preData);\n if (!actionAnimation) {\n return;\n }\n me.wxAnimation.pushActions(actionAnimation);\n me.wxAnimation.pushActions(function (t) {\n if (animateOpt.end === t) {\n me._drawLine(lineData);\n }\n });\n } else {\n me._drawLine(lineData);\n }\n }\n /**\r\n * Build the yAxis datasets\r\n * @param {BoxInstance} area - The area of chart\r\n */\n\n }, {\n key: 'yScaleAxisDatas',\n value: function yScaleAxisDatas(area) {\n var me = this,\n stacked = me.chartConfig.stacked,\n discardNeg = me.chartConfig.discardNeg,\n ctx = me.ctx;\n var yScaleItemOptions = me.chartConfig.yScaleItemOptions;\n var tickLimits = me.yAxis.calculateTickLimit(area, ctx);\n\n if (stacked) {\n var _me$stackYScaleAxisLi = me.stackYScaleAxisLimit(),\n max = _me$stackYScaleAxisLi.max,\n min = _me$stackYScaleAxisLi.min;\n\n return me.yAxis.buildDatasets(max, min < 0 && discardNeg ? 0 : min, tickLimits, undefined, yScaleItemOptions);\n } else {\n // First, get all available values and calculate the max/min value\n var _visDatasets$reduce = this.visDatasets.reduce(function (pre, cur) {\n var max = pre.max,\n min = pre.min;\n\n if (cur.display) {\n var curValue = me.legends.map(function (legend) {\n if (legend.key) {\n return cur[legend.key] || 0;\n }\n }).concat(max, min);\n max = Math.max.apply(Math, curValue);\n min = Math.min.apply(Math, curValue);\n }\n return { max: max, min: min };\n }, {\n max: 0,\n min: 0\n }),\n _max = _visDatasets$reduce.max,\n _min = _visDatasets$reduce.min;\n\n return me.yAxis.buildDatasets(_max, _min, tickLimits, undefined, yScaleItemOptions);\n }\n }\n\n /**\r\n * Build the xAxis datasets\r\n */\n\n }, {\n key: 'xScaleAxisDatas',\n value: function xScaleAxisDatas() {\n var me = this;\n var xScaleItemOptions = me.chartConfig.xScaleItemOptions;\n var xScaleConfig = me.labels.map(function (label) {\n var item = {\n 'text': label\n };\n if (typeof xScaleItemOptions !== 'undefined') {\n item = (0, _helper.extend)(item, xScaleItemOptions);\n }\n return item;\n });\n\n return me.xAxis.buildDatasets(xScaleConfig);\n }\n }, {\n key: 'labels',\n get: function get() {\n var me = this,\n tmp = void 0;\n if (me._labels) {\n return me._labels;\n } else if (tmp = me.chartConfig.labels) {\n if (_helper.is.Array(tmp)) {\n return tmp;\n }\n }\n me._labels = me.visDatasets.map(function (dataset) {\n return dataset.label;\n });\n return me._labels;\n }\n }, {\n key: 'legends',\n get: function get() {\n var me = this;\n if (!me._legends) {\n me._legends = me._getLegendConfig();\n }\n return me._legends;\n },\n set: function set(value) {\n this._legends = value;\n }\n }]);\n\n return WxLiner;\n }(_wxChart2.default);\n\n var _initialiseProps = function _initialiseProps() {\n var _this3 = this;\n\n this._animateLineTick = function (n, ln) {\n var sp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var bp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n\n return sp ? (n % ln + bp * ln) / (ln * sp) : 0;\n };\n\n this._getCurr = function (dataset, index) {\n if (index > dataset.length - 1) {\n return;\n }\n return dataset[index];\n };\n\n this._getNext = function (dataset, index, spanGaps) {\n // The end\n if (index >= dataset.length - 1) {\n return;\n }\n var nextDate = dataset[index + 1];\n if (!nextDate.point) {\n if (!!spanGaps) return _this3._getNext(dataset, index + 1, spanGaps);else return;\n }\n return nextDate;\n };\n\n this._getNextPoint = function (dataset, index, spanGaps) {\n var next = _this3._getNext(dataset, index, spanGaps);\n return next ? next.point : null;\n };\n\n this._getPre = function (dataset, index, spanGaps) {\n if (index <= 0) {\n return;\n }\n var preDate = dataset[index - 1];\n if (!preDate.point) {\n if (!!spanGaps) return _this3._getPre(dataset, index - 1, spanGaps);else return;\n }\n return preDate;\n };\n\n this._getPrePoint = function (dataset, index, spanGaps) {\n var pre = _this3._getPre(dataset, index, spanGaps);\n return pre ? pre.point : null;\n };\n\n this._lineToPoint = function (pre, p, next, tension) {\n var ctx = _this3.ctx;\n if (!tension || tension === 0) {\n ctx.lineTo(p.x, p.y);\n } else {\n var controlPoints = (0, _helper.splineCurve)(pre, p, next, tension);\n if (!pre) {\n ctx.moveTo(p.x, p.y);\n } else {\n ctx.bezierCurveTo(pre.controlPoints.next.x, pre.controlPoints.next.y, controlPoints.previous.x, controlPoints.previous.y, p.x, p.y);\n }\n p.controlPoints = controlPoints;\n }\n };\n\n this._animateLineToPoint = function (pre, p, next, pert, curt, tension) {\n var ctx = _this3.ctx;\n if (!tension || tension === 0) {\n var x1 = pre.x,\n x2 = p.x,\n y1 = pre.y,\n y2 = p.y;\n var totalPath = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)),\n cosAngle = (x2 - x1) / totalPath,\n sinAngle = (y2 - y1) / totalPath;\n var pointX = x1 + cosAngle * curt,\n pointY = y1 + sinAngle * curt;\n ctx.moveTo(x1, y1);\n ctx.lineTo(pointX, pointY);\n return {\n startPoint: pre,\n endPoint: { x: pointX, y: pointY }\n };\n } else {\n var p0 = void 0,\n p1 = void 0,\n p2 = void 0,\n p3 = void 0,\n controlPoints = (0, _helper.splineCurve)(pre, p, next, tension);\n\n if (pre && p) {\n var bz = new Bezier({ x: pre.x, y: pre.y }, { x: pre.controlPoints.next.x, y: pre.controlPoints.next.y }, { x: controlPoints.previous.x, y: controlPoints.previous.y }, { x: p.x, y: p.y });\n var sbz = bz.split(pert || 0, curt);\n\n p0 = sbz.point(0);p1 = sbz.point(1);p2 = sbz.point(2);p3 = sbz.point(3);\n\n ctx.moveTo(Math.round(p0.x), p0.y);\n ctx.bezierCurveTo(p1.x, p1.y, p2.x, p2.y, Math.round(p3.x), p3.y);\n }\n p.controlPoints = controlPoints;\n return {\n startPoint: p0 ? {\n x: Math.round(p0.x),\n y: p0.y\n } : null,\n endPoint: p3 ? {\n x: Math.round(p3.x),\n y: p3.y\n } : null\n };\n }\n };\n\n this.__fillInHere = function (firstPoint, currPoint, xAxisY, fillAlpha) {\n var ctx = _this3.ctx;\n ctx.lineTo(currPoint.x, xAxisY);\n ctx.lineTo(firstPoint.x, xAxisY);\n\n ctx.globalAlpha = fillAlpha;\n ctx.fill();\n ctx.globalAlpha = 1;\n };\n\n this._drawPoint = function (ctx, box, p) {\n if (!p || !p.point) {\n return;\n }\n\n var _p$data = p.data,\n pointBorderColor = _p$data.pointBorderColor,\n pointBorderWidth = _p$data.pointBorderWidth,\n pointRadius = _p$data.pointRadius,\n pointStyle = _p$data.pointStyle,\n label = _p$data.label,\n showItem = _p$data.showItem,\n format = _p$data.format;\n var _p$point = p.point,\n pointX = _p$point.x,\n pointY = _p$point.y;\n\n // TODO: pointStyle NOT IMPLEMENT, Only can render line\n\n if (pointRadius) {\n ctx.beginPath();\n ctx.arc(pointX, pointY, pointRadius, 0, 2 * Math.PI);\n ctx.fill();\n }\n\n if (!!showItem) {\n var curFillStyle = ctx.fillStyle;\n ctx.textBaseline = \"bottom\";\n ctx.fillStyle = tinycolor(curFillStyle).darken(15).toString();\n ctx.fillStyle = curFillStyle;\n\n var barItem = _helper.is.Function(format) ? format.call(_this3, label, p.value, p.index) : p.value + '';\n var boxX = box.x,\n boxY = box.y;\n\n var itemX = pointX - ctx.measureText(barItem).width / 2,\n itemY = pointY - ctx.fontSize / 6 - (pointRadius || 0) - (pointBorderWidth || 0);\n\n // Check box's X,Y\n if (itemX < box.x) {\n itemX = box.x;\n }\n if (itemY < box.y) {\n itemY = pointX + ctx.fontSize / 6 + (pointRadius || 0) + (pointBorderWidth || 0);\n ctx.textBaseline = \"top\";\n }\n\n ctx.fillText(barItem, itemX, itemY);\n }\n\n if (pointBorderWidth) {\n ctx.beginPath();\n ctx.arc(pointX, pointY, pointRadius, 0, 2 * Math.PI);\n ctx.lineWidth = pointBorderWidth;\n ctx.strokeStyle = pointBorderColor || legend.strokeStyle;\n ctx.stroke();\n }\n };\n\n this._getAnimationDrawLine = function (lineData, preData) {\n var me = _this3,\n animate = me.chartConfig.animate,\n animateOpt = me.chartConfig.animateOptions,\n ctx = me.ctx;\n\n var box = lineData.box,\n legend = lineData.legend,\n dataset = lineData.dataset;\n var display = legend.display,\n spanGaps = legend.spanGaps,\n tension = legend.tension,\n lineWidth = legend.lineWidth,\n lineJoin = legend.lineJoin,\n fillStyle = legend.fillStyle,\n strokeStyle = legend.strokeStyle,\n fillArea = legend.fillArea,\n fillAlpha = legend.fillAlpha;\n\n // Animation dynamic options\n\n var dataLen = dataset.length,\n categoryTicks = (animateOpt.end - animateOpt.start) / (dataLen - 1);\n\n if (!display) {\n return;\n }\n\n return function (t, lastt, toNext) {\n ctx.save();\n ctx.lineWidth = lineWidth;\n ctx.lineJoin = lineJoin;\n ctx.strokeStyle = strokeStyle;\n ctx.fillStyle = fillStyle;\n\n var dataIndex = !lastt ? 0 // first point\n : Math.floor(t / categoryTicks) + 1;\n var point = void 0,\n drawCurrPoint = void 0,\n index = void 0,\n data = void 0,\n pret = lastt ? lastt.t : 0,\n curt = 0,\n curr = me._getCurr(dataset, dataIndex),\n next = me._getNext(dataset, dataIndex, spanGaps),\n pre = me._getPre(dataset, dataIndex, spanGaps),\n ppPoint = void 0,\n diffIndex = lastt ? dataIndex - lastt.index : 0;\n\n if (curr) {\n drawCurrPoint = curr.point;\n point = curr.point;\n index = curr.index;\n data = curr.data;\n curt = me._animateLineTick(t, categoryTicks, index - (pre ? pre.index : 0), dataIndex - (pre ? pre.index : 0) - 1);\n }\n\n if (pre) {\n ppPoint = me._getPrePoint(dataset, pre.index, spanGaps);\n }\n\n if (!drawCurrPoint && next) {\n drawCurrPoint = next.point;\n index = next.index;\n next = me._getNext(dataset, next.index, spanGaps);\n }\n\n if (diffIndex == 1) {\n // Draw line\n if (pre && pre.point) {\n ctx.beginPath();\n me._animateLineToPoint(ppPoint, pre.point, drawCurrPoint, pret, 1, tension);\n ctx.stroke();\n }\n\n pret = 0;\n }\n\n if (!point && spanGaps || point) {\n // this tick path close\n // Draw line\n\n if (drawCurrPoint) {\n ctx.beginPath();\n me._animateLineToPoint(pre ? pre.point : null, drawCurrPoint, next ? next.point : null, pret, curt, tension);\n ctx.stroke();\n }\n }\n\n if (pret == 0 && pre && pre.point) {\n me._drawPoint(ctx, box, (0, _helper.extend)({}, pre, { showItem: false }));\n }\n\n ctx.draw();\n ctx.restore();\n\n return {\n point: point,\n t: curt,\n index: dataIndex,\n diffIndex: diffIndex\n };\n };\n };\n };\n\n exports.default = WxLiner;\n }, { \"../core/animation\": 15, \"../core/layout\": 17, \"../core/legend\": 18, \"../core/scale\": 19, \"../core/title\": 20, \"../scale/scale.category\": 21, \"../scale/scale.crosshelp\": 22, \"../scale/scale.liner\": 23, \"../scale/scale.stackhelp\": 24, \"../util/helper\": 25, \"../util/randomColor\": 27, \"../util/wxCanvas\": 29, \"./wxChart\": 14, \"bezier-js\": 1, \"es6-mixins\": 5, \"tinycolor2\": 10 }], 14: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n exports.getChartInstances = getChartInstances;\n\n var _helper = require('../util/helper');\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _layout = require('../core/layout');\n\n var _mitt = require('mitt');\n\n var _mitt2 = _interopRequireDefault(_mitt);\n\n var _es6Mixins = require('es6-mixins');\n\n var _es6Mixins2 = _interopRequireDefault(_es6Mixins);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n // Chart default config\n var wxChartDefaultConfig = {\n fontSize: 10,\n width: 300,\n height: 200,\n display: 'block',\n padding: 0,\n backgroundColor: null\n };\n\n // Store all references of 'WxChart' instances - allowing us to globally resize chart instances on window resize.\n var wxChartInstances = {};\n\n function getChartInstances(id) {\n if (id && id in wxChartInstances) {\n return wxChartInstances[id];\n }\n return null;\n };\n\n // The basic class of WeiXin chart\n\n var WxChart = function () {\n /**\n * @constructor\n * @param {string} id - Canvas id ,DOM ID or HTMLElement\n * @param {Object|number} [config] - The config of Canvas or the width of chart.\n * @param {number} [config.width] - The width of canvas.\n * @param {number} [config.height] - The height of canvas.\n * @param {number} [config.padding] - The padding of canvas.\n * @param {string} [config.display] - The display style of chart.\n */\n function WxChart(id, config) {\n _classCallCheck(this, WxChart);\n\n var me = this;\n\n // Event emitter\n (0, _es6Mixins2.default)([(0, _mitt2.default)()], this, {\n // Mixins will create a new method to nested call all duplicate method\n mergeDuplicates: false\n });\n\n // Arguments parse...\n var chartConf = void 0;\n if (_helper.is.PureObject(config)) {\n chartConf = (0, _helper.extend)({}, wxChartDefaultConfig, config);\n } else if (_helper.is.Number(config) || _helper.is.String(config)) {\n // WxChart(id, width, height, display, ...options)\n chartConf = {\n 'width': arguments[1],\n 'height': 2 in arguments ? arguments[2] : wxChartDefaultConfig.height,\n 'display': 3 in arguments ? arguments[3] : wxChartDefaultConfig.display\n };\n if (4 in arguments && _helper.is.PureObject(arguments[4])) {\n (0, _helper.extend)({}, wxChartDefaultConfig, chartConf, arguments[4]);\n } else {\n (0, _helper.extend)({}, wxChartDefaultConfig, chartConf);\n }\n }\n\n me.canvas = new _wxCanvas2.default(id, chartConf);\n me.ctx = me.canvas.getContext('2d');\n me.isWeiXinAPP = (0, _helper.checkWX)();\n me._id = (0, _helper.uid)();\n\n me.emit('initCanvas', {\n canvas: me.canvas,\n ctx: me.ctx,\n id: me.id + ''\n });\n\n me._config = me.initConfig(chartConf);\n me.initContext();\n\n // Append to wxChartInstances\n wxChartInstances[me.id + ''] = me;\n\n return me;\n }\n\n _createClass(WxChart, [{\n key: 'initConfig',\n value: function initConfig(config) {\n var me = this;\n if (!me.canvas) {\n console.error(\"Failed to create WxChart: can't acquire context!\");\n }\n\n var canvas = me.canvas,\n cvWidth = canvas.width,\n cvHeight = canvas.height;\n config.width = cvWidth;\n config.height = cvHeight;\n config.aspectRatio = config.aspectRatio ? config.aspectRatio : !_helper.is.Undefined(cvHeight) && !_helper.is.Undefined(cvWidth) ? (cvWidth / cvWidth).toFixed(2) : null;\n config.display = config.display || 'block';\n return config;\n }\n }, {\n key: 'initContext',\n value: function initContext() {\n var me = this;\n if (!me.canvas) {\n console.error(\"Failed to create WxChart: can't acquire context!\");\n return me;\n }\n // Set scale of canvas\n (0, _helper.retinaScale)(me.ctx, me.canvas.width, me.canvas.height);\n\n // Set font size\n if (me.config.fontSize) {\n me.ctx.fontSize = me.config.fontSize;\n }\n\n // calculate box\n var padding = me.config.padding || 0;\n me.innerBox = new _layout.BoxInstance('top', 0, 0, me.config.width - padding * 2, me.config.height - padding * 2, me.config.width, me.config.height);\n }\n }, {\n key: 'clear',\n value: function clear() {\n var me = this;\n me.ctx.clearRect(0, 0, me.canvas.width, me.canvas.height);\n if (me.config.backgroundColor) {\n me.ctx.save();\n me.ctx.fillStyle = me.config.backgroundColor;\n me.ctx.fillRect(0, 0, me.canvas.width, me.canvas.height);\n me.ctx.restore();\n me.ctx.draw();\n }\n\n me.emit('clear', {\n canvas: me.canvas\n });\n }\n }, {\n key: 'destroy',\n value: function destroy() {\n var me = this;\n\n me.clear();\n me.canvas.releaseContext();\n\n if (me.id && me.id in wxChartInstances) {\n delete wxChartInstances[me.id];\n }\n\n //me.id = null;\n me.canvas = null;\n me.ctx = null;\n me._config = null;\n me.innerBox = null;\n\n me.emit('destroy');\n }\n }, {\n key: 'draw',\n value: function draw() {\n // Do nothing...\n }\n }, {\n key: 'update',\n value: function update(datasets, defaultItemOpt) {\n var me = this;\n if (_helper.is.Undefined(datasets)) {\n return;\n }\n if (!_helper.is.Array(datasets)) {\n datasets = [datasets];\n }\n\n datasets = datasets.map(function (dataset) {\n return (0, _helper.extend)({}, defaultItemOpt, dataset);\n });\n\n me.emit('update', { datasets: datasets });\n // Fill default Options\n me.clear();\n me._datasets = datasets;\n me._visDatasets = null;\n return me._datasets;\n }\n }, {\n key: 'calculateTotal',\n value: function calculateTotal() {\n var datasets = this.datasets;\n var total = 0;\n var value = void 0;\n\n datasets.forEach(function (dataset, index) {\n value = parseFloat(dataset.value);\n if (!_helper.is.NaN(value) && !dataset.hidden) {\n total += Math.abs(value);\n }\n });\n\n return total;\n }\n }, {\n key: 'id',\n get: function get() {\n return this._id;\n }\n\n // The 'config' property\n\n }, {\n key: 'config',\n get: function get() {\n if (!this._config) {\n this._config = (0, _helper.extend)({}, wxChartDefaultConfig);\n }\n return this._config;\n },\n set: function set(chartConf) {\n var me = this;\n // Update chart config\n me.initConfig(chartConf);\n me.initContext();\n // Clear canvas\n me.clear();\n // Call redraw\n me.draw();\n }\n }, {\n key: 'datasets',\n get: function get() {\n return this._datasets;\n },\n set: function set(datasets) {\n return this.update(datasets);\n }\n\n /**\n * Get visible ticks\n */\n\n }, {\n key: 'visDatasets',\n get: function get() {\n return this._visDatasets ? this._visDatasets : this._visDatasets = this.datasets.filter(function (v) {\n return !!v.display;\n });\n }\n // Can not reset\n\n , set: function set(val) {}\n }]);\n\n return WxChart;\n }();\n\n exports.default = WxChart;\n }, { \"../core/layout\": 17, \"../util/helper\": 25, \"../util/wxCanvas\": 29, \"es6-mixins\": 5, \"mitt\": 7 }], 15: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n exports.wxAnimationActLinker = wxAnimationActLinker;\n\n var _tweezer = require('../util/tweezer');\n\n var _tweezer2 = _interopRequireDefault(_tweezer);\n\n var _ez = require('ez.js');\n\n var ez = _interopRequireWildcard(_ez);\n\n var _helper = require('../util/helper');\n\n var _mitt = require('mitt');\n\n var _mitt2 = _interopRequireDefault(_mitt);\n\n var _es6Mixins = require('es6-mixins');\n\n var _es6Mixins2 = _interopRequireDefault(_es6Mixins);\n\n function _interopRequireWildcard(obj) {\n if (obj && obj.__esModule) {\n return obj;\n } else {\n var newObj = {};if (obj != null) {\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n }\n }newObj.default = obj;return newObj;\n }\n }\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function wxAnimationActLinker() {\n var actions = [],\n globals = {};\n return function (action) {\n var _arguments = arguments;\n\n for (var _len = arguments.length, options = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n options[_key - 1] = arguments[_key];\n }\n\n var me = this;\n if (me instanceof WxAnimation) {\n // Run all actions in WxAnimation call\n var ret = void 0;\n actions.forEach(function (action) {\n ret = action.apply(me, _arguments);\n });\n return ret;\n } else {\n // Just push action\n actions.push(action);\n return actions;\n }\n };\n }\n\n var WxAnimation = function () {\n\n /**\r\n * WxAnimation initial\r\n *\r\n * @param {Object} options - Animation options\r\n * @param {number} options.start - The start value\r\n * @param {number} options.end - The end value\r\n * @param {Object} [options.duration=1000] - The total seconds of animation\r\n * @param {Object} [options.easeType=easeInOut] - Easing type, please see [ez.js](https://github.com/jaxgeller/ez.js/blob/master/ez.js) for more information\r\n * @constructor\r\n */\n\n // The error in actions\n\n\n // The animate has started or not\n\n // Tweenzer instance\n function WxAnimation(options) {\n var _this = this;\n\n _classCallCheck(this, WxAnimation);\n\n this.currentActionIndex = 0;\n\n this.handOverAction = function () {\n _this.currentActionIndex++;\n };\n\n this.stop = function () {\n _this.currentActionIndex = 0;\n _this.tweenzerHandler.stop();\n _this.started = false;\n _this.emit('stop');\n };\n\n this.reset = function () {\n _this.currentActionIndex = 0;\n _this.tweenzerHandler.stop().off('tick').off('done');\n _this.started = false;\n _this.resetActions();\n _this.emit('reset');\n };\n\n var easeFun = ez.easeInOutQuad;\n if (options.easeType) {\n if (typeof ez[options.easeType] != 'undefined') {\n easeFun = ez[options.easeType];\n }\n }\n\n this.tweenzerHandler = new _tweezer2.default((0, _helper.extend)({ easing: easeFun }, options));\n\n this.actions = [];\n\n var mit = (0, _mitt2.default)();\n (0, _es6Mixins2.default)([mit], this, {\n // Mixins will create a new method to nested call all duplicate method\n mergeDuplicates: false\n });\n }\n\n /**\r\n * Push an action to\r\n * @param {WxAnimation~action|wxAnimationActLinker} action\r\n * @return {number} - The index of action\r\n */\n\n // The current handler action\n\n\n /**\r\n * A action callback\r\n * @callback WxAnimation~action\r\n * @param {number} value - The value of this tick\r\n * @param {Object} preRet - The last tick's return value\r\n * @param {Promise} toNext - Hand over next action\r\n * @param {function} nextAction - Next action or Null\r\n *\r\n * @description\r\n * Every action is a callback to deal one or more ticks\r\n * Several parameters will pass to. The first is value of this tick; Another is an function can hand over the executive authority to next action.\r\n */\n\n _createClass(WxAnimation, [{\n key: 'pushActions',\n value: function pushActions(action) {\n if (!_helper.is.Function(action)) {\n throw new Error(\"Should pass to an `action` callback function\");\n }\n return this.actions.push(action);\n }\n\n /**\r\n * Reset actions\r\n */\n\n }, {\n key: 'resetActions',\n value: function resetActions() {\n this.actions = [];\n }\n }, {\n key: 'runTick',\n value: function runTick(value, preRet) {\n var me = this,\n caindex = me.currentActionIndex || 0;\n if (caindex >= me.actions.length) {\n return;\n }\n\n var ret = void 0,\n action = me.actions[caindex],\n nextAction = caindex + 1 <= me.actions.length ? me.actions[caindex + 1] : null;\n // try {\n me.emit('tick', { value: value, preRet: preRet, toNext: me.handOverAction, nextAction: nextAction, parallel: false });\n ret = action.apply(me, [value, preRet, me.handOverAction, nextAction]);\n // } catch (e) {\n // me.error = `${e.name} : ${e.message}`;\n // // Catch an error.\n // // Stop all actions\n // me.started = false;\n // me.currentActionIndex = 0;\n // me.tweenzerHandler.stop();\n // me.emit('error', {error: me.error});\n // }\n return ret;\n }\n }, {\n key: 'runTickParallel',\n value: function runTickParallel(value) {\n var tickRet = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n var me = this,\n actions = me.actions,\n actionsLen = me.actions.length;\n\n // try {\n actions.forEach(function (action, index) {\n var preRet = tickRet ? tickRet[index] : null,\n toNext = function toNext() {},\n nextAction = index + 1 < actionsLen ? actions[index + 1] : null;\n me.emit('tick', { value: value, preRet: preRet, toNext: toNext, nextAction: nextAction, parallel: true });\n var ret = action.apply(me, [value, preRet, toNext, nextAction]);\n tickRet[index] = ret;\n });\n // } catch (e) {\n // me.error = `${e.name} : ${e.message}`;\n // // Catch an error.\n // // Stop all actions\n // me.started = false;\n // me.tweenzerHandler.stop();\n // me.emit('error', {error: me.error});\n // }\n return tickRet;\n }\n }, {\n key: 'tick',\n value: function tick(parallel) {\n var me = this,\n rets = undefined;\n return function (v) {\n if (parallel) rets = me.runTickParallel(v, rets);else rets = me.runTick(v, rets);\n };\n }\n /**\r\n * Run actions\r\n *\r\n * @param {Boolean} parallel - parallel to exec all actions\r\n */\n\n }, {\n key: 'run',\n value: function run() {\n var parallel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var me = this;\n me.emit('start', { parallel: parallel });\n me.started = true;\n\n me.tweenzerHandler.on('tick', me.tick(parallel)).on('done', function () {\n me.currentActionIndex = 0;\n me.started = false;\n me.emit('done', { parallel: parallel });\n }).begin();\n }\n }]);\n\n return WxAnimation;\n }();\n\n exports.default = WxAnimation;\n }, { \"../util/helper\": 25, \"../util/tweezer\": 28, \"es6-mixins\": 5, \"ez.js\": 6, \"mitt\": 7 }], 16: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _helper = require('../util/helper');\n\n var _layout = require('./layout');\n\n var _wxChart = require('../charts/wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n // The basic component\n var WxBaseComponent = function () {\n function WxBaseComponent(wxChart, config) {\n _classCallCheck(this, WxBaseComponent);\n\n var me = this;\n\n if (!wxChart || !wxChart instanceof _wxChart2.default) {\n throw new Error('Should be an WxChart instance');\n }\n me.wxChart = wxChart;\n\n // scale set options\n this._datasets = [];\n\n return me;\n }\n\n /**\n * Initialize datasets and options\n * @param {Object[]} datasets\n * @param {Object} [defaultOptions]\n * @returns {Array|*}\n */\n\n _createClass(WxBaseComponent, [{\n key: 'init',\n value: function init(datasets) {\n var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var me = this;\n\n if (_helper.is.Undefined(datasets) || _helper.is.Null(datasets)) {\n datasets = me.datasets;\n if (!datasets) {\n throw new Error('Datasets is null');\n }\n }\n\n if (!_helper.is.Array(datasets)) {\n datasets = [datasets];\n }\n\n datasets = datasets.map(function (dataset) {\n return (0, _helper.extend)({}, defaultOptions, dataset);\n });\n\n me._datasets = datasets;\n me._visDatasets = null;\n return me._datasets;\n }\n\n /**\n * Update data and re-draw\n * @param {Object[]} datasets\n * @param {BoxInstance} [area]\n * @param {Object} [config]\n */\n\n }, {\n key: 'update',\n value: function update(datasets, area) {\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this;\n\n me.clear();\n if (!datasets) {\n return;\n }\n datasets = me.init(datasets);\n\n if (area && area instanceof _layout.BoxInstance) {\n area = me.box = me.calculateBox(area, datasets, config);\n } else if (me.box) {\n area = me.box;\n } else {\n return;\n }\n\n if (me.isVisiable()) {\n me.draw(datasets, area, config);\n }\n }\n\n /**\n * Calculate occupied space\n * @param {Object[]} [datasets] - datasets\n * @param {BoxInstance} [area] - Current box area\n * @param {Object} [config]\n * @returns {BoxInstance}\n */\n\n }, {\n key: 'calculateBox',\n value: function calculateBox(area) {\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n return area;\n }\n\n /**\n * Set an occupied space for component\n * @param {BoxInstance} box - New box\n * @param {Boolean} [redraw=true] - Re-draw the component\n */\n\n }, {\n key: 'setBox',\n value: function setBox(box) {\n var redraw = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var me = this;\n if (redraw) {\n me.clear();\n }\n if (box && box instanceof _layout.BoxInstance) {\n me.box = box;\n }\n if (redraw && me.isVisiable()) {\n me.draw();\n }\n }\n\n /**\n * Draw the component\n *\n * @param {Object[]} [datasets] - datasets\n * @param {BoxInstance} [box] - Current box area\n * @param {Object} [config]\n */\n\n }, {\n key: 'draw',\n value: function draw() {\n var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;\n var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n }\n /**\n * Clear canvas in component's box\n */\n\n }, {\n key: 'clear',\n value: function clear() {\n var me = this;\n if (me.box) {\n me.wxChart.ctx.clearRect(me.box.x, me.box.y, me.box.outerWidth, me.box.outerHeight);\n me.wxChart.ctx.draw();\n }\n }\n }, {\n key: 'isVisiable',\n value: function isVisiable() {\n return !!this.config.display;\n }\n }, {\n key: 'isHorizontal',\n value: function isHorizontal() {\n return this.position == 'top' || this.position == 'bottom';\n }\n }, {\n key: 'datasets',\n get: function get() {\n return this._datasets;\n },\n set: function set(datasets) {\n return this.update(datasets);\n }\n\n /**\n * Get visible ticks\n */\n\n }, {\n key: 'visDatasets',\n get: function get() {\n return this._visDatasets ? this._visDatasets : this._visDatasets = this.datasets.filter(function (v) {\n return !!v.display;\n });\n }\n // Can not reset\n\n , set: function set(val) {}\n }, {\n key: 'position',\n get: function get() {\n return this.config.position;\n },\n set: function set(value) {\n this.config.position = value;\n return this.update();\n }\n }]);\n\n return WxBaseComponent;\n }();\n\n exports.default = WxBaseComponent;\n }, { \"../charts/wxChart\": 14, \"../util/helper\": 25, \"../util/wxCanvas\": 29, \"./layout\": 17 }], 17: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.BoxInstance = undefined;\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _base = require('./base');\n\n var _base2 = _interopRequireDefault(_base);\n\n var _helper = require('../util/helper');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n /**\n * A box model description\n * @typedef {Object} BoxInstance\n * @property {number} x - The x point.\n * @property {number} y - The y point.\n * @property {number} width - Inner width (context only, not calculate padding and margin)\n * @property {number} height - Inner height (context only, not calculate padding and margin)\n * @property {number} outerWidth - Outer width\n * @property {number} outerHeight - Outer height\n *\n * @description\n * (x,y) -------------------------- (ex, y)\n * | |\n * | (lx,ly)-------------(rx,ly) |\n * | | | |\n * | | | |\n * | (lx,ry)-------------(rx,ry) |\n * | |\n * (x,ey) ------------------------- (ex, ey)\n */\n var BoxInstance = exports.BoxInstance = function () {\n function BoxInstance(position, x, y, width, height, outerWidth, outerHeight) {\n _classCallCheck(this, BoxInstance);\n\n var me = this;\n if (_helper.is.PureObject(position)) {\n var opt = position;\n\n position = opt.position;\n x = opt.x;\n y = opt.y;\n width = opt.width;\n height = opt.height;\n\n var padding = opt.padding,\n margin = opt.margin;\n if (_helper.is.Number(padding) && _helper.is.Number(margin)) {\n outerWidth = width + padding * 2 + margin * 2;\n outerHeight = height + padding * 2 + margin * 2;\n } else {\n outerWidth = opt.outerWidth;\n outerHeight = opt.outerHeight;\n }\n }\n\n me.position = position;\n me.width = width;\n me.height = height;\n me.outerWidth = outerWidth;\n me.outerHeight = outerHeight;\n\n Object.defineProperty(this, 'x', {\n get: function get() {\n return x;\n },\n set: function set(value) {\n me.width += x - value;\n me.outerWidth += x - value;\n x = value;\n }\n });\n\n Object.defineProperty(this, 'y', {\n get: function get() {\n return y;\n },\n set: function set(value) {\n me.height += y - value;\n me.outerHeight += y - value;\n y = value;\n }\n });\n }\n\n /**\n * The x,y in right-bottom\n */\n\n _createClass(BoxInstance, [{\n key: 'clone',\n\n /**\n * Clone this box and return an new Instance\n * @returns {BoxInstance}\n */\n value: function clone() {\n var me = this;\n return new BoxInstance(me.position, me.x, me.y, me.width, me.height, me.outerWidth, me.outerHeight);\n }\n\n /**\n * Check whether intersect with other BoxInstance\n */\n\n }, {\n key: 'isIntersect',\n value: function isIntersect(boxInstance) {\n var me = this;\n return !(me.ex < boxInstance.x || me.x > boxInstance.ex || me.ey < boxInstance.y || me.y < boxInstance.ey);\n }\n }, {\n key: 'toObject',\n value: function toObject() {\n return {\n position: this.position,\n x: this.x,\n y: this.y,\n ex: this.ex,\n ey: this.ey,\n lx: this.lx,\n ly: this.ly,\n rx: this.rx,\n ry: this.ry,\n width: this.width,\n height: this.height,\n outerHeight: this.outerHeight,\n outerWidth: this.outerWidth\n };\n }\n }, {\n key: 'ex',\n get: function get() {\n return this.x + this.outerWidth;\n }\n }, {\n key: 'ey',\n get: function get() {\n return this.y + this.outerHeight;\n }\n /**\n * The x,y in content\n */\n\n }, {\n key: 'lx',\n get: function get() {\n return this.x + this.marginLR;\n }\n }, {\n key: 'ly',\n get: function get() {\n return this.y + this.marginTB;\n }\n }, {\n key: 'rx',\n get: function get() {\n return this.x + this.width + this.marginLR;\n }\n }, {\n key: 'ry',\n get: function get() {\n return this.y + this.height + this.marginTB;\n }\n }, {\n key: 'marginLR',\n get: function get() {\n return (this.outerWidth - this.width) / 2;\n },\n set: function set(value) {\n if (_helper.is.Number(value)) {\n this.width -= value * 2;\n }\n }\n }, {\n key: 'marginTB',\n get: function get() {\n return (this.outerHeight - this.height) / 2;\n },\n set: function set(value) {\n if (_helper.is.Number(value)) {\n this.height -= value * 2;\n }\n }\n }]);\n\n return BoxInstance;\n }();\n /**\n * @class WxLayout\n * Find the best box area of items\n */\n\n var WxLayout = function () {\n function WxLayout(wxChart) {\n _classCallCheck(this, WxLayout);\n\n var me = this;\n\n if (!wxChart || !wxChart instanceof _base2.default) {\n throw new Error('Should be an WxChart instance');\n }\n me.wxChart = wxChart;\n //me.initBox = wx.wxChart.innerBox.clone();\n me._boxs = [];\n }\n\n /**\n * Add an boxInstance\n * @param {BoxInstance} boxInstance\n * @returns {number} The box id\n */\n\n _createClass(WxLayout, [{\n key: 'addBox',\n value: function addBox(boxInstance) {\n var me = this;\n if (!boxInstance instanceof BoxInstance) {\n throw new Error('Please add an BoxInstance Object');\n }\n return parseInt(me._boxs.push(boxInstance)) - 1;\n }\n\n /**\n * Remove an boxInstance\n * @param {(BoxInstance|number)} boxId - The box id\n */\n\n }, {\n key: 'removeBox',\n value: function removeBox(boxId) {\n var me = this;\n if (_helper.is.Number(boxId)) {\n me._boxs.splice(boxId, 1);\n } else if (boxId instanceof BoxInstance) {\n me._boxs.splice(me._boxs.indexOf(boxId), 1);\n }\n }\n }, {\n key: 'removeAllBox',\n value: function removeAllBox() {\n this._boxs = [];\n }\n }, {\n key: 'adjustBox',\n value: function adjustBox() {\n var me = this;\n var box = me.wxChart.innerBox.clone();\n me._boxs.forEach(function (boxInstance) {\n var position = boxInstance.position,\n x = boxInstance.x,\n y = boxInstance.y,\n height = boxInstance.height,\n width = boxInstance.width,\n outerWidth = boxInstance.outerWidth,\n outerHeight = boxInstance.outerHeight;\n\n switch (position) {\n case 'top':\n box.y += outerHeight;\n break;\n case 'bottom':\n box.outerHeight -= outerHeight;\n box.height -= outerHeight;\n break;\n case 'left':\n box.x += outerWidth;\n break;\n case 'right':\n box.outerWidth -= outerWidth;\n box.width -= outerWidth;\n break;\n }\n });\n return box;\n }\n }]);\n\n return WxLayout;\n }();\n\n exports.default = WxLayout;\n }, { \"../util/helper\": 25, \"./base\": 16 }], 18: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n return typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n };\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _base = require('./base');\n\n var _base2 = _interopRequireDefault(_base);\n\n var _helper = require('../util/helper');\n\n var _layout = require('./layout');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Legend default config\n var WX_LEGEND_DEFAULT_CONFIG = {\n display: true,\n /**\n * position can set to :top, bottom, left(same as left bottom), right(same as right bottom), left top, left bottom, right top, right bottom\n */\n position: 'top',\n fullWidth: true, // if the fullWidth is false, the 'width' property should be existed.\n labels: {\n boxWidth: 30,\n fontSize: 11,\n padding: 10 // Padding width between legend items\n }\n };\n\n //\n // The datasets is an empty array at the first time\n // When you set 'data' attribute, the legend items will draw on Canvas\n // Format\n // {\n // text: 'Displayed Text String',\n // fillAlpha: 1, // Global fill alpha\n // fillStyle: 'Color', // Fill style of the legend box\n // display: Boolean, // If true, this item represents a hidden datasets. Label will be rendered with a strike-through effect,\n // strokeStyle: 'Color'\n // lineCap: String,\n // lineJoin: String,\n // lineWidth: Number\n // }\n var WX_LEGEND_DEFAULT_ITEM_CONFIG = {\n 'lineWidth': 1,\n 'display': true\n };\n\n var WxLegend = function (_WxBaseComponent) {\n _inherits(WxLegend, _WxBaseComponent);\n\n function WxLegend(wxChart, config) {\n _classCallCheck(this, WxLegend);\n\n var _this = _possibleConstructorReturn(this, (WxLegend.__proto__ || Object.getPrototypeOf(WxLegend)).call(this, wxChart, config));\n\n _this.config = (0, _helper.extend)(true, {}, WX_LEGEND_DEFAULT_CONFIG, config);\n return _this;\n }\n\n _createClass(WxLegend, [{\n key: 'init',\n value: function init(datasets) {\n var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : WX_LEGEND_DEFAULT_ITEM_CONFIG;\n\n var me = this;\n var config = me.config;\n\n datasets = _get(WxLegend.prototype.__proto__ || Object.getPrototypeOf(WxLegend.prototype), 'init', this).call(this, datasets, defaultOptions);\n // Reset legendBox\n // Calculate the legend items\n datasets = me.calculateLegendItem(datasets, config);\n\n me._datasets = datasets;\n\n return datasets;\n }\n }, {\n key: 'calculateLegendItem',\n value: function calculateLegendItem(datasets, config) {\n var me = this;\n var labelsConfig = config.labels || {};\n\n var ctx = me.wxChart.ctx;\n var boxWidth = labelsConfig.boxWidth;\n var fontSize = labelsConfig.fontSize;\n if (!_helper.is.Array(datasets) && _helper.is.PureObject(datasets)) {\n datasets = [datasets];\n }\n\n datasets = datasets.map(function (dataset) {\n var textWidth = ctx.measureText(dataset.text).width;\n\n var width = boxWidth + fontSize / 2 + textWidth;\n dataset._prop = {\n 'fontSize': fontSize,\n 'boxHeight': fontSize,\n 'boxWidth': boxWidth,\n 'textWidth': textWidth,\n 'width': width\n };\n return dataset;\n });\n\n return datasets;\n }\n }, {\n key: 'calculateBox',\n value: function calculateBox(area) {\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this;\n var outerWidth = void 0,\n outerHeight = void 0,\n width = void 0,\n height = void 0;\n var wxChart = me.wxChart,\n ctx = wxChart.ctx,\n fontSize = ctx.fontSize;\n var x = area.x,\n y = area.y;\n var padding = config.labels.padding || 10;\n\n if (me.isHorizontal()) {\n (function () {\n width = !!config.fullWidth ? area.width - padding * 2 : config.width;\n outerWidth = !!config.fullWidth ? area.width : config.width;\n height = fontSize;\n outerHeight = height + padding * 2;\n\n // Calculate all items\n var lineNum = 0,\n currentLineWidth = 0,\n maxLineWidth = 0;\n datasets.forEach(function (dataset) {\n var prop = dataset._prop,\n outerWidth = prop.width + padding;\n var lineWidth = currentLineWidth + outerWidth;\n if (lineWidth > width) {\n // The previous line width\n maxLineWidth = maxLineWidth < currentLineWidth ? currentLineWidth : maxLineWidth;\n // We should take a new line\n lineNum++;\n // Set currentLineWidth = 0\n currentLineWidth = outerWidth;\n\n // The first item width insufficient..\n if (outerWidth > width) {\n // The width options is tooooo small!\n console.warn('The width options is too small! width=', width, '.The chart will set to ', lineWidth);\n width = outerWidth;\n }\n } else {\n currentLineWidth += outerWidth;\n }\n\n prop.padding = padding;\n prop.lineNum = lineNum;\n prop.outerWidth = outerWidth;\n });\n maxLineWidth = maxLineWidth < currentLineWidth ? currentLineWidth : maxLineWidth;\n\n // Re calculate the height of legend\n if (lineNum > 0) {\n height = fontSize * (lineNum + 1) + lineNum * fontSize / 2;\n outerHeight = height + padding * 2;\n }\n\n x += (width - maxLineWidth) / 2;\n if (me.position == 'bottom') {\n y = area.ry - outerHeight;\n y = y < area.y ? area.y : y;\n }\n })();\n } else {\n var _ret2 = function () {\n var position = me.position.match(/left/) ? 'left' : 'right';\n var align = me.position.match(/top/) ? 'top' : 'bottom';\n var width = 0,\n lineNum = 0;\n datasets.forEach(function (dataset) {\n var wh = dataset._prop.width;\n width = width < wh ? wh : width;\n\n dataset._prop.padding = padding;\n dataset._prop.lineNum = lineNum;\n // not use to set prop.outerWidth\n dataset._prop.outerWidth = null;\n lineNum++;\n });\n outerWidth = width + padding * 2;\n height = fontSize * (lineNum + 1) + lineNum * padding / 2;\n outerHeight = height + padding * 2;\n\n if (align == 'bottom') {\n y = area.ry - outerHeight;\n y = y < area.y ? area.y : y;\n }\n if (position == 'right') {\n x = area.rx - outerWidth;\n x = x < 0 ? 0 : x;\n }\n return {\n v: new _layout.BoxInstance({\n position: position,\n x: x,\n y: y,\n width: width,\n outerWidth: outerWidth,\n height: height,\n outerHeight: outerHeight\n })\n };\n }();\n\n if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n }\n\n return new _layout.BoxInstance({\n position: config.position,\n x: x,\n y: y,\n width: width,\n outerWidth: outerWidth,\n height: height,\n outerHeight: outerHeight\n });\n }\n }, {\n key: 'draw',\n value: function draw() {\n var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;\n var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var x = box.x,\n y = box.y,\n width = box.width,\n outerWidth = box.outerWidth,\n height = box.height,\n outerHeight = box.outerHeight;\n\n // Clear the area of legend\n\n me.clear();\n\n // Begin a new sub-context\n ctx.save();\n // Draw all items\n var currentLineNum = -1;\n var currentX = x,\n currentY = y;\n datasets.forEach(function (dataset) {\n var text = dataset.text,\n display = dataset.display,\n fillStyle = dataset.fillStyle,\n fillAlpha = dataset.fillAlpha,\n strokeStyle = dataset.strokeStyle,\n lineCap = dataset.lineCap,\n lineJoin = dataset.lineJoin,\n lineWidth = dataset.lineWidth;\n var _dataset$_prop = dataset._prop,\n width = _dataset$_prop.width,\n fontSize = _dataset$_prop.fontSize,\n textWidth = _dataset$_prop.textWidth,\n padding = _dataset$_prop.padding,\n lineNum = _dataset$_prop.lineNum,\n boxWidth = _dataset$_prop.boxWidth,\n boxHeight = _dataset$_prop.boxHeight,\n outerWidth = _dataset$_prop.outerWidth;\n\n if (!width) {\n // No need to draw\n return;\n }\n\n // Set style\n ctx.textBaseline = 'top';\n ctx.textAlign = 'start';\n ctx.fillStyle = fillStyle;\n ctx.fontSize = fontSize;\n ctx.strokeStyle = strokeStyle;\n ctx.lineCap = lineCap;\n ctx.lineJoin = lineJoin;\n ctx.lineWidth = lineWidth;\n\n if (currentLineNum < lineNum) {\n currentLineNum = lineNum;\n currentX = x + padding;\n currentY = y + lineNum * fontSize * 1.5 + padding;\n }\n var thisX = currentX;\n // draw rect\n if (ctx.lineWidth != 0) {\n ctx.strokeRect(currentX, currentY, boxWidth, boxHeight);\n }\n ctx.globalAlpha = fillAlpha;\n ctx.fillRect(currentX, currentY, boxWidth, boxHeight);\n ctx.globalAlpha = 1;\n\n // draw text\n currentX += boxWidth + fontSize / 2;\n ctx.fillText(text, currentX, currentY);\n\n // draw hidden strike through\n if (!display) {\n ctx.save();\n // Strike through the text if hidden\n ctx.beginPath();\n ctx.lineWidth = 1;\n ctx.moveTo(currentX, currentY + fontSize / 2);\n ctx.lineTo(currentX + textWidth, currentY + fontSize / 2);\n ctx.stroke();\n ctx.restore();\n }\n\n currentX = thisX + outerWidth;\n });\n ctx.restore();\n\n ctx.draw();\n }\n }]);\n\n return WxLegend;\n }(_base2.default);\n\n exports.default = WxLegend;\n }, { \"../util/helper\": 25, \"./base\": 16, \"./layout\": 17 }], 19: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;if (getter === undefined) {\n return undefined;\n }return getter.call(receiver);\n }\n };\n\n var _helper = require('../util/helper');\n\n var _wxCanvas = require('../util/wxCanvas');\n\n var _wxCanvas2 = _interopRequireDefault(_wxCanvas);\n\n var _layout = require('./layout');\n\n var _base = require('./base');\n\n var _base2 = _interopRequireDefault(_base);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Scale default config\n var WX_SCALE_DEFAULT_CONFIG = {\n display: true,\n position: 'top', // left, bottom, right, top\n extendLeft: 0,\n extendTop: 0,\n title: undefined,\n titleFontSize: 12,\n titleFontColor: '#4c4d4d',\n //'lineSpace' = fontSize * 0.5'\n color: '#000000', // Line color\n lineWidth: 1,\n\n gridLines: {\n display: true,\n color: '#e0e0e0', // Line color\n lineWidth: 1\n },\n\n ticks: {\n display: true,\n autoSkip: true,\n lineWidth: 1,\n fontColor: '#000000',\n fontSize: 11,\n minRotation: 0,\n maxRotation: 90\n\n //maxTicksLimit: null,\n }\n };\n\n var WX_SCALE_DEFAULT_ITEM_CONFIG = {\n display: true,\n // text: '',\n lineWidth: 1,\n fontColor: '#000000'\n };\n\n // The WeinXin APP scale\n\n var WxScale = function (_WxBaseComponent) {\n _inherits(WxScale, _WxBaseComponent);\n\n function WxScale(wxChart, config) {\n _classCallCheck(this, WxScale);\n\n var _this = _possibleConstructorReturn(this, (WxScale.__proto__ || Object.getPrototypeOf(WxScale)).call(this, wxChart, config));\n\n _this.config = (0, _helper.extend)(true, {}, WX_SCALE_DEFAULT_CONFIG, config);\n return _this;\n }\n\n /**\n * Get visible tick's text data\n */\n\n _createClass(WxScale, [{\n key: 'getTicksText',\n value: function getTicksText(tick) {\n if (!!tick && !!tick.text) {\n return tick.format ? tick.format.call(tick, tick.text, tick) : tick.text;\n }\n return null;\n }\n\n /**\n * Get lineSpace\n * @returns {*|number}\n */\n\n }, {\n key: 'longestText',\n\n /**\n * Get longest text\n */\n value: function longestText() {\n var ctx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.wxChart.ctx;\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;\n\n var me = this;\n var maxTextLen = 0;\n datasets.forEach(function (dataset) {\n if (!!dataset.display) {\n var textWidth = void 0;\n if (dataset.textWidth) {\n textWidth = dataset.textWidth;\n } else {\n var text = me.getTicksText(dataset);\n textWidth = ctx.measureText(text).width;\n dataset.textWidth = textWidth;\n }\n maxTextLen = maxTextLen < textWidth ? textWidth : maxTextLen;\n }\n });\n return maxTextLen;\n }\n }, {\n key: 'calculateFixPadding',\n value: function calculateFixPadding(datasets, config) {\n var me = this,\n ctx = me.wxChart.ctx;\n if (config.fixPadding) {\n return config.fixPadding;\n }\n if (me.isHorizontal()) {\n var visTicks = me.visDatasets;\n var firstTickText = me.getTicksText(visTicks[0]),\n lastTickText = me.getTicksText(visTicks[visTicks.length - 1]);\n return Math.max(ctx.measureText(firstTickText).width, ctx.measureText(lastTickText).width);\n } else {\n return ctx.fontSize;\n }\n }\n }, {\n key: 'init',\n value: function init(datasets) {\n var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : WX_SCALE_DEFAULT_ITEM_CONFIG;\n\n var me = this;\n var config = me.config;\n\n datasets = _get(WxScale.prototype.__proto__ || Object.getPrototypeOf(WxScale.prototype), 'init', this).call(this, datasets, defaultOptions);\n me.visDatasets = null;\n me._datasets = datasets;\n me.fixPadding = me.calculateFixPadding(datasets, config);\n\n return datasets;\n }\n }, {\n key: 'calculateBox',\n value: function calculateBox(area) {\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.datasets;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var fontSize = ctx.fontSize;\n var tickWidth = me.calculateTickWidth(datasets, area, config);\n var x = void 0,\n y = void 0,\n minWidth = void 0,\n minHeight = void 0,\n maxWidth = void 0,\n maxHeight = void 0;\n var minFontRotation = (0, _helper.toRadians)(config.ticks.minRotation || 0),\n maxFontRotation = (0, _helper.toRadians)(config.ticks.maxRotation || 90),\n fontRadians = minFontRotation;\n var lineSpace = me.lineSpace;\n var lineWidth = 1;\n\n var longestText = me.longestText();\n if (me.isHorizontal()) {\n if (longestText > tickWidth) {\n // Ticket's width not satisfied with the longest text's width\n if (tickWidth <= ctx.fontSize) {\n fontRadians = maxFontRotation;\n } else {\n fontRadians = Math.acos(tickWidth / longestText);\n minHeight = Math.sin(fontRadians) * longestText + lineWidth + lineSpace + fontSize / 2;\n if (minHeight > area.height) {\n minHeight = area.height;\n fontRadians = Math.asin((minHeight - lineWidth - lineSpace - fontSize / 2) / longestText);\n } else if (fontRadians > maxFontRotation) {\n fontRadians = maxFontRotation;\n minHeight = Math.sin(fontRadians) * longestText + lineWidth + lineSpace + fontSize / 2;\n }\n }\n } else {\n minHeight = fontSize * 1.5 + lineWidth + lineSpace;\n }\n minWidth = area.width;\n maxWidth = area.outerWidth;\n maxHeight = minHeight;\n } else {\n var titleWidth = 0;\n if (config.title) {\n titleWidth = ctx.measureText(config.title, config.titleFontSize).width - lineWidth - lineSpace - fontSize / 2;\n }\n minWidth = longestText + lineWidth + lineSpace + fontSize / 2;\n minWidth = minWidth > titleWidth ? minWidth : titleWidth;\n if (minWidth > area.width) {\n minWidth = area.width;\n fontRadians = Math.acos((minWidth - lineWidth - lineSpace - fontSize / 2) / longestText);\n fontRadians = fontRadians > maxFontRotation ? maxFontRotation : fontRadians;\n }\n minHeight = area.height;\n maxWidth = minWidth;\n maxHeight = area.outerHeight;\n }\n switch (me.position) {\n case 'left':\n case 'top':\n x = area.x;\n y = area.y;\n break;\n case 'right':\n x = area.x + area.width - maxWidth;\n y = area.y;\n break;\n case 'bottom':\n x = area.x;\n y = area.y + area.height - maxHeight;\n break;\n }\n\n me.fontRadians = fontRadians;\n return new _layout.BoxInstance(me.position, x, y, minWidth, minHeight, maxWidth, maxHeight);\n }\n }, {\n key: 'calculateTickWidth',\n\n /**\n * Calculate ticks' separation distance\n * @param {BoxInstance} [area=this.box]\n *\n *\n * Horizontal Scale:\n * x------------------------------------.--x(first tick)--------------------------.--x(last tick)--margin--x\n * x------------------------------------.--x(first tick)-----x(last tick)--margin-.--x--titleWidth+padding--\n * |---extendLeft---|(box.x)---margin---|-----------area.width----------------------|---------margin------|\n * |----------------------------area box-------------------------------------------------|\n * Vertical Scale:\n * x----------------------------------------.--x--------(first tick)----------.--x(last tick)-x\n * x------------------titleHeight+padding---.--x---margin-x-------(first tick).--x(last tick)-x\n * |---extendTop----|(box.y)---margin-------|-----------area.height--------------|---margin---|\n * |----------------------------area box-------------------------------------|\n */\n value: function calculateTickWidth() {\n var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;\n var area = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ticketWidth = void 0;\n var visTicks = me.visDatasets;\n var defaultLineWidth = config.ticks.lineWidth;\n // total line width\n var totalLineWidth = _helper.sum.apply(null, visTicks.map(function (v) {\n return v.lineWidth || defaultLineWidth;\n }));\n var fixPadding = me.fixPadding;\n\n if (me.isHorizontal()) {\n var innerWidth = area.width,\n marginLR = area.marginLR;\n var titleWidth = me.calculateTitleWidth();\n var extendLeft = me.config.extendLeft;\n if (marginLR !== 0) {\n totalLineWidth += defaultLineWidth * 2;\n } else if (extendLeft !== 0) {\n totalLineWidth += defaultLineWidth;\n }\n ticketWidth = (innerWidth - titleWidth - totalLineWidth - fixPadding) / (visTicks.length - 1);\n } else {\n var innerHeight = area.height,\n marginTB = area.marginTB;\n var titleHeight = me.calculateTitleWidth();\n var extendTop = config.extendTop;\n if (marginTB !== 0) {\n totalLineWidth += defaultLineWidth * 2;\n } else if (extendTop !== 0) {\n totalLineWidth += defaultLineWidth;\n }\n ticketWidth = (innerHeight - titleHeight - totalLineWidth - fixPadding) / (visTicks.length - 1);\n }\n return ticketWidth;\n }\n }, {\n key: 'calculateTitleWidth',\n value: function calculateTitleWidth() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config;\n\n var titleWidth = void 0,\n me = this,\n ctx = me.wxChart.ctx;\n if (me.isHorizontal()) {\n titleWidth = config.title ? ctx.measureText(config.title, config.titleFontSize).width : 0;\n } else {\n titleWidth = config.title ? config.titleFontSize : 0;\n }\n return titleWidth;\n }\n }, {\n key: '_getTicksLineWidthOffset',\n value: function _getTicksLineWidthOffset(index, visTicks) {\n var offset = 0,\n me = this;\n if (!visTicks) {\n visTicks = me.visDatasets;\n }\n var defaultLineWidth = this.config.ticks.lineWidth;\n visTicks.map(function (tick, i) {\n if (index >= i) {\n offset += tick.lineWidth || defaultLineWidth;\n }\n });\n return offset;\n }\n\n /**\n * Get position of ticket\n * @param {number} index - Begin from zero. If set -1, the function will return the actual x,y included extendLeft or extendTop\n * @param {number} [ticketWidth=this.ticketWidth]\n * @param {BoxInstance} [area=this.box]\n */\n\n }, {\n key: 'getTicksPosition',\n value: function getTicksPosition(index, ticketWidth) {\n var area = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.box;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var fixPadding = me.fixPadding;\n if (!ticketWidth) {\n ticketWidth = me.calculateTickWidth();\n }\n var visTicks = me.visDatasets;\n\n var baseX = void 0,\n baseY = void 0;\n if (me.isHorizontal()) {\n baseX = index === -1 ? area.x - me.config.extendLeft + fixPadding / 2 + (me.config.extendLeft ? me.config.ticks.lineWidth : 0) : area.lx + me._getTicksLineWidthOffset(index, visTicks) + ticketWidth * index + fixPadding / 2;\n baseY = me.position === 'top' ? area.ry - me.lineSpace : area.ly + me.lineSpace;\n } else {\n baseY = index === -1 ? area.y - me.config.extendTop + fixPadding / 2 + (me.config.extendTop ? me.config.ticks.lineWidth : 0) : area.ly + me.calculateTitleWidth() + me._getTicksLineWidthOffset(index, visTicks) + ticketWidth * index + fixPadding / 2;\n baseX = me.position === 'left' ? area.rx - me.lineSpace : area.lx + me.lineSpace;\n }\n return { x: baseX, y: baseY };\n }\n }, {\n key: '_initDrawATickText',\n value: function _initDrawATickText() {\n var me = this,\n ctx = me.wxChart.ctx;\n switch (me.position) {\n case 'left':\n ctx.textAlign = 'end';\n ctx.textBaseline = 'middle';\n break;\n case 'right':\n ctx.textAlign = 'start';\n ctx.textBaseline = 'middle';\n break;\n case 'top':\n ctx.textAlign = 'center';\n ctx.textBaseline = 'alphabetic';\n break;\n case 'bottom':\n ctx.textAlign = 'center';\n ctx.textBaseline = 'top';\n break;\n }\n }\n }, {\n key: '_drawATickLine',\n value: function _drawATickLine(x, y, fontSize) {\n var tick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var lineSpace = me.lineSpace;\n var sx = x;\n var sy = y;\n switch (me.position) {\n case 'left':\n sx += lineSpace;\n break;\n case 'right':\n sx -= lineSpace;\n break;\n case 'top':\n sy += lineSpace;\n break;\n case 'bottom':\n sy -= lineSpace;\n break;\n }\n ctx.beginPath();\n ctx.moveTo(sx, sy);\n ctx.lineTo(x, y);\n ctx.stroke();\n\n // Draw text\n var text = void 0;\n if (tick && tick.text && _helper.is.String(tick.text)) {\n ctx.save();\n me._initDrawATickText();\n text = tick.format ? tick.format.call(me, tick.text, tick, x, y, me.fontRadians) : tick.text;\n var textWidth = tick.textWidth ? tick.textWidth : ctx.measureText(text).width;\n switch (me.position) {\n case 'left':\n ctx.translate(x - fontSize / 2, y + Math.sin(me.fontRadians) * textWidth / 2);\n ctx.rotate(me.fontRadians);\n //ctx.fillText(text, x - ctx.fontSize/2, y);\n break;\n case 'right':\n ctx.translate(x + fontSize / 2, y + Math.sin(me.fontRadians) * textWidth / 2);\n ctx.rotate(-me.fontRadians);\n // ctx.fillText(text, x + ctx.fontSize/2, y);\n break;\n case 'top':\n ctx.translate(x, y - fontSize / 2);\n ctx.rotate(-me.fontRadians);\n break;\n case 'bottom':\n ctx.translate(x, y + fontSize / 2);\n ctx.rotate(me.fontRadians);\n break;\n }\n ctx.fillText(text, 0, 0);\n\n ctx.restore();\n }\n }\n }, {\n key: 'draw',\n value: function draw() {\n var datasets = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.datasets;\n var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var fontSize = ctx.fontSize;\n var fixPadding = me.fixPadding,\n tickWidth = me.calculateTickWidth(datasets, box, config);\n var tickConfig = config.ticks;\n var x = box.x,\n y = box.y,\n width = box.width,\n outerWidth = box.outerWidth,\n height = box.height,\n outerHeight = box.outerHeight;\n\n var visTicks = me.visDatasets;\n\n var _me$getTicksPosition = me.getTicksPosition(-1, tickWidth),\n currX = _me$getTicksPosition.x,\n currY = _me$getTicksPosition.y,\n baseX = _me$getTicksPosition.x,\n baseY = _me$getTicksPosition.y;\n\n ctx.save();\n ctx.fillStyle = tickConfig.fontColor;\n ctx.fontSize = tickConfig.fontSize;\n ctx.lineWidth = tickConfig.lineWidth;\n var titleWidth = me.calculateTitleWidth();\n\n if (me.isHorizontal()) {\n // Draw the first point\n if (me.box.marginLR || config.extendLeft) {\n currX += tickConfig.lineWidth;\n me._drawATickLine(currX, currY, fontSize);\n }\n // Move to first tick\n currX = me.box.lx + fixPadding / 2;\n // Draw ticks\n visTicks.map(function (tick) {\n currX += tick.lineWidth;\n ctx.fillStyle = tick.fontColor;\n ctx.lineWidth = tick.lineWidth;\n ctx.fontSize = tick.fontSize || ctx.fontSize;\n me._drawATickLine(currX, currY, fontSize, tick);\n currX += tickWidth;\n });\n // Draw the last point\n currX = me.box.ex - fixPadding / 2 - titleWidth;\n if (me.box.marginLR) {\n me._drawATickLine(currX, currY, fontSize);\n }\n\n ctx.fillStyle = tickConfig.fontColor;\n ctx.lineWidth = config.lineWidth;\n // draw axis line\n ctx.beginPath();\n ctx.moveTo(baseX, currY);\n ctx.lineTo(currX, currY);\n ctx.stroke();\n\n if (config.title) {\n ctx.save();\n currX += fontSize / 2;\n ctx.fontSize = config.titleFontSize;\n ctx.textAlign = 'start';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = config.titleFontColor;\n ctx.fillText(config.title, currX, currY);\n ctx.restore();\n }\n } else {\n if (config.title) {\n ctx.save();\n ctx.fontSize = config.titleFontSize;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = config.titleFontColor;\n ctx.fillText(config.title, currX, currY);\n ctx.restore();\n }\n\n // Draw the first point\n if (me.box.marginTB || config.extendTop) {\n currY += titleWidth;\n me._drawATickLine(currX, currY, fontSize);\n }\n currY = me.box.ly + fixPadding / 2 + titleWidth;\n // Draw ticks\n visTicks.map(function (tick) {\n currY += tick.lineWidth;\n ctx.fillStyle = tick.fontColor;\n ctx.lineWidth = tick.lineWidth;\n ctx.fontSize = tick.fontSize || ctx.fontSize;\n me._drawATickLine(currX, currY, fontSize, tick);\n currY += tickWidth;\n });\n // Draw the last point\n currY = me.box.ey - fixPadding / 2;\n if (me.box.marginTB) {\n me._drawATickLine(currX, currY, fontSize);\n }\n\n ctx.fillStyle = tickConfig.fontColor;\n ctx.lineWidth = config.lineWidth;\n // draw axis line\n ctx.beginPath();\n ctx.moveTo(currX, baseY + titleWidth);\n ctx.lineTo(currX, currY);\n ctx.stroke();\n }\n ctx.draw();\n ctx.restore();\n }\n\n // Empty interface\n /**\n * Get one point by a value\n * @param {number} index - The index of category\n */\n\n }, {\n key: 'getPoint',\n value: function getPoint(index) {\n return null;\n }\n }, {\n key: 'lineSpace',\n get: function get() {\n var me = this;\n if (me._lineSpace) {\n return me._lineSpace;\n }\n me._lineSpace = this.config.lineSpace || this.wxChart.ctx.fontSize * 0.5;\n return me._lineSpace;\n }\n }]);\n\n return WxScale;\n }(_base2.default);\n\n exports.default = WxScale;\n }, { \"../util/helper\": 25, \"../util/wxCanvas\": 29, \"./base\": 16, \"./layout\": 17 }], 20: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _base = require('./base');\n\n var _base2 = _interopRequireDefault(_base);\n\n var _helper = require('../util/helper');\n\n var _layout = require('./layout');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n // Legend default config\n var WX_TITLE_DEFAULT_CONFIG = {\n display: true,\n position: 'top', // top, bottom\n fullWidth: true, // if the fullWidth is false, the 'width' property should be existed.\n fontSize: 16,\n fontColor: '#666666',\n padding: 10\n };\n\n var WxTitle = function (_WxBaseComponent) {\n _inherits(WxTitle, _WxBaseComponent);\n\n function WxTitle(wxChart, config) {\n _classCallCheck(this, WxTitle);\n\n var _this = _possibleConstructorReturn(this, (WxTitle.__proto__ || Object.getPrototypeOf(WxTitle)).call(this, wxChart, config));\n\n _this.config = (0, _helper.extend)(true, {}, WX_TITLE_DEFAULT_CONFIG, config);\n return _this;\n }\n\n /**\n * Update data and re-draw\n * @param {Object[]} text\n * @param {Object} [defaultOptions]\n * @returns {string} text\n */\n\n _createClass(WxTitle, [{\n key: 'init',\n value: function init(text) {\n var defaultOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var me = this;\n var config = me.config;\n\n text = text ? text : config.text;\n if (_helper.is.Undefined(text) || _helper.is.Null(text)) {\n throw new Error('Text is null');\n }\n\n me._datasets = text;\n return text;\n }\n }, {\n key: 'calculateBox',\n value: function calculateBox(area) {\n var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.config.text;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this;\n var wxChart = me.wxChart,\n ctx = wxChart.ctx,\n fontSize = config.fontSize || 16;\n var x = area.x,\n y = area.y;\n var padding = config.padding || 10;\n\n var width = !!config.fullWidth ? area.width - padding * 2 : config.width,\n outerWidth = !!config.fullWidth ? area.width : config.width,\n height = fontSize,\n outerHeight = height + padding * 2;\n\n if (config.position == 'bottom') {\n y = area.ry - outerHeight;\n y = y < area.y ? area.y : y;\n }\n\n return new _layout.BoxInstance({\n position: config.position,\n x: x,\n y: y,\n width: width,\n height: height,\n outerWidth: outerWidth,\n outerHeight: outerHeight\n });\n }\n }, {\n key: 'draw',\n value: function draw() {\n var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.config.text;\n var box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.box;\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.config;\n\n var me = this,\n ctx = me.wxChart.ctx;\n var x = box.x,\n y = box.y,\n width = box.width,\n outerWidth = box.outerWidth,\n height = box.height,\n outerHeight = box.outerHeight;\n\n if (_helper.is.Undefined(text) || _helper.is.Null(text)) {\n throw new Error('Text is null');\n }\n\n var fontColor = config.fontColor,\n fontSize = config.fontSize;\n // Clear the area of legend\n\n me.clear();\n // Begin a new sub-context\n ctx.save();\n\n ctx.textBaseline = 'top';\n ctx.textAlign = 'start';\n ctx.fillStyle = fontColor;\n ctx.fontSize = fontSize;\n\n var textLen = ctx.measureText(text).width;\n x += (width - textLen) / 2;\n ctx.fillText(text, x, y);\n\n ctx.restore();\n ctx.draw();\n }\n }]);\n\n return WxTitle;\n }(_base2.default);\n\n exports.default = WxTitle;\n ;\n }, { \"../util/helper\": 25, \"./base\": 16, \"./layout\": 17 }], 21: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _helper = require('../util/helper');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n /**\n * @class Liner scale\n */\n var WxCategoryScale = function (_WxScale) {\n _inherits(WxCategoryScale, _WxScale);\n\n function WxCategoryScale() {\n _classCallCheck(this, WxCategoryScale);\n\n return _possibleConstructorReturn(this, (WxCategoryScale.__proto__ || Object.getPrototypeOf(WxCategoryScale)).apply(this, arguments));\n }\n\n _createClass(WxCategoryScale, [{\n key: 'buildTicks',\n\n /**\n * Build a ticks array by minIndex or maxIndex\n * Use to generator category scale ticks\n *\n * @param {Array} legends - The legend config of chart\n * @param {number} maxIndex - Max index\n * @param {number} minIndex - Min index\n *\n * @return {Array} The ticks data\n */\n value: function buildTicks(legends, maxIndex, minIndex) {\n if (!legends || !_helper.is.Array(legends)) {\n return legends;\n }\n minIndex = minIndex || 0;\n maxIndex = maxIndex || legends.length;\n\n return legends.slice(minIndex, maxIndex);\n }\n }, {\n key: 'buildDatasets',\n value: function buildDatasets(legends, maxIndex, minIndex) {\n return this.buildTicks.apply(this, arguments);\n }\n\n /**\n * Get one point by a value\n * @param {number} index - The index of category\n */\n\n }, {\n key: 'getPoint',\n value: function getPoint(index) {\n return this.getTicksPosition(index);\n }\n }]);\n\n return WxCategoryScale;\n }(_scale2.default);\n\n exports.default = WxCategoryScale;\n }, { \"../core/scale\": 19, \"../util/helper\": 25 }], 22: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _layout = require('../core/layout');\n\n var _layout2 = _interopRequireDefault(_layout);\n\n var _helper = require('../util/helper');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var WX_CROSSSCALE_CONFIG = {\n xMargin: undefined, // undefined, a number or a function\n xFirstPointSpace: 'auto' };\n /**\n * An cross scale helper\n */\n\n var WxCrossScale = function () {\n /**\n * @constructor\n * @param {WxScale} xScale - x-Axis instance\n * @param {WxScale} yScale - y-Axis instance\n * @param {Object} [config]\n */\n function WxCrossScale(xScale, yScale, config) {\n _classCallCheck(this, WxCrossScale);\n\n if (!xScale instanceof _scale2.default && !yScale instanceof _scale2.default) {\n throw new Error('Should be an WxScale instance');\n }\n\n var me = this;\n me.xScale = xScale;\n me.yScale = yScale;\n\n me.config = (0, _helper.extend)(true, {}, WX_CROSSSCALE_CONFIG, config);\n }\n\n /**\n * Draw a cross scale\n */\n\n _createClass(WxCrossScale, [{\n key: 'draw',\n value: function draw(area, xScaleDatasets, yScaleDatasets) {\n var me = this,\n _me$config = me.config,\n xMargin = _me$config.xMargin,\n xFirstPointSpace = _me$config.xFirstPointSpace;\n\n me.yScale.init(yScaleDatasets);\n var yBox = me.yScale.calculateBox(area, yScaleDatasets);\n me.xScale.init(xScaleDatasets);\n var xBox = me.xScale.calculateBox(area, xScaleDatasets);\n\n // Y-Base\n var yMHeight = xBox.outerHeight - xBox.marginTB - me.xScale.lineSpace;\n //yBox.y = yBox.y + yMHeight*2;\n me.yScale.config.fixPadding = yMHeight * 2;\n\n // Adjust X-BOX\n var xMWidth = yBox.outerWidth - yBox.marginLR - me.yScale.lineSpace;\n\n var xOffset = xMWidth - me.xScale.fixPadding / 2;\n\n var xExtendLeft = void 0;\n if (xFirstPointSpace === 'auto') {\n xExtendLeft = me.xScale.config.extendLeft || Math.min(xBox.width / 10, me.xScale.calculateTickWidth(xScaleDatasets, xBox) / xScaleDatasets.length);\n } else if (xFirstPointSpace === 0) {\n // Zero y-space; The first point of Y will overlap the last point of X, so remove the last point of X\n yScaleDatasets[yScaleDatasets.length - 1].text = '';\n xExtendLeft = 0;\n } else if (_helper.is.Function(xFirstPointSpace)) {\n xExtendLeft = xFirstPointSpace(xBox, yBox, area, me.xScale, me.yScale, xScaleDatasets, yScaleDatasets);\n } else {\n xExtendLeft = parseFloat(xFirstPointSpace);\n }\n\n xOffset -= me.xScale.config.ticks.lineWidth || 1;\n xOffset += xExtendLeft;\n\n var xAxisXPoint = area.x + xOffset;\n if (_helper.is.Function(xMargin)) {\n xMargin = xMargin(xBox, yBox, area, me.xScale, me.yScale, xScaleDatasets, yScaleDatasets);\n } else if (!xMargin || !_helper.is.Number(xMargin)) {\n xMargin = 0;\n }\n\n var calXbox = new _layout.BoxInstance(xBox.position, xAxisXPoint, xBox.y, xBox.width - xOffset - xMargin, xBox.height, xBox.outerWidth - xOffset, xBox.outerHeight);\n me.yScale.setBox(yBox, false);\n me.yScale.update(yScaleDatasets);\n\n me.xScale.setBox(calXbox, false);\n me.xScale.config.extendLeft = xExtendLeft;\n me.xScale.update(xScaleDatasets);\n\n return { xBox: calXbox, yBox: yBox };\n }\n }]);\n\n return WxCrossScale;\n }();\n\n exports.default = WxCrossScale;\n }, { \"../core/layout\": 17, \"../core/scale\": 19, \"../util/helper\": 25 }], 23: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _scale = require('../core/scale');\n\n var _scale2 = _interopRequireDefault(_scale);\n\n var _helper = require('../util/helper');\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && ((typeof call === \"undefined\" ? \"undefined\" : _typeof2(call)) === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : _typeof2(superClass)));\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n /**\n * @class Liner scale\n */\n var WxLinerScale = function (_WxScale) {\n _inherits(WxLinerScale, _WxScale);\n\n function WxLinerScale() {\n _classCallCheck(this, WxLinerScale);\n\n return _possibleConstructorReturn(this, (WxLinerScale.__proto__ || Object.getPrototypeOf(WxLinerScale)).apply(this, arguments));\n }\n\n _createClass(WxLinerScale, [{\n key: 'buildTicks',\n\n /**\n * Build a ticks array by max/min value\n * Use to generator liner scale ticks\n *\n * @param {number} max - Max value\n * @param {number} min - Min value\n * @param {number} maxTicks - The maxinum number of ticks\n * @param {number} [stepSize] - Special space size\n *\n * @return {Array} The ticks data\n */\n value: function buildTicks(max, min, maxTicks, stepSize) {\n var spacing = void 0,\n ticks = [];\n if (!!stepSize && stepSize > 0) {\n spacing = stepSize;\n } else {\n var niceRange = (0, _helper.niceNum)(max - min, false);\n spacing = (0, _helper.niceNum)(niceRange / (maxTicks - 1), true);\n }\n\n var niceMin = Math.floor(min / spacing) * spacing;\n var niceMax = Math.ceil(max / spacing) * spacing;\n var numSpaces = (niceMax - niceMin) / spacing;\n\n if ((0, _helper.almostEquals)(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n\n for (var j = 0; j < numSpaces; j++) {\n ticks.push(niceMin + j * spacing);\n }\n ticks.push(niceMax);\n\n return ticks;\n }\n\n /**\n * Build a datasets base on buildTicks\n *\n * @param {number} max - Max value\n * @param {number} min - Min value\n * @param {number} maxTicks - The maximum number of ticks\n * @param {number} [stepSize] - Assign the space size\n * @param {Object} [scaleOptions] - Assign the dataset item's options\n *\n * @return {Array} The ticks data\n */\n\n }, {\n key: 'buildDatasets',\n value: function buildDatasets(max, min, maxTicks, stepSize, scaleOptions) {\n var me = this;\n var ticks = me.buildTicks(max, min, maxTicks, stepSize);\n if (!me.isHorizontal()) ticks.reverse();\n return ticks.map(function (val) {\n return (0, _helper.extend)({\n text: val + '',\n value: val\n }, scaleOptions);\n });\n }\n\n /**\n * Calculate the maximum ticks of scale\n *\n * @param {BoxInstance} area - area of chart\n * @param {WxCanvasRenderingContext2D} ctx - Content of chart\n * @returns {number} maxTicks\n */\n\n }, {\n key: 'calculateTickLimit',\n value: function calculateTickLimit(area, ctx) {\n var me = this,\n fontSize = ctx.fontSize;\n var maxTicks = void 0;\n var tickOpts = me.config.ticks;\n\n if (me.isHorizontal()) {\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(area.width / 50));\n } else {\n // The factor of 2 used to scale the font size has been experimentally determined.\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(area.height / (2 * fontSize)));\n }\n\n return maxTicks;\n }\n\n /**\n * Get one point by a value\n * **Must** run after 'setBox' or 'update'\n * @param {number} value\n * @returns {object} point\n *\n */\n\n }, {\n key: 'getPoint',\n value: function getPoint(value) {\n var me = this,\n box = this.box;\n var pointX = void 0,\n pointY = void 0;\n\n var startVal = parseInt(me.visDatasets[0].value),\n endVal = parseInt(me.visDatasets[me.visDatasets.length - 1].value);\n // if (!me.isHorizontal()) {\n // [startVal,endVal] = [endVal,startVal];\n // }\n var range = endVal - startVal;\n\n if (me.isHorizontal()) {\n var realWidth = me.getTicksPosition(me.visDatasets.length - 1).x - me.getTicksPosition(0).x;\n pointX = me.getTicksPosition(0).x + realWidth / range * (value - startVal);\n pointY = me.position === 'top' ? box.ry - me.lineSpace : box.ly + me.lineSpace;\n } else {\n var realHeight = me.getTicksPosition(me.visDatasets.length - 1).y - me.getTicksPosition(0).y;\n pointX = me.position === 'left' ? box.rx - me.lineSpace : box.lx + me.lineSpace;\n pointY = me.getTicksPosition(0).y + realHeight / range * (value - startVal);\n }\n return { x: Math.round(pointX), y: Math.round(pointY) };\n }\n }]);\n\n return WxLinerScale;\n }(_scale2.default);\n\n exports.default = WxLinerScale;\n }, { \"../core/scale\": 19, \"../util/helper\": 25 }], 24: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n /**\r\n * An mixin class(implement by es6-mixins) for stacked point\r\n */\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var WxStackMixin = function () {\n function WxStackMixin() {\n _classCallCheck(this, WxStackMixin);\n }\n\n _createClass(WxStackMixin, [{\n key: 'stackYScaleAxisLimit',\n\n /**\r\n * Calculate the yAxis data for *WxLinerScale*\r\n */\n value: function stackYScaleAxisLimit() {\n var me = this;\n var min = 0,\n max = 0;\n me.visDatasets.forEach(function (data) {\n var sumNeg = 0,\n sumPos = 0;\n me.legends.forEach(function (legend) {\n var key = legend.key;\n var stackedVal = data[key];\n if (stackedVal < 0) {\n sumNeg += stackedVal || 0;\n } else {\n sumPos += stackedVal || 0;\n }\n });\n data.__sumNeg = sumNeg;\n data.__sumPos = sumPos;\n if (sumNeg < min) min = sumNeg;\n if (sumPos > max) max = sumPos;\n });\n\n return { max: max, min: min };\n }\n /**\r\n * Calculate the stack value\r\n * @param {number} index - The index of item\r\n * @param {Object} legendIndex - The index of legend\r\n * @param {number} [offset=0] - The offset value of stack\r\n * @param {WxScale} [yScale=this.yAxis] - Y-Axis instance\r\n * @return {{sumNeg: number, sumPos: number}}\r\n * @private\r\n */\n\n }, {\n key: '_getStackValue',\n value: function _getStackValue(index, legendIndex) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;\n\n var me = this,\n data = me.visDatasets[index];\n\n var stackedVal = void 0,\n sumNeg = 0,\n sumPos = 0;\n for (var j = 0; j < legendIndex; j++) {\n stackedVal = data[me.legends[j].key];\n if (stackedVal < 0) {\n sumNeg += stackedVal || 0;\n } else {\n sumPos += stackedVal || 0;\n }\n }\n return {\n sumNeg: sumNeg,\n sumPos: sumPos\n };\n }\n\n /**\r\n * Calculate the stack bar\r\n * @param {number} index - The index of item\r\n * @param {Object} legendIndex - The index of legend\r\n * @param {number} [offsetValue=0] - The offset value of stack\r\n * @param {WxScale} [yScale=this.yAxis] - Y-Axis instance\r\n * @return {Object}\r\n * @private\r\n */\n\n }, {\n key: '_getStackPoint',\n value: function _getStackPoint(index, legendIndex) {\n var offsetValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var yScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.yAxis;\n\n var me = this,\n data = me.visDatasets[index],\n value = data[me.legends[legendIndex].key];\n\n var _me$_getStackValue = me._getStackValue(index, legendIndex, offsetValue, yScale),\n sumNeg = _me$_getStackValue.sumNeg,\n sumPos = _me$_getStackValue.sumPos;\n\n return value < 0 ? yScale.getPoint(sumNeg + value + offsetValue) : yScale.getPoint(sumPos + value + offsetValue);\n }\n }]);\n\n return WxStackMixin;\n }();\n\n exports.default = WxStackMixin;\n }, {}], 25: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _typeof = typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\" ? function (obj) {\n return typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n };\n\n exports.sum = sum;\n exports.checkWX = checkWX;\n exports.wxConverToPx = wxConverToPx;\n exports.toRadians = toRadians;\n exports.toDegrees = toDegrees;\n exports.getWindowSize = getWindowSize;\n exports.getDPR = getDPR;\n exports.niceNum = niceNum;\n exports.almostEquals = almostEquals;\n exports.splineCurve = splineCurve;\n exports.getStyle = getStyle;\n exports.readUsedSize = readUsedSize;\n exports.retinaScale = retinaScale;\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n var ObjProto = Object.prototype;\n\n // IS function, check variable's type\n var is = exports.is = {};\n\n ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'].forEach(function (name) {\n is[name] = function (obj) {\n return ObjProto.toString.call(obj) === '[object ' + name + ']';\n };\n });\n\n // Is a given value an array?\n // Delegates to ECMA5's native Array.isArray\n is['Array'] = Array.isArray || function (obj) {\n return ObjProto.toString.call(obj) === '[object Array]';\n };\n\n // Is a given variable an object?\n is['Object'] = function (obj) {\n var type = typeof obj === 'undefined' ? 'undefined' : _typeof(obj);\n return type === 'function' || type === 'object' && !!obj;\n };\n\n var class2type = {};\n var toString = class2type.toString;\n var hasOwn = class2type.hasOwnProperty;\n var fnToString = hasOwn.toString;\n var ObjectFunctionString = fnToString.call(Object);\n // Is a given variable an object?\n is['PureObject'] = function (obj) {\n var proto = void 0,\n Ctor = void 0;\n\n // Detect obvious negatives\n // Use toString instead of jQuery.type to catch host objects\n if (!obj || ObjProto.toString.call(obj) !== \"[object Object]\") {\n return false;\n }\n\n proto = Object.getPrototypeOf(obj);\n // Objects with no prototype (e.g., `Object.create( null )`) are plain\n if (!proto) {\n return true;\n }\n // Objects with prototype are plain iff they were constructed by a global Object function\n Ctor = hasOwn.call(proto, \"constructor\") && proto.constructor;\n return typeof Ctor === \"function\" && fnToString.call(Ctor) === ObjectFunctionString;\n };\n\n is['Boolean'] = function (obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n };\n\n // Is a given value equal to null?\n is['Null'] = function (obj) {\n return obj === null;\n };\n\n // Is a given variable undefined?\n is['Undefined'] = function (obj) {\n return obj === void 0;\n };\n\n // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n is['NaN'] = function (obj) {\n return is.Number(obj) && obj !== +obj;\n };\n\n // Some helper function\n function sum() {\n var args = Array.from(arguments);\n var res = 0;\n return args.reduce(function (a, b) {\n return a + b;\n }, 0);\n }\n\n // Some regex\n var REG_HANZI = exports.REG_HANZI = /[\\u4e00-\\u9fa5]/;\n var REG_ALPHABET = exports.REG_ALPHABET = /[a-zA-Z]/;\n var REG_NUMBER = exports.REG_NUMBER = /[0-9]/;\n var REG_ALPHABET_NUMBER = exports.REG_ALPHABET_NUMBER = /[0-9a-zA-Z]/;\n\n // Assign function generator\n function _assignGenerator(own) {\n var _copy = function _copy(target) {\n var deep = true;\n\n for (var _len = arguments.length, source = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n source[_key - 1] = arguments[_key];\n }\n\n if (is.Boolean(target)) {\n deep = target;\n target = 0 in source ? source.shift() : null;\n }\n\n if (is.Array(target)) {\n source.forEach(function (sc) {\n var _target;\n\n (_target = target).push.apply(_target, _toConsumableArray(sc));\n });\n } else if (is.Object(target)) {\n source.forEach(function (sc) {\n for (var key in sc) {\n if (own && !sc.hasOwnProperty(key)) continue;\n var so = sc[key],\n to = target[key];\n if (is.PureObject(so)) {\n target[key] = deep ? extend(true, is.PureObject(to) ? to : {}, so) : so;\n } else if (is.Array(so)) {\n target[key] = deep ? extend(true, is.Array(to) ? to : [], so) : so;\n } else {\n target[key] = so;\n }\n }\n });\n }\n // Do nothing\n return target;\n };\n return _copy;\n }\n\n /**\r\n *\r\n * Extend a given object\r\n * @param {Boolean|Object|Array} target - target object or deep mark (default is true)\r\n * @param {Array|Object} source - target object if the first argument represent the deep mark, otherwise the source for merging\r\n * @returns {*}\r\n */\n var extend = exports.extend = _assignGenerator(false);\n var extendOwn = exports.extendOwn = _assignGenerator(true);\n /**\r\n * Check WeiXin environment\r\n */\n function checkWX() {\n return false === true || typeof wx != 'undefined' && (typeof wx === 'undefined' ? 'undefined' : _typeof(wx)) === 'object';\n }\n\n var isWeiXinAPP = exports.isWeiXinAPP = checkWX();\n /**\r\n * Convert (rpx/rem) to px\r\n * @param unit\r\n */\n var rpxReg = /([\\d.]+)rpx/,\n remReg = /([\\d.]+)rem/;\n function wxConverToPx(val) {\n if (!isWeiXinAPP) {\n return Number.parseInt(val);\n }\n\n var windowSize = getWindowSize();\n if (is.String(val)) {\n var m = val.match(rpxReg);\n if (!!m) {\n return +m[1] * windowSize.windowWidth / 750;\n }\n\n m = val.match(remReg);\n if (!!m) {\n return +m[1] * windowSize.windowWidth / 20;\n }\n\n return Number.parseInt(val);\n } else if (is.Number(val)) {\n return val;\n } else {\n throw new Error('Convert px error');\n }\n }\n\n function toRadians(degrees) {\n return degrees * (Math.PI / 180);\n }\n function toDegrees(radians) {\n return radians * (180 / Math.PI);\n }\n /**\r\n * Get window size (px)\r\n * @returns {*}\r\n */\n function getWindowSize() {\n var windowHeight = void 0,\n windowWidth = void 0;\n if (isWeiXinAPP) {\n var ret = wx.getSystemInfoSync();\n windowWidth = ret.windowWidth;\n windowHeight = ret.windowHeight;\n } else {\n windowWidth = window.innerWidth;\n windowHeight = window.innerHeight;\n }\n return { windowWidth: windowWidth, windowHeight: windowHeight };\n };\n\n /**\r\n * Get window's Device Pixel Ratio\r\n */\n function getDPR() {\n if (isWeiXinAPP) {\n var ret = wx.getSystemInfoSync();\n return ret.pixelRatio;\n } else {\n return window.devicePixelRatio || 1;\n }\n };\n\n var uid = exports.uid = function () {\n var id = 0;\n return function () {\n id++;\n return 'u' + id;\n };\n }();\n\n function niceNum(range, round) {\n var exponent = Math.floor(Math.log10(range));\n var fraction = range / Math.pow(10, exponent);\n var niceFraction = void 0;\n\n if (round) {\n if (fraction < 1.5) {\n niceFraction = 1;\n } else if (fraction < 3) {\n niceFraction = 2;\n } else if (fraction < 7) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n } else if (fraction <= 1.0) {\n niceFraction = 1;\n } else if (fraction <= 2) {\n niceFraction = 2;\n } else if (fraction <= 5) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n\n return niceFraction * Math.pow(10, exponent);\n }\n\n function almostEquals(a, b, epsilon) {\n return Math.abs(a - b) < epsilon;\n }\n\n function splineCurve(firstPoint, middlePoint, afterPoint) {\n var t = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.4;\n\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n var previous = !firstPoint ? middlePoint : firstPoint,\n current = middlePoint,\n next = !afterPoint ? middlePoint : afterPoint;\n\n var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n var s01 = d01 / (d01 + d12);\n var s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n var fa = t * s01; // scaling factor for triangle Ta\n var fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n }\n\n /**\r\n * Get element style\r\n * @param element\r\n */\n function getStyle(element, property) {\n return element.currentStyle ? element.currentStyle[property] : document.defaultView.getComputedStyle(element, null).getPropertyValue(property);\n }\n /**\r\n * The 'used' size is the final value of a dimension property after all calculations have\r\n * been performed. This method uses the computed style of `element` but returns undefined\r\n * if the computed style is not expressed in pixels. That can happen in some cases where\r\n * `element` has a size relative to its parent and this last one is not yet displayed,\r\n * for example because of `display: none` on a parent node.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\r\n * @param element\r\n * @param property\r\n * @returns {Number} Size in pixels or undefined if unknown.\r\n */\n function readUsedSize(element, property) {\n var value = getStyle(element, property);\n var matches = value && value.match(/(\\d+)px/);\n return matches ? Number(matches[1]) : undefined;\n }\n /**\r\n * For retina screen\r\n * @param ctx\r\n * @param width\r\n * @param height\r\n */\n function retinaScale(ctx, width, height) {\n var pixelRatio = getDPR();\n if (pixelRatio === 1) {\n return;\n }\n\n var canvas = ctx.canvas;\n if (isWeiXinAPP) {\n // Do I resize the height or width?\n } else {\n canvas.height = canvas.height * pixelRatio;\n canvas.width = canvas.width * pixelRatio;\n ctx.scale(pixelRatio, pixelRatio);\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the 'correct' values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n canvas.style.height = height + 'px';\n canvas.style.width = width + 'px';\n }\n }\n }, {}], 26: [function (require, module, exports) {\n (function (global) {\n /* global module, wx, getApp, window: false, global:false, document: false */\n 'use strict';\n\n /**\r\n * Modify from RAF(https://github.com/chrisdickinson/raf)\r\n *\r\n */\n\n var _helper = require('../util/helper');\n\n var now = require('performance-now');\n var root = void 0,\n isWx = (0, _helper.checkWX)();\n root = isWx ? {} : typeof window === 'undefined' ? global : window;\n\n var vendors = ['moz', 'webkit'],\n suffix = 'AnimationFrame',\n raf = root['request' + suffix],\n caf = root['cancel' + suffix] || root['cancelRequest' + suffix];\n\n for (var i = 0; !raf && i < vendors.length; i++) {\n raf = root[vendors[i] + 'Request' + suffix];\n caf = root[vendors[i] + 'Cancel' + suffix] || root[vendors[i] + 'CancelRequest' + suffix];\n }\n\n // Some versions of FF have rAF but not cAF\n if (!raf || !caf) {\n (function () {\n var last = 0,\n id = 0,\n queue = [],\n frameDuration = 1000 / 60;\n\n raf = function raf(callback) {\n if (queue.length === 0) {\n var _now = now(),\n next = Math.max(0, frameDuration - (_now - last));\n last = next + _now;\n setTimeout(function () {\n var cp = queue.slice(0);\n // Clear queue here to prevent\n // callbacks from appending listeners\n // to the current frame's queue\n queue.length = 0;\n for (var _i = 0; _i < cp.length; _i++) {\n if (!cp[_i].cancelled) {\n try {\n cp[_i].callback(last);\n } catch (e) {\n setTimeout(function () {\n throw e;\n }, 0);\n }\n }\n }\n }, Math.round(next));\n }\n queue.push({\n handle: ++id,\n callback: callback,\n cancelled: false\n });\n return id;\n };\n\n caf = function caf(handle) {\n for (var _i2 = 0; _i2 < queue.length; _i2++) {\n if (queue[_i2].handle === handle) {\n queue[_i2].cancelled = true;\n }\n }\n };\n })();\n }\n\n module.exports = function (fn) {\n // Wrap in a new function to prevent\n // `cancel` potentially being assigned\n // to the native rAF function\n return raf.call(root, fn);\n };\n module.exports._root = root;\n module.exports.cancel = function () {\n caf.apply(root, arguments);\n };\n module.exports.polyfill = function () {\n root.requestAnimationFrame = raf;\n root.cancelAnimationFrame = caf;\n };\n }).call(this, typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {});\n }, { \"../util/helper\": 25, \"performance-now\": 8 }], 27: [function (require, module, exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n // Modified from randomColor by David Merfield under the CC0 license\n // https://github.com/davidmerfield/randomColor/\n\n var seed = null;\n\n // Shared color dictionary\n var colorDictionary = {};\n\n // Populate the color dictionary\n loadColorBounds();\n\n var randomColor = function randomColor(options) {\n\n options = options || {};\n\n // Check if there is a seed and ensure it's an\n // integer. Otherwise, reset the seed value.\n if (options.seed !== undefined && options.seed !== null && options.seed === parseInt(options.seed, 10)) {\n seed = options.seed;\n\n // A string was passed as a seed\n } else if (typeof options.seed === 'string') {\n seed = stringToInteger(options.seed);\n\n // Something was passed as a seed but it wasn't an integer or string\n } else if (options.seed !== undefined && options.seed !== null) {\n throw new TypeError('The seed value must be an integer or string');\n\n // No seed, reset the value outside.\n } else {\n seed = null;\n }\n\n var H = void 0,\n S = void 0,\n B = void 0;\n\n // Check if we need to generate multiple colors\n if (options.count !== null && options.count !== undefined) {\n\n var totalColors = options.count,\n colors = [];\n\n options.count = null;\n\n while (totalColors > colors.length) {\n\n // Since we're generating multiple colors,\n // incremement the seed. Otherwise we'd just\n // generate the same color each time...\n if (seed && options.seed) options.seed += 1;\n\n colors.push(randomColor(options));\n }\n\n options.count = totalColors;\n\n return colors;\n }\n\n // First we pick a hue (H)\n H = pickHue(options);\n\n // Then use H to determine saturation (S)\n S = pickSaturation(H, options);\n\n // Then use S and H to determine brightness (B).\n B = pickBrightness(H, S, options);\n\n // Then we return the HSB color in the desired format\n return setFormat([H, S, B], options);\n };\n\n function pickHue(options) {\n\n var hueRange = getHueRange(options.hue),\n hue = randomWithin(hueRange);\n\n // Instead of storing red as two seperate ranges,\n // we group them, using negative numbers\n if (hue < 0) {\n hue = 360 + hue;\n }\n\n return hue;\n }\n\n function pickSaturation(hue, options) {\n\n if (options.luminosity === 'random') {\n return randomWithin([0, 100]);\n }\n\n if (options.hue === 'monochrome') {\n return 0;\n }\n\n var saturationRange = getSaturationRange(hue);\n\n var sMin = saturationRange[0],\n sMax = saturationRange[1];\n\n switch (options.luminosity) {\n\n case 'bright':\n sMin = 55;\n break;\n\n case 'dark':\n sMin = sMax - 10;\n break;\n\n case 'light':\n sMax = 55;\n break;\n }\n\n return randomWithin([sMin, sMax]);\n }\n\n function pickBrightness(H, S, options) {\n\n var bMin = getMinimumBrightness(H, S),\n bMax = 100;\n\n switch (options.luminosity) {\n\n case 'dark':\n bMax = bMin + 20;\n break;\n\n case 'light':\n bMin = (bMax + bMin) / 2;\n break;\n\n case 'random':\n bMin = 0;\n bMax = 100;\n break;\n }\n\n return randomWithin([bMin, bMax]);\n }\n\n function setFormat(hsv, options) {\n\n switch (options.format) {\n\n case 'hsvArray':\n return hsv;\n\n case 'hslArray':\n return HSVtoHSL(hsv);\n\n case 'hsl':\n var hsl = HSVtoHSL(hsv);\n return 'hsl(' + hsl[0] + ', ' + hsl[1] + '%, ' + hsl[2] + '%)';\n\n case 'hsla':\n var hslColor = HSVtoHSL(hsv);\n var alpha = options.alpha || Math.random();\n return 'hsla(' + hslColor[0] + ', ' + hslColor[1] + '%, ' + hslColor[2] + '%, ' + alpha + ')';\n\n case 'rgbArray':\n return HSVtoRGB(hsv);\n\n case 'rgb':\n var rgb = HSVtoRGB(hsv);\n return 'rgb(' + rgb.join(', ') + ')';\n\n case 'rgba':\n var rgbColor = HSVtoRGB(hsv);\n var alpha = options.alpha || Math.random();\n return 'rgba(' + rgbColor.join(', ') + ', ' + alpha + ')';\n\n default:\n return HSVtoHex(hsv);\n }\n }\n\n function getMinimumBrightness(H, S) {\n\n var lowerBounds = getColorInfo(H).lowerBounds;\n\n for (var i = 0; i < lowerBounds.length - 1; i++) {\n\n var s1 = lowerBounds[i][0],\n v1 = lowerBounds[i][1];\n\n var s2 = lowerBounds[i + 1][0],\n v2 = lowerBounds[i + 1][1];\n\n if (S >= s1 && S <= s2) {\n\n var m = (v2 - v1) / (s2 - s1),\n b = v1 - m * s1;\n\n return m * S + b;\n }\n }\n\n return 0;\n }\n\n function getHueRange(colorInput) {\n\n if (typeof parseInt(colorInput) === 'number') {\n\n var number = parseInt(colorInput);\n\n if (number < 360 && number > 0) {\n return [number, number];\n }\n }\n\n if (typeof colorInput === 'string') {\n\n if (colorDictionary[colorInput]) {\n var color = colorDictionary[colorInput];\n if (color.hueRange) {\n return color.hueRange;\n }\n }\n }\n\n return [0, 360];\n }\n\n function getSaturationRange(hue) {\n return getColorInfo(hue).saturationRange;\n }\n\n function getColorInfo(hue) {\n\n // Maps red colors to make picking hue easier\n if (hue >= 334 && hue <= 360) {\n hue -= 360;\n }\n\n for (var colorName in colorDictionary) {\n var color = colorDictionary[colorName];\n if (color.hueRange && hue >= color.hueRange[0] && hue <= color.hueRange[1]) {\n return colorDictionary[colorName];\n }\n }\n return 'Color not found';\n }\n\n function randomWithin(range) {\n if (seed === null) {\n return Math.floor(range[0] + Math.random() * (range[1] + 1 - range[0]));\n } else {\n //Seeded random algorithm from http://indiegamr.com/generate-repeatable-random-numbers-in-js/\n var max = range[1] || 1;\n var min = range[0] || 0;\n seed = (seed * 9301 + 49297) % 233280;\n var rnd = seed / 233280.0;\n return Math.floor(min + rnd * (max - min));\n }\n }\n\n function HSVtoHex(hsv) {\n\n var rgb = HSVtoRGB(hsv);\n\n function componentToHex(c) {\n var hex = c.toString(16);\n return hex.length == 1 ? '0' + hex : hex;\n }\n\n var hex = '#' + componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);\n\n return hex;\n }\n\n function defineColor(name, hueRange, lowerBounds) {\n\n var sMin = lowerBounds[0][0],\n sMax = lowerBounds[lowerBounds.length - 1][0],\n bMin = lowerBounds[lowerBounds.length - 1][1],\n bMax = lowerBounds[0][1];\n\n colorDictionary[name] = {\n hueRange: hueRange,\n lowerBounds: lowerBounds,\n saturationRange: [sMin, sMax],\n brightnessRange: [bMin, bMax]\n };\n }\n\n function loadColorBounds() {\n\n defineColor('monochrome', null, [[0, 0], [100, 0]]);\n\n defineColor('red', [-26, 18], [[20, 100], [30, 92], [40, 89], [50, 85], [60, 78], [70, 70], [80, 60], [90, 55], [100, 50]]);\n\n defineColor('orange', [19, 46], [[20, 100], [30, 93], [40, 88], [50, 86], [60, 85], [70, 70], [100, 70]]);\n\n defineColor('yellow', [47, 62], [[25, 100], [40, 94], [50, 89], [60, 86], [70, 84], [80, 82], [90, 80], [100, 75]]);\n\n defineColor('green', [63, 178], [[30, 100], [40, 90], [50, 85], [60, 81], [70, 74], [80, 64], [90, 50], [100, 40]]);\n\n defineColor('blue', [179, 257], [[20, 100], [30, 86], [40, 80], [50, 74], [60, 60], [70, 52], [80, 44], [90, 39], [100, 35]]);\n\n defineColor('purple', [258, 282], [[20, 100], [30, 87], [40, 79], [50, 70], [60, 65], [70, 59], [80, 52], [90, 45], [100, 42]]);\n\n defineColor('pink', [283, 334], [[20, 100], [30, 90], [40, 86], [60, 84], [80, 80], [90, 75], [100, 73]]);\n }\n\n function HSVtoRGB(hsv) {\n\n // this doesn't work for the values of 0 and 360\n // here's the hacky fix\n var h = hsv[0];\n if (h === 0) {\n h = 1;\n }\n if (h === 360) {\n h = 359;\n }\n\n // Rebase the h,s,v values\n h = h / 360;\n var s = hsv[1] / 100,\n v = hsv[2] / 100;\n\n var h_i = Math.floor(h * 6),\n f = h * 6 - h_i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n r = 256,\n g = 256,\n b = 256;\n\n switch (h_i) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n var result = [Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)];\n return result;\n }\n\n function HSVtoHSL(hsv) {\n var h = hsv[0],\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n k = (2 - s) * v;\n\n return [h, Math.round(s * v / (k < 1 ? k : 2 - k) * 10000) / 100, k / 2 * 100];\n }\n\n function stringToInteger(string) {\n var total = 0;\n for (var i = 0; i !== string.length; i++) {\n if (total >= Number.MAX_SAFE_INTEGER) break;\n total += string.charCodeAt(i);\n }\n return total;\n }\n\n exports.default = randomColor;\n }, {}], 28: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n /**\r\n * Clone from https://github.com/jaxgeller/tweezer.js/blob/master/src/tweezer.js\r\n * Remove the 'Global reference: window'\r\n */\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var raf = require('./raf');\n\n var Tweezer = function () {\n function Tweezer() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, Tweezer);\n\n this.duration = opts.duration || 1000;\n this.ease = opts.easing || this._defaultEase;\n this.start = opts.start;\n this.end = opts.end;\n\n this.frame = null;\n this.next = null;\n this.isRunning = false;\n this.events = {};\n this.direction = this.start < this.end ? 'up' : 'down';\n }\n\n _createClass(Tweezer, [{\n key: 'begin',\n value: function begin() {\n if (!this.isRunning && this.next !== this.end) {\n this.frame = raf(this._tick.bind(this));\n }\n return this;\n }\n }, {\n key: 'stop',\n value: function stop() {\n raf.cancel(this.frame);\n this.isRunning = false;\n this.frame = null;\n this.timeStart = null;\n this.next = null;\n return this;\n }\n }, {\n key: 'on',\n value: function on(name, handler) {\n this.events[name] = this.events[name] || [];\n this.events[name].push(handler);\n return this;\n }\n }, {\n key: 'off',\n value: function off(name, handler) {\n if (!this.events[name]) {\n return this;\n }\n\n if (!handler) {\n this.events[name] = [];\n } else {\n var query = this.events[name];\n var index = query.findIndex(function (value) {\n return value === handler;\n });\n query.splice(index, 1);\n }\n return this;\n }\n }, {\n key: 'emit',\n value: function emit(name, val) {\n var _this = this;\n\n var e = this.events[name];\n e && e.forEach(function (handler) {\n return handler.call(_this, val);\n });\n }\n }, {\n key: '_tick',\n value: function _tick(currentTime) {\n this.isRunning = true;\n\n var lastTick = this.next || this.start;\n\n if (!this.timeStart) this.timeStart = currentTime;\n this.timeElapsed = currentTime - this.timeStart;\n this.next = Math.round(this.ease(this.timeElapsed, this.start, this.end - this.start, this.duration));\n\n if (this._shouldTick(lastTick)) {\n this.emit('tick', this.next);\n this.frame = raf(this._tick.bind(this));\n } else {\n this.emit('tick', this.end);\n this.emit('done', null);\n }\n }\n }, {\n key: '_shouldTick',\n value: function _shouldTick(lastTick) {\n return {\n up: this.next < this.end && lastTick <= this.next,\n down: this.next > this.end && lastTick >= this.next\n }[this.direction];\n }\n }, {\n key: '_defaultEase',\n value: function _defaultEase(t, b, c, d) {\n if ((t /= d / 2) < 1) return c / 2 * t * t + b;\n return -c / 2 * (--t * (t - 2) - 1) + b;\n }\n }]);\n\n return Tweezer;\n }();\n\n exports.default = Tweezer;\n }, { \"./raf\": 26 }], 29: [function (require, module, exports) {\n /* global module, wx, window: false, document: false */\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.WxCanvasRenderingContext2D = undefined;\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n var _helper = require('./helper');\n\n function _toConsumableArray(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }return arr2;\n } else {\n return Array.from(arr);\n }\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n // Chart default config\n var WX_CANVAS_DEFAULT_PROPERTY = {\n width: 300,\n height: 200\n };\n var WX_CANVAS_CTX_DEFAULT_PROPERTY = {\n fillStyle: '#000000',\n lineCap: 'butt',\n lineJoin: 'miter',\n miterLimit: 10,\n lineWidth: 1,\n strokeStyle: '#000000',\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n shadowColor: '#000000',\n font: '10px',\n textBaseline: 'alphabetic', // only support top, middle and alphabetic\n textAlign: 'start' // only support start, end and center\n };\n\n // Base text size\n var WX_BASE_TEXT_SIZE = 9;\n\n var pxReg = /([\\d.]+)px/;\n /**\n * Compatible canvas object\n */\n\n var WxCanvas = function () {\n function WxCanvas(id, config, contextOptions) {\n _classCallCheck(this, WxCanvas);\n\n var me = this;\n\n me.isWeiXinAPP = (0, _helper.checkWX)();\n me._config = (0, _helper.extend)({}, WX_CANVAS_DEFAULT_PROPERTY, me.initConfig(config));\n\n // Acquire canvas context\n\n var _acquireContext = this.acquireContext(id, config),\n canvas = _acquireContext.canvas,\n context = _acquireContext.context;\n\n me._canvas = canvas;\n me._ctx = context;\n me.wxCanvasRenderingContext2D = new WxCanvasRenderingContext2D(canvas, context, contextOptions);\n\n return me;\n }\n\n /**\n * Initialization WxCanvas config\n * @param {Object} config\n * @returns {boolean}\n */\n\n _createClass(WxCanvas, [{\n key: 'initConfig',\n value: function initConfig(config) {\n if (!config) {\n return;\n }\n\n if (typeof config.width != 'undefined') {\n config.width = (0, _helper.wxConverToPx)(config.width);\n }\n if (typeof config.height != 'undefined') {\n config.height = (0, _helper.wxConverToPx)(config.height);\n }\n return config;\n }\n\n /**\n * Create Canvas context\n * @param {String} id\n * @param {Object} config\n * @returns {*}\n */\n\n }, {\n key: 'acquireContext',\n value: function acquireContext(id, config) {\n var me = this,\n canvas = void 0,\n context = void 0;\n // Outer canvas config\n var handlerCanvas = config.canvas;\n\n if (me.isWeiXinAPP) {\n if (_helper.is.String(id)) {\n canvas = context = wx.createCanvasContext(id);\n } else {\n throw new Error('Should set an id');\n }\n } else {\n if (handlerCanvas) canvas = handlerCanvas;else canvas = _helper.is.String(id) ? document.getElementById(id) : typeof HTMLCanvasElement != 'undefined' && id instanceof HTMLCanvasElement ? id : null;\n if (typeof canvas != 'undefined') {\n context = canvas.getContext && canvas.getContext('2d');\n }\n }\n\n if (!canvas || !context) {\n console.error(\"Failed to create WxCanvas: can't acquire context!\");\n }\n\n this.initCanvas(canvas);\n return { canvas: canvas, context: context };\n }\n\n /**\n * Initializes the HTMLCanvasElement style and render size without modifying the canvas display size\n */\n\n }, {\n key: 'initCanvas',\n value: function initCanvas(canvas) {\n var config = this._config,\n renderHeight = void 0,\n renderWidth = void 0,\n display = void 0,\n height = void 0,\n width = void 0;\n height = config.height;\n width = config.width;\n\n if (this.isWeiXinAPP) {\n renderHeight = height;\n renderWidth = width;\n display = config.display;\n } else {\n var style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n renderHeight = canvas.getAttribute('height');\n renderWidth = canvas.getAttribute('width');\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n\n if (renderWidth === null || renderWidth === '') {\n var displayWidth = width || (0, _helper.readUsedSize)(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n width = displayWidth;\n }\n }\n\n if (renderHeight === null || renderHeight === '') {\n if (!height && canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = height = canvas.width / (config.aspectRatio || 2);\n } else {\n var displayHeight = height || (0, _helper.readUsedSize)(canvas, 'height');\n if (displayWidth !== undefined) {\n canvas.height = displayHeight;\n height = displayHeight;\n }\n }\n }\n }\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n config._wxChart = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: display,\n height: height,\n width: width\n }\n }\n };\n\n return canvas;\n }\n\n /**\n * Restores the canvas initial state, such as render/display sizes and style.\n */\n\n }, {\n key: 'releaseContext',\n value: function releaseContext() {\n var canvas = this._canvas,\n config = this._config;\n if (!config._wxChart) {\n return;\n }\n\n var initial = config._wxChart.initial;\n if (this.isWeiXinAPP) {\n // Do nothing\n } else {\n ['height', 'width'].forEach(function (prop) {\n var value = initial[prop];\n if (value === undefined || value === null) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n var style = initial.style;\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = Object.keys(style)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var key = _step.value;\n\n canvas.style[key] = style[key];\n }\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n canvas.width = canvas.width;\n }\n\n delete config._wxChart;\n }\n }, {\n key: 'getContext',\n value: function getContext(str) {\n if (str === '2d') {\n return this.wxCanvasRenderingContext2D;\n }\n }\n\n // Property\n\n }, {\n key: 'height',\n get: function get() {\n if (this.isWeiXinAPP) {\n return this._config.height;\n } else {\n var renderHeight = (0, _helper.wxConverToPx)(this._canvas.getAttribute('height'));\n if (renderHeight === null || renderHeight === '') {\n return (0, _helper.readUsedSize)(canvas, 'height');\n }\n return renderHeight;\n }\n },\n set: function set(val) {\n if (this.isWeiXinAPP) {\n // Can not set WeiXin app height\n } else {\n this._canvas.height = val;\n }\n }\n }, {\n key: 'width',\n get: function get() {\n if (this.isWeiXinAPP) {\n return this._config.width;\n } else {\n var renderWidth = (0, _helper.wxConverToPx)(this._canvas.getAttribute('width'));\n if (renderWidth === null || renderWidth === '') {\n return (0, _helper.readUsedSize)(canvas, 'width');\n }\n return renderWidth;\n }\n },\n set: function set(val) {\n if (this.isWeiXinAPP) {\n // Can not set WeiXin app height\n } else {\n this._canvas.width = val;\n }\n }\n }]);\n\n return WxCanvas;\n }();\n\n exports.default = WxCanvas;\n\n var WxCanvasRenderingContext2D = exports.WxCanvasRenderingContext2D = function () {\n function WxCanvasRenderingContext2D(canvas, context, options) {\n _classCallCheck(this, WxCanvasRenderingContext2D);\n\n var me = this;\n\n me.canvas = canvas;\n me._ctx = context;\n me.isWeiXinAPP = (0, _helper.checkWX)();\n\n // Canvas property cache stack\n me._ctxOptions = options;\n me._propertyCache = [(0, _helper.extend)({}, WX_CANVAS_CTX_DEFAULT_PROPERTY, options)];\n me.cp = me._propertyCache[0];\n\n me.createStyleProperty();\n me.createShadowsProperty();\n me.createTextProperty();\n me.createLineProperty();\n me.createRectProperty();\n me.createGradientProperty();\n me.createPathProperty();\n me.createTransformationProperty();\n me.createGlobalAlphaProperty();\n return me;\n }\n\n // Save function\n\n\n _createClass(WxCanvasRenderingContext2D, [{\n key: 'save',\n value: function save() {\n var me = this;\n me._ctx.save();\n var nProperty = (0, _helper.extend)({}, WX_CANVAS_CTX_DEFAULT_PROPERTY, me._ctxOptions);\n me._propertyCache.push(nProperty);\n me.cp = nProperty;\n return me.cp;\n }\n\n // Restore function\n\n }, {\n key: 'restore',\n value: function restore() {\n var me = this;\n me._ctx.restore();\n if (me.cp != null && me._propertyCache.length > 1) {\n me._propertyCache.pop();\n me.cp = me._propertyCache[me._propertyCache.length - 1];\n }\n return me.cp;\n }\n\n // Property\n\n }, {\n key: '_wxSetPropertyCallable',\n value: function _wxSetPropertyCallable(value, propertyName) {\n var wxSetName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'set' + propertyName.replace(/(\\w)/, function (v) {\n return v.toUpperCase();\n });\n\n var me = this;\n\n if (_helper.is.Null(value) || _helper.is.Undefined(value)) {\n return value;\n }\n\n //performance\n if (me.cp[propertyName] === value) {\n return value;\n }\n\n if (me.isWeiXinAPP) {\n me._ctx[wxSetName](value);\n me.cp[propertyName] = value;\n } else {\n me._ctx[propertyName] = value;\n me.cp[propertyName] = me._ctx[propertyName];\n }\n return value;\n }\n\n // Normally property weixin app not support\n\n }, {\n key: '_wxSetProperty',\n value: function _wxSetProperty(value, propertyName) {\n var setWX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var me = this;\n\n if (_helper.is.Null(value) || _helper.is.Undefined(value)) {\n return value;\n }\n\n //performance\n if (me.cp[propertyName] === value) {\n return value;\n }\n\n if (me.isWeiXinAPP) {\n me.cp[propertyName] = value;\n setWX ? me._ctx[propertyName] = value : null;\n } else {\n me._ctx[propertyName] = value;\n me.cp[propertyName] = me._ctx[propertyName];\n }\n return value;\n }\n }, {\n key: 'createStyleProperty',\n value: function createStyleProperty() {\n var me = this;\n\n var styleProperty = ['fillStyle', 'strokeStyle'];\n styleProperty.forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n if (value) {\n return me._wxSetPropertyCallable(value.toLowerCase(), p);\n }\n }\n });\n });\n }\n }, {\n key: 'createShadowsProperty',\n value: function createShadowsProperty() {\n var _this = this;\n\n var me = this;\n // Shadow property\n ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'shadowColor'].forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n var me = _this;\n // performance\n if (me.cp[p] === value) {\n return;\n }\n\n if (me.isWeiXinAPP) {\n me.cp[p] = value;\n me._ctx.setShadow(me.cp['shadowOffsetX'] || 0, me.cp['shadowOffsetY'] || 0, me.cp['shadowBlur'] || 0, me.cp['shadowColor'] || '#000000');\n } else if (!_helper.is.Null(value) && !_helper.is.Undefined(value)) {\n me._ctx[p] = value;\n me.cp[p] = value;\n }\n return value;\n }\n });\n });\n }\n\n // Text property\n\n }, {\n key: 'createTextProperty',\n value: function createTextProperty() {\n var me = this;\n\n ['textAlign', 'textBaseline'].forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n return me._wxSetProperty(value, p);\n }\n });\n });\n\n Object.defineProperty(me, 'font', {\n get: function get() {\n return me.cp.font;\n },\n set: function set(value) {\n if (me.isWeiXinAPP) {\n var m = value.match(pxReg);\n if (!!m && me.cp.font !== value) {\n var fontSize = +m[1];\n me._ctx.setFontSize(fontSize);\n me.cp.font = value;\n }\n } else {\n if (me.cp.font !== value) {\n me._ctx.font = value;\n me.cp.font = value;\n }\n }\n return me.cp.font;\n }\n });\n\n Object.defineProperty(me, 'fontSize', {\n get: function get() {\n return parseInt(me.cp.font);\n },\n set: function set(value) {\n var fontSize = parseInt(value);\n if (_helper.is.NaN(fontSize)) {\n return;\n }\n\n var currentFont = me.isWeiXinAPP ? me.cp.font : me._ctx.font;\n currentFont = currentFont.replace(pxReg, fontSize + 'px');\n if (currentFont === me.cp.font) {\n return me.cp.font;\n }\n if (me.isWeiXinAPP) {\n me._ctx.setFontSize(fontSize);\n me.cp.font = currentFont;\n } else {\n me._ctx.font = currentFont;\n me.cp.font = currentFont;\n }\n return me.cp.font;\n }\n });\n }\n // Wrapper 'measureText' function for WeiXin APP\n\n }, {\n key: 'measureText',\n value: function measureText(text) {\n var fontSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.fontSize;\n\n var me = this;\n if (me.isWeiXinAPP) {\n if (!text) {\n return 0;\n }\n var textLen = text.length;\n var hanzi = text.match(new RegExp(_helper.REG_HANZI, 'g'));\n var hanziNum = !!hanzi ? hanzi.length : 0;\n var otherNum = textLen - hanziNum;\n\n return {\n 'width': fontSize * (otherNum + hanziNum * 2) / 2 + fontSize / 4\n };\n } else {\n return me._ctx.measureText(text);\n }\n }\n }, {\n key: '_calculateYForTextBaseline',\n value: function _calculateYForTextBaseline(y, text) {\n var baseNum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : WX_BASE_TEXT_SIZE;\n\n var me = this,\n culY = y;\n\n if (!me.isWeiXinAPP) {\n return culY;\n }\n\n var fontSize = me.fontSize;\n var textBaseline = me.textBaseline;\n switch (textBaseline) {\n case 'top':\n culY = fontSize * baseNum / 10 + y;\n break;\n case 'middle':\n culY = fontSize * baseNum / 20 + y;\n break;\n case 'alphabetic':\n break;\n }\n return culY;\n }\n }, {\n key: '_calculateXFortextAlign',\n value: function _calculateXFortextAlign(x, text) {\n var baseNum = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : WX_BASE_TEXT_SIZE;\n\n var me = this,\n culX = x;\n if (!me.isWeiXinAPP) {\n return culX;\n }\n\n var textAlign = me.textAlign;\n switch (textAlign) {\n case 'end':\n culX = x - me.measureText(text).width;\n break;\n case 'center':\n culX = x - me.measureText(text).width / 2;\n break;\n case 'start':\n break;\n }\n return culX;\n }\n /**\n * Overwrite fillText\n * Weixin 0.12 not support 'textBaseline', 'textAlign' attribute, so we should figure out it.\n * @param text\n * @param x\n * @param y\n * @param options - [maxWidth, baseNum = WX_BASE_TEXT_SIZE]\n * @returns {*}\n */\n\n }, {\n key: 'fillText',\n value: function fillText(text, x, y) {\n for (var _len = arguments.length, options = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n options[_key - 3] = arguments[_key];\n }\n\n var me = this,\n maxWidth = 0 in options ? options[0] : undefined,\n baseNum = 1 in options ? options[1] : WX_BASE_TEXT_SIZE;\n if (me.isWeiXinAPP) {\n var culX = void 0,\n culY = void 0;\n culY = me._calculateYForTextBaseline(y, text, baseNum);\n culX = me._calculateXFortextAlign(x, text, baseNum);\n return me._ctx.fillText(text, culX, culY);\n } else {\n return me._ctx.fillText(text, x, y, maxWidth);\n }\n }\n }, {\n key: 'strokeText',\n value: function strokeText(text, x, y) {\n var me = this;\n\n for (var _len2 = arguments.length, options = Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {\n options[_key2 - 3] = arguments[_key2];\n }\n\n if (me.isWeiXinAPP) {\n return me.fillText.apply(me, [text, x, y].concat(options));\n } else {\n var _me$_ctx;\n\n return (_me$_ctx = me._ctx).strokeText.apply(_me$_ctx, [text, x, y].concat(options));\n }\n }\n\n // Line property\n\n }, {\n key: 'createLineProperty',\n value: function createLineProperty() {\n var me = this;\n var smProperty = ['lineCap', 'lineJoin', 'miterLimit', 'lineWidth'];\n smProperty.forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n return me._wxSetPropertyCallable(value, p);\n }\n });\n });\n\n ['lineDashOffset'].forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n return me._wxSetProperty(value, p);\n }\n });\n });\n }\n }, {\n key: 'setLineDash',\n value: function setLineDash() {}\n }, {\n key: 'getLineDash',\n value: function getLineDash() {}\n\n // Drawing rectangles\n\n }, {\n key: 'createRectProperty',\n value: function createRectProperty() {\n var me = this;\n ['clearRect', 'fillRect', 'strokeRect'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx2;\n\n return (_me$_ctx2 = me._ctx)[functionName].apply(_me$_ctx2, arguments);\n };\n });\n }\n\n // Gradient\n\n }, {\n key: 'createGradientProperty',\n value: function createGradientProperty() {\n var me = this;\n ['createLinearGradient'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx3;\n\n return (_me$_ctx3 = me._ctx)[functionName].apply(_me$_ctx3, arguments);\n };\n });\n }\n }, {\n key: 'createRadialGradient',\n value: function createRadialGradient(x0, y0, r0, x1, y1, r1) {\n var me = this;\n if (me.isWeiXinAPP) {\n return me._ctx.createCircularGradient(x0, y0, r0);\n } else {\n return me._ctx.createRadialGradient(x0, y0, r0, x1, y1, r1);\n }\n }\n\n // Paths and Drawing paths\n\n }, {\n key: 'createPathProperty',\n value: function createPathProperty() {\n var me = this;\n ['beginPath', 'closePath', 'moveTo', 'lineTo', 'bezierCurveTo', 'quadraticCurveTo', 'arc', 'rect'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx4;\n\n return (_me$_ctx4 = me._ctx)[functionName].apply(_me$_ctx4, arguments);\n };\n });\n\n ['fill', 'stroke'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx5;\n\n return (_me$_ctx5 = me._ctx)[functionName].apply(_me$_ctx5, arguments);\n };\n });\n }\n }, {\n key: 'clip',\n value: function clip() {\n var me = this;\n if (me.isWeiXinAPP) {\n throw new Error('WeiXin APP not support \"clip\" function yet!');\n } else {\n var _me$_ctx6;\n\n return (_me$_ctx6 = me._ctx).clip.apply(_me$_ctx6, arguments);\n }\n }\n\n // Transformations\n\n }, {\n key: 'createTransformationProperty',\n value: function createTransformationProperty() {\n var me = this;\n ['rotate', 'scale', 'translate'].forEach(function (functionName) {\n me[functionName] = function () {\n var _me$_ctx7;\n\n return (_me$_ctx7 = me._ctx)[functionName].apply(_me$_ctx7, arguments);\n };\n });\n }\n }, {\n key: 'transform',\n value: function transform() {\n var me = this;\n if (me.isWeiXinAPP) {\n throw new Error('WeiXin APP not support \"transform\" function yet!');\n } else {\n var _me$_ctx8;\n\n return (_me$_ctx8 = me._ctx).transform.apply(_me$_ctx8, _toConsumableArray(args));\n }\n }\n\n // globalAlpha\n\n }, {\n key: 'createGlobalAlphaProperty',\n value: function createGlobalAlphaProperty() {\n var me = this;\n ['globalAlpha'].forEach(function (p) {\n Object.defineProperty(me, p, {\n get: function get() {\n return me.cp[p];\n },\n set: function set(value) {\n return me._wxSetPropertyCallable(value, p);\n }\n });\n });\n }\n // Draw function\n\n }, {\n key: 'draw',\n value: function draw() {\n var ctu = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n if (this.isWeiXinAPP) {\n this._ctx.draw(ctu);\n }\n }\n }]);\n\n return WxCanvasRenderingContext2D;\n }();\n }, { \"./helper\": 25 }], 30: [function (require, module, exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.WxBar = exports.WxLiner = exports.WxDoughnut = exports.WxChart = exports.getChartInstances = undefined;\n\n var _wxChart = require('./charts/wxChart');\n\n var _wxChart2 = _interopRequireDefault(_wxChart);\n\n var _doughnut = require('./charts/doughnut');\n\n var _doughnut2 = _interopRequireDefault(_doughnut);\n\n var _liner = require('./charts/liner');\n\n var _liner2 = _interopRequireDefault(_liner);\n\n var _bar = require('./charts/bar');\n\n var _bar2 = _interopRequireDefault(_bar);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n }\n\n exports.getChartInstances = _wxChart.getChartInstances;\n exports.WxChart = _wxChart2.default;\n exports.WxDoughnut = _doughnut2.default;\n exports.WxLiner = _liner2.default;\n exports.WxBar = _bar2.default;\n }, { \"./charts/bar\": 11, \"./charts/doughnut\": 12, \"./charts/liner\": 13, \"./charts/wxChart\": 14 }] }, {}, [30])(30);\n});"]}
\ No newline at end of file
diff --git a/karma.conf.js b/karma.conf.js
index 4f75f9c..b0e001e 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -20,7 +20,7 @@ module.exports = function(config) {
'verdor/**',
'src/**',
'test/**.Spec.js',
- // 'test/chart.wxDoughnut.Spec.js'
+ // 'test/chart.wxBar.Spec.js'
],
diff --git a/package.json b/package.json
index c5f02fb..1823edb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "wx-chart",
- "version": "0.3.2",
+ "version": "0.3.3",
"description": "跨平台微信小程序图形库",
"main": "src/wx-chart.js",
"scripts": {
@@ -100,6 +100,7 @@
"es6-mixins": "^1.0.2",
"ez.js": "^1.0.3",
"mitt": "^1.1.2",
- "performance-now": "^2.1.0"
+ "performance-now": "^2.1.0",
+ "tinycolor2": "^1.4.1"
}
}
diff --git a/src/charts/bar.js b/src/charts/bar.js
index c5d5809..f6e9a57 100644
--- a/src/charts/bar.js
+++ b/src/charts/bar.js
@@ -3,7 +3,6 @@
import mixins from 'es6-mixins';
import {extend, is, splineCurve, shadeBlendConvert} from '../util/helper';
-import tinycolor from '../util/tinycolor';
import randomColor from '../util/randomColor';
import WxCanvas from '../util/wxCanvas';
@@ -18,6 +17,7 @@ import WxLegend from '../core/legend';
import WxLayout, {BoxInstance} from '../core/layout';
import WxAnimation from '../core/animation';
+let tinycolor = require("tinycolor2");
// Bar legend's default config
const WX_BAR_LEGEND_DEFAULT_CONFIG = {
borderWidth: 1,
@@ -82,6 +82,8 @@ const WX_BAR_DEFAULT_CONFIG = {
};
const WX_BAR_ITEM_DEFAULT_CONFIG = {
+ showItem: true,
+ // format: // title format function
//borderWidth: 1,
//fillArea: true,
//fillAlpha: 0.5,
@@ -277,14 +279,16 @@ export default class WxBar extends WxChart {
wxLayout.addBox(me.legend.box);
// Thirdly, draw scale
- me._drawScale();
+ me._drawScale(wxLayout);
+ box = wxLayout.adjustBox();
// Calculate bar ruler
me.barRuler = me.calculateBarRuler();
// Finally, draw bar
let hasNeg = false;
let barConfigs = me.legends.map(function(legend, legendIndex) {
let config = {
+ box: box,
legend: legend
};
let key = legend.key;
@@ -293,7 +297,8 @@ export default class WxBar extends WxChart {
return {
value: data[key],
data: data,
- point: me.calculateBarRect(index, legendIndex)
+ point: me.calculateBarRect(index, legendIndex),
+ index
}
});
return config;
@@ -341,31 +346,39 @@ export default class WxBar extends WxChart {
ctx.restore();
}
- __drawBar = (point, percent, legend, stacked, hasNeg) => {
+ __drawBar = (p, percent, box, legend, stacked, hasNeg, setBarItem) => {
let ctx = this.ctx;
+ let px, py, width, height;
+
+ let { value, data, point, index } = p;
let {
- display,
borderWidth,
fillStyle,
strokeStyle,
fillArea,
fillAlpha
} = legend;
- let px, py, width, height;
- if (!point) {
+ let {
+ showItem,
+ format,
+ label
+ } = data;
+
+ if (!p || !p.point) {
return { px, py, width, height };
}
+ let { x: pointX, y: pointY, barWidth, barHeight } = p.point;
if (stacked && hasNeg) {
- width = point.barWidth;
- height = point.barHeight * percent;
- px = point.x;
- py = point.y + (point.barHeight) / 2 - height / 2;
+ width = barWidth;
+ height = barHeight * percent;
+ px = pointX;
+ py = pointY + barHeight / 2 - height / 2;
} else {
- px = point.x;
- width = point.barWidth;
- height = point.barHeight * percent;
- py = point.y + point.barHeight * (1-percent);
+ px = pointX;
+ width = barWidth;
+ height = barHeight * percent;
+ py = pointY + barHeight * (1-percent);
}
ctx.save();
@@ -395,6 +408,35 @@ export default class WxBar extends WxChart {
ctx.stroke();
}
+ // Show bar item
+ if (!!setBarItem && !!showItem && !stacked) {
+ let curFillStyle = ctx.fillStyle;
+ ctx.textBaseline = "bottom";
+ ctx.fillStyle = tinycolor(curFillStyle).darken(15).toString();
+ ctx.fillStyle = curFillStyle;
+
+ let barItem = is.Function(format)
+ ? format.call(this, label, value, index)
+ : p.value+'';
+
+ let boxX = box.x,
+ boxY = box.y;
+
+ let itemX = px + barWidth/2 - ctx.measureText(barItem).width/2,
+ itemY = py - ctx.fontSize/4;
+
+ // Check box's X,Y
+ if (itemX < box.x) {
+ itemX = box.x;
+ }
+ if (itemY < box.y) {
+ itemY = box.y;
+ }
+
+
+ ctx.fillText(barItem, itemX, itemY);
+ }
+
ctx.draw();
ctx.restore();
@@ -416,7 +458,7 @@ export default class WxBar extends WxChart {
animateOpt = me.chartConfig.animateOptions,
ctx = me.ctx;
- let {legend, dataset} = barData;
+ let {box, legend, dataset} = barData;
let {
display,
borderWidth,
@@ -436,7 +478,8 @@ export default class WxBar extends WxChart {
return (t, lastData, toNext) => {
let dataIndex = Math.floor(t/categoryTicks);
- let { point }= dataIndex < dataLen ? dataset[dataIndex] : dataset[dataLen-1];
+ let currData = dataIndex < dataLen ? dataset[dataIndex] : dataset[dataLen-1];
+ let { point } = currData;
let percent = (t % categoryTicks) / categoryTicks;
if (lastData) {
@@ -452,15 +495,22 @@ export default class WxBar extends WxChart {
if (lastDataIndex < dataLen && lastx) {
ctx.save();
- ctx.beginPath();
// TODO: optimize clear check!!
- ctx.lineWidth = borderWidth;
- ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';
- ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';
- ctx.fillRect(lastx, lasty, lastWidth, lastHeight);
+ if (backgroundColor) {
+ ctx.beginPath();
+ ctx.lineWidth = borderWidth;
+ ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';
+ ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';
+ ctx.fillRect(lastx, lasty, lastWidth, lastHeight);
+ } else {
+ ctx.clearRect(lastx, lasty, lastWidth, lastHeight);
+ }
if (borderWidth) {
ctx.beginPath();
- if (stacked && hasNeg && borderWidth) {
+ ctx.lineWidth = borderWidth+0.5;
+ ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';
+ ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';
+ if (stacked && hasNeg) {
ctx.rect(lastx, lasty, lastWidth, lastHeight);
} else {
ctx.moveTo(lastx, lasty + lastHeight);
@@ -471,21 +521,20 @@ export default class WxBar extends WxChart {
}
ctx.stroke();
}
-
ctx.draw();
ctx.restore();
}
if (lastDataIndex !== dataIndex && !!lastPercent) {
// End the lasted bar
- let { point: lastPoint } = lastDataIndex < dataLen ? dataset[lastDataIndex] : dataset[dataLen-1];
- me.__drawBar(lastPoint, 1, legend, stacked, hasNeg);
+ let lastData = lastDataIndex < dataLen ? dataset[lastDataIndex] : dataset[dataLen-1];
+ me.__drawBar(lastData, 1, box, legend, stacked, hasNeg, true);
}
}
let px, py, width, height;
if (dataIndex < dataLen && (!!percent || !point)) {
- ({px, py, width, height} = me.__drawBar(point, percent, legend, stacked, hasNeg));
+ ({px, py, width, height} = me.__drawBar(currData, percent, box, legend, stacked, hasNeg));
}
return {
@@ -504,7 +553,7 @@ export default class WxBar extends WxChart {
let me = this,
stacked = me.chartConfig.stacked,
ctx = me.ctx;
- let {legend, dataset} = barData;
+ let {box, legend, dataset} = barData;
let {
display,
borderWidth,
@@ -518,14 +567,8 @@ export default class WxBar extends WxChart {
return;
}
-
dataset.forEach(d => {
- let { value, data, point } = d;
- if (!point) {
- return;
- }
-
- me.__drawBar(point, 1, legend, stacked, hasNeg);
+ me.__drawBar(d, 1, box, legend, stacked, hasNeg, true);
// if (stacked && hasNeg) {
// ctx.beginPath();
// ctx.rect(point.x ,point.y ,point.barWidth, point.barHeight);
@@ -726,10 +769,9 @@ export default class WxBar extends WxChart {
*
* @private
*/
- _drawScale() {
+ _drawScale(wxLayout) {
let box,
- me = this,
- wxLayout = me.wxLayout;
+ me = this;
box = wxLayout.adjustBox();
let xDatasets = me.xScaleAxisDatas(),
diff --git a/src/charts/doughnut.js b/src/charts/doughnut.js
index 2fbab39..396013a 100644
--- a/src/charts/doughnut.js
+++ b/src/charts/doughnut.js
@@ -59,6 +59,8 @@ const WX_DOUGHNUT_DEFAULT_CONFIG = {
* legend: [Object] legend options
*/
const WX_DOUGHNUT_ITEM_DEFAULT_CONFIG = {
+ showItem: true,
+ // format: // title format function
display: true,
fontSize: 11,
percentage: 100
@@ -112,7 +114,7 @@ export default class WxDoughnut extends WxChart {
/**
* Update a datesets of chart and reDraw
* @param {Object[]} datasets
- * @param {string} [datasets[].hidden=false] - Display or not.
+ * @param {string} [datasets[].display=true] - Display or not.
* @param {string} datasets[].label - The label text of an dataset.
* @param {function} datasets[].format - The label text format function.
* @param {number} datasets[].value - The value of an dataset.
@@ -179,7 +181,7 @@ export default class WxDoughnut extends WxChart {
let legend = dataset.legend;
if (!legend || is.String(legend)) {
legendDatasets.push({
- hidden: dataset.hidden || false,
+ display: dataset.display,
text: is.String(legend)
? legend
: dataset.label,
@@ -188,7 +190,7 @@ export default class WxDoughnut extends WxChart {
});
} else if (is.PureObject(legend)) {
legendDatasets.push(extend({
- hidden: dataset.hidden
+ display: dataset.display
}, legend));
}
});
@@ -231,6 +233,7 @@ export default class WxDoughnut extends WxChart {
pointY = y + (outerHeight / 2);
let opt = {
+ box,
pointX,
pointY,
innerRadius,
@@ -277,10 +280,10 @@ export default class WxDoughnut extends WxChart {
color,
borderColor,
percentage,
- hidden
+ display
} = dataset;
- if (!!hidden) {
+ if (!display) {
return endAngle;
}
@@ -329,10 +332,11 @@ export default class WxDoughnut extends WxChart {
fontSize,
percentage,
format,
- hidden
+ showItem,
+ display
} = dataset;
- if (!!hidden) {
+ if (!display || !showItem) {
return;
}
@@ -413,6 +417,7 @@ export default class WxDoughnut extends WxChart {
animateOpt = me.chartConfig.animateOptions,
backgroundColor = me.config.backgroundColor;
let {
+ box,
pointX,
pointY,
totalValue,
@@ -430,17 +435,36 @@ export default class WxDoughnut extends WxChart {
// Clear
ctx.save();
ctx.beginPath();
- ctx.fillStyle = backgroundColor ? backgroundColor : '#ffffff';
- ctx.strokeStyle = backgroundColor ? backgroundColor : '#ffffff';
- ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);
- ctx.fill();
- if (borderWidth) {
- ctx.beginPath();
- ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);
- ctx.lineJoin = 'bevel';
- ctx.lineWidth = borderWidth;
- ctx.stroke();
+
+
+ let bdWidth = borderWidth||0;
+ if (backgroundColor) {
+ ctx.fillStyle = backgroundColor;
+ ctx.strokeStyle = backgroundColor;
+ ctx.fillRect(
+ box.x,
+ box.y,
+ box.outerWidth,
+ box.outerHeight
+ )
+ } else {
+ ctx.clearRect(
+ box.x,
+ box.y,
+ box.outerWidth,
+ box.outerHeight
+ );
}
+
+ // ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);
+ // ctx.fill();
+ // if (borderWidth) {
+ // ctx.beginPath();
+ // ctx.arc(pointX, pointY, outerRadius, 0, totalAngle);
+ // ctx.lineJoin = 'bevel';
+ // ctx.lineWidth = borderWidth;
+ // ctx.stroke();
+ // }
ctx.draw();
if (animateOpt.end === t) {
diff --git a/src/charts/liner.js b/src/charts/liner.js
index c472273..9d77f30 100644
--- a/src/charts/liner.js
+++ b/src/charts/liner.js
@@ -17,8 +17,7 @@ import WxLegend from '../core/legend';
import WxLayout, {BoxInstance} from '../core/layout';
import WxAnimation from '../core/animation';
let Bezier = require('bezier-js');
-
-
+let tinycolor = require("tinycolor2");
// Line legend's default config
const WX_LINE_LEGEND_DEFAULT_CONFIG = {
@@ -78,6 +77,8 @@ const WX_LINER_DEFAULT_CONFIG = {
};
const WX_LINER_ITEM_DEFAULT_CONFIG = {
+ showItem: true,
+ // format: // title format function
pointRadius: 2,
pointStyle: 'circle', // Support triangle, rect and Image object
pointBorderWidth: 1,
@@ -275,11 +276,13 @@ export default class WxLiner extends WxChart {
wxLayout.addBox(me.legend.box);
// Thirdly, draw scale
- me._drawScale();
+ me._drawScale(wxLayout);
+ box = wxLayout.adjustBox();
// Finally, draw line
let lineConfigs = me.legends.map((legend, legendIndex) => {
let config = {
+ box: box,
legend: legend
};
let key = legend.key;
@@ -314,7 +317,7 @@ export default class WxLiner extends WxChart {
});
lineConfigs.reduce((pre, curr) => {
- me.drawLine(curr, pre, lineConfigs);
+ me.drawLine(curr, pre);
return curr;
}, null);
@@ -335,14 +338,15 @@ export default class WxLiner extends WxChart {
}
/**
+ * /**
* Draw the scale of chart
*
+ * @param wxLayout
* @private
*/
- _drawScale() {
+ _drawScale(wxLayout) {
let box,
- me = this,
- wxLayout = me.wxLayout;
+ me = this;
box = wxLayout.adjustBox();
let xDatasets = me.xScaleAxisDatas(),
@@ -503,6 +507,57 @@ export default class WxLiner extends WxChart {
ctx.fill();
ctx.globalAlpha = 1;
};
+
+ _drawPoint = (ctx, box, p) => {
+ if (!p || !p.point) {
+ return;
+ }
+
+ let {pointBorderColor, pointBorderWidth, pointRadius, pointStyle, label, showItem ,format} = p.data;
+ let { x: pointX, y: pointY } = p.point;
+
+ // TODO: pointStyle NOT IMPLEMENT, Only can render line
+ if (pointRadius) {
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, pointRadius, 0, 2 * Math.PI);
+ ctx.fill();
+ }
+
+ if (!!showItem) {
+ let curFillStyle = ctx.fillStyle;
+ ctx.textBaseline = "bottom";
+ ctx.fillStyle = tinycolor(curFillStyle).darken(15).toString();
+ ctx.fillStyle = curFillStyle;
+
+ let barItem = is.Function(format)
+ ? format.call(this, label, p.value, p.index)
+ : p.value+'';
+ let boxX = box.x,
+ boxY = box.y;
+
+ let itemX = pointX - ctx.measureText(barItem).width/2,
+ itemY = pointY - ctx.fontSize/6 - (pointRadius||0) - (pointBorderWidth||0);
+
+ // Check box's X,Y
+ if (itemX < box.x) {
+ itemX = box.x;
+ }
+ if (itemY < box.y) {
+ itemY = pointX + ctx.fontSize/6 + (pointRadius||0) + (pointBorderWidth||0);
+ ctx.textBaseline = "top";
+ }
+
+ ctx.fillText(barItem, itemX, itemY);
+ }
+
+ if (pointBorderWidth) {
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, pointRadius, 0, 2 * Math.PI);
+ ctx.lineWidth = pointBorderWidth;
+ ctx.strokeStyle = pointBorderColor || legend.strokeStyle;
+ ctx.stroke();
+ }
+ };
/**
* Return a animate tick func
* @param lineData
@@ -516,7 +571,7 @@ export default class WxLiner extends WxChart {
animateOpt = me.chartConfig.animateOptions,
ctx = me.ctx;
- let {legend, dataset} = lineData;
+ let {box, legend, dataset} = lineData;
let {
display,
spanGaps,
@@ -609,21 +664,7 @@ export default class WxLiner extends WxChart {
}
if (pret == 0 && pre && pre.point) {
- let {pointBorderColor, pointBorderWidth, pointRadius, pointStyle, label} = pre.data;
- // TODO: pointStyle NOT IMPLEMENT, Only can render line
- if (pointRadius) {
- ctx.beginPath();
- ctx.arc(pre.point.x, pre.point.y, pointRadius, 0, 2 * Math.PI);
- ctx.fill();
- }
-
- if (pointBorderWidth) {
- ctx.beginPath();
- ctx.arc(pre.point.x, pre.point.y, pointRadius, 0, 2 * Math.PI);
- ctx.lineWidth = pointBorderWidth;
- ctx.strokeStyle = pointBorderColor || legend.strokeStyle;
- ctx.stroke();
- }
+ me._drawPoint(ctx, box, extend({}, pre, {showItem:false}));
}
ctx.draw();
@@ -641,19 +682,18 @@ export default class WxLiner extends WxChart {
/**
* Draw one line
* @param {Object} lineData - Line dataset
+ * @param {Object} lineData.box - Draw box config
* @param {Object} lineData.legend - Legend's config
- * @param {Object[]} lineData[].value - Data of each line point
- * @param {Object[]} lineData[].data - The data object
- * @param {Object[]} lineData[].point - The point for rending.
- * @param {Object} preData - Previous line dataset
- * @param {Object} total - All datasets
+ * @param {Object[]} lineData.dataset[].value - Data of each line point
+ * @param {Object[]} lineData.dataset[].data - The data object
+ * @param {Object[]} lineData.dataset[].point - The point for rending.
* @private
*
*/
- _drawLine(lineData, preData , total) {
+ _drawLine(lineData) {
let me = this,
ctx = me.ctx;
- let {legend, dataset} = lineData;
+ let {box, legend, dataset} = lineData;
let {
display,
spanGaps,
@@ -714,13 +754,9 @@ export default class WxLiner extends WxChart {
ctx.beginPath();
// Draw line
- let prePoint,
- pointStack = [];
+ let prePoint;
dataset.forEach((d, index) => {
- let {value, point, data} = d;
- let {pointBorderColor, pointBorderWidth, pointRadius, pointStyle, label} = data;
-
- pointStack.push({point, pointBorderColor, pointBorderWidth, pointRadius, pointStyle});
+ let { point } = d;
if (point) {
this._lineToPoint(prePoint, point, me._getNextPoint(dataset, index, spanGaps), tension);
@@ -737,24 +773,8 @@ export default class WxLiner extends WxChart {
ctx.stroke();
// Draw Point
- pointStack.forEach(p => {
- let {point, pointBorderColor, pointBorderWidth, pointRadius, pointStyle} = p;
- if (!point) {
- return;
- }
-
- ctx.beginPath();
- // TODO: pointStyle NOT IMPLEMENT, Only can render line
- if (pointRadius) {
- ctx.arc(point.x, point.y, pointRadius, 0, 2 * Math.PI);
- ctx.fill();
- }
-
- if (pointBorderWidth) {
- ctx.lineWidth = pointBorderWidth;
- ctx.strokeStyle = pointBorderColor || legend.strokeStyle;
- ctx.stroke();
- }
+ dataset.forEach((d, index) => {
+ me._drawPoint(ctx, box, d);
});
ctx.draw();
@@ -766,16 +786,16 @@ export default class WxLiner extends WxChart {
/**
* Draw one line
* @param {Object} lineData - Line dataset
+ * @param {Object} lineData.box - Draw box config
* @param {Object} lineData.legend - Legend's config
- * @param {Object[]} lineData[].value - Data of each line point
- * @param {Object[]} lineData[].data - The data object
- * @param {Object[]} lineData[].point - The point for rending.
+ * @param {Object[]} lineData.dataset[].value - Data of each line point
+ * @param {Object[]} lineData.dataset[].data - The data object
+ * @param {Object[]} lineData.dataset[].point - The point for rending.
* @param {Object} preData - Previous line dataset
- * @param {Object} total - All datasets
* @private
*
*/
- drawLine(lineData, preData ,total) {
+ drawLine(lineData, preData) {
let me = this,
animate = me.chartConfig.animate,
animateOpt = me.chartConfig.animateOptions;
@@ -788,11 +808,11 @@ export default class WxLiner extends WxChart {
me.wxAnimation.pushActions(actionAnimation);
me.wxAnimation.pushActions((t) => {
if (animateOpt.end === t) {
- me._drawLine(lineData, preData, total);
+ me._drawLine(lineData);
}
});
} else {
- me._drawLine(lineData, preData, total);
+ me._drawLine(lineData);
}
}
/**
diff --git a/src/util/tinycolor.js b/src/util/tinycolor.js
deleted file mode 100644
index edf2f86..0000000
--- a/src/util/tinycolor.js
+++ /dev/null
@@ -1,1221 +0,0 @@
-// TinyColor v1.4.1
-// https://github.com/bgrins/TinyColor
-// Brian Grinstead, MIT License
-
-
-var trimLeft = /^\s+/,
- trimRight = /\s+$/,
- tinyCounter = 0,
- mathRound = Math.round,
- mathMin = Math.min,
- mathMax = Math.max,
- mathRandom = Math.random;
-
-function tinycolor(color, opts) {
-
- color = (color) ? color : '';
- opts = opts || {};
-
- // If input is already a tinycolor, return itself
- if (color instanceof tinycolor) {
- return color;
- }
- // If we are called as a function, call using new instead
- if (!(this instanceof tinycolor)) {
- return new tinycolor(color, opts);
- }
-
- var rgb = inputToRGB(color);
- this._originalInput = color,
- this._r = rgb.r,
- this._g = rgb.g,
- this._b = rgb.b,
- this._a = rgb.a,
- this._roundA = mathRound(100 * this._a) / 100,
- this._format = opts.format || rgb.format;
- this._gradientType = opts.gradientType;
-
- // Don't let the range of [0,255] come back in [0,1].
- // Potentially lose a little bit of precision here, but will fix issues where
- // .5 gets interpreted as half of the total, instead of half of 1
- // If it was supposed to be 128, this was already taken care of by `inputToRgb`
- if (this._r < 1) {
- this._r = mathRound(this._r);
- }
- if (this._g < 1) {
- this._g = mathRound(this._g);
- }
- if (this._b < 1) {
- this._b = mathRound(this._b);
- }
-
- this._ok = rgb.ok;
- this._tc_id = tinyCounter++;
-}
-
-tinycolor.prototype = {
- isDark: function () {
- return this.getBrightness() < 128;
- },
- isLight: function () {
- return !this.isDark();
- },
- isValid: function () {
- return this._ok;
- },
- getOriginalInput: function () {
- return this._originalInput;
- },
- getFormat: function () {
- return this._format;
- },
- getAlpha: function () {
- return this._a;
- },
- getBrightness: function () {
- //http://www.w3.org/TR/AERT#color-contrast
- var rgb = this.toRgb();
- return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
- },
- getLuminance: function () {
- //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
- var rgb = this.toRgb();
- var RsRGB, GsRGB, BsRGB, R, G, B;
- RsRGB = rgb.r / 255;
- GsRGB = rgb.g / 255;
- BsRGB = rgb.b / 255;
-
- if (RsRGB <= 0.03928) {
- R = RsRGB / 12.92;
- } else {
- R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);
- }
- if (GsRGB <= 0.03928) {
- G = GsRGB / 12.92;
- } else {
- G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);
- }
- if (BsRGB <= 0.03928) {
- B = BsRGB / 12.92;
- } else {
- B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);
- }
- return (0.2126 * R) + (0.7152 * G) + (0.0722 * B);
- },
- setAlpha: function (value) {
- this._a = boundAlpha(value);
- this._roundA = mathRound(100 * this._a) / 100;
- return this;
- },
- toHsv: function () {
- var hsv = rgbToHsv(this._r, this._g, this._b);
- return {h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a};
- },
- toHsvString: function () {
- var hsv = rgbToHsv(this._r, this._g, this._b);
- var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
- return (this._a == 1) ?
- "hsv(" + h + ", " + s + "%, " + v + "%)" :
- "hsva(" + h + ", " + s + "%, " + v + "%, " + this._roundA + ")";
- },
- toHsl: function () {
- var hsl = rgbToHsl(this._r, this._g, this._b);
- return {h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a};
- },
- toHslString: function () {
- var hsl = rgbToHsl(this._r, this._g, this._b);
- var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
- return (this._a == 1) ?
- "hsl(" + h + ", " + s + "%, " + l + "%)" :
- "hsla(" + h + ", " + s + "%, " + l + "%, " + this._roundA + ")";
- },
- toHex: function (allow3Char) {
- return rgbToHex(this._r, this._g, this._b, allow3Char);
- },
- toHexString: function (allow3Char) {
- return '#' + this.toHex(allow3Char);
- },
- toHex8: function (allow4Char) {
- return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
- },
- toHex8String: function (allow4Char) {
- return '#' + this.toHex8(allow4Char);
- },
- toRgb: function () {
- return {r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a};
- },
- toRgbString: function () {
- return (this._a == 1) ?
- "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" :
- "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
- },
- toPercentageRgb: function () {
- return {
- r: mathRound(bound01(this._r, 255) * 100) + "%",
- g: mathRound(bound01(this._g, 255) * 100) + "%",
- b: mathRound(bound01(this._b, 255) * 100) + "%",
- a: this._a
- };
- },
- toPercentageRgbString: function () {
- return (this._a == 1) ?
- "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" :
- "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
- },
- toName: function () {
- if (this._a === 0) {
- return "transparent";
- }
-
- if (this._a < 1) {
- return false;
- }
-
- return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
- },
- toFilter: function (secondColor) {
- var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);
- var secondHex8String = hex8String;
- var gradientType = this._gradientType ? "GradientType = 1, " : "";
-
- if (secondColor) {
- var s = tinycolor(secondColor);
- secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);
- }
-
- return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")";
- },
- toString: function (format) {
- var formatSet = !!format;
- format = format || this._format;
-
- var formattedString = false;
- var hasAlpha = this._a < 1 && this._a >= 0;
- var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
-
- if (needsAlphaFormat) {
- // Special case for "transparent", all other non-alpha formats
- // will return rgba when there is transparency.
- if (format === "name" && this._a === 0) {
- return this.toName();
- }
- return this.toRgbString();
- }
- if (format === "rgb") {
- formattedString = this.toRgbString();
- }
- if (format === "prgb") {
- formattedString = this.toPercentageRgbString();
- }
- if (format === "hex" || format === "hex6") {
- formattedString = this.toHexString();
- }
- if (format === "hex3") {
- formattedString = this.toHexString(true);
- }
- if (format === "hex4") {
- formattedString = this.toHex8String(true);
- }
- if (format === "hex8") {
- formattedString = this.toHex8String();
- }
- if (format === "name") {
- formattedString = this.toName();
- }
- if (format === "hsl") {
- formattedString = this.toHslString();
- }
- if (format === "hsv") {
- formattedString = this.toHsvString();
- }
-
- return formattedString || this.toHexString();
- },
- clone: function () {
- return tinycolor(this.toString());
- },
-
- _applyModification: function (fn, args) {
- var color = fn.apply(null, [this].concat([].slice.call(args)));
- this._r = color._r;
- this._g = color._g;
- this._b = color._b;
- this.setAlpha(color._a);
- return this;
- },
- lighten: function () {
- return this._applyModification(lighten, arguments);
- },
- brighten: function () {
- return this._applyModification(brighten, arguments);
- },
- darken: function () {
- return this._applyModification(darken, arguments);
- },
- desaturate: function () {
- return this._applyModification(desaturate, arguments);
- },
- saturate: function () {
- return this._applyModification(saturate, arguments);
- },
- greyscale: function () {
- return this._applyModification(greyscale, arguments);
- },
- spin: function () {
- return this._applyModification(spin, arguments);
- },
-
- _applyCombination: function (fn, args) {
- return fn.apply(null, [this].concat([].slice.call(args)));
- },
- analogous: function () {
- return this._applyCombination(analogous, arguments);
- },
- complement: function () {
- return this._applyCombination(complement, arguments);
- },
- monochromatic: function () {
- return this._applyCombination(monochromatic, arguments);
- },
- splitcomplement: function () {
- return this._applyCombination(splitcomplement, arguments);
- },
- triad: function () {
- return this._applyCombination(triad, arguments);
- },
- tetrad: function () {
- return this._applyCombination(tetrad, arguments);
- }
-};
-
-// If input is an object, force 1 into "1.0" to handle ratios properly
-// String input requires "1.0" as input, so 1 will be treated as 1
-tinycolor.fromRatio = function (color, opts) {
- if (typeof color == "object") {
- var newColor = {};
- for (var i in color) {
- if (color.hasOwnProperty(i)) {
- if (i === "a") {
- newColor[i] = color[i];
- }
- else {
- newColor[i] = convertToPercentage(color[i]);
- }
- }
- }
- color = newColor;
- }
-
- return tinycolor(color, opts);
-};
-
-// Given a string or object, convert that input to RGB
-// Possible string inputs:
-//
-// "red"
-// "#f00" or "f00"
-// "#ff0000" or "ff0000"
-// "#ff000000" or "ff000000"
-// "rgb 255 0 0" or "rgb (255, 0, 0)"
-// "rgb 1.0 0 0" or "rgb (1, 0, 0)"
-// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
-// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
-// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
-// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
-// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
-//
-function inputToRGB(color) {
-
- var rgb = {r: 0, g: 0, b: 0};
- var a = 1;
- var s = null;
- var v = null;
- var l = null;
- var ok = false;
- var format = false;
-
- if (typeof color == "string") {
- color = stringInputToObject(color);
- }
-
- if (typeof color == "object") {
- if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
- rgb = rgbToRgb(color.r, color.g, color.b);
- ok = true;
- format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
- }
- else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
- s = convertToPercentage(color.s);
- v = convertToPercentage(color.v);
- rgb = hsvToRgb(color.h, s, v);
- ok = true;
- format = "hsv";
- }
- else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
- s = convertToPercentage(color.s);
- l = convertToPercentage(color.l);
- rgb = hslToRgb(color.h, s, l);
- ok = true;
- format = "hsl";
- }
-
- if (color.hasOwnProperty("a")) {
- a = color.a;
- }
- }
-
- a = boundAlpha(a);
-
- return {
- ok: ok,
- format: color.format || format,
- r: mathMin(255, mathMax(rgb.r, 0)),
- g: mathMin(255, mathMax(rgb.g, 0)),
- b: mathMin(255, mathMax(rgb.b, 0)),
- a: a
- };
-}
-
-
-// Conversion Functions
-// --------------------
-
-// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
-//
-
-// `rgbToRgb`
-// Handle bounds / percentage checking to conform to CSS color spec
-//
-// *Assumes:* r, g, b in [0, 255] or [0, 1]
-// *Returns:* { r, g, b } in [0, 255]
-function rgbToRgb(r, g, b) {
- return {
- r: bound01(r, 255) * 255,
- g: bound01(g, 255) * 255,
- b: bound01(b, 255) * 255
- };
-}
-
-// `rgbToHsl`
-// Converts an RGB color value to HSL.
-// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
-// *Returns:* { h, s, l } in [0,1]
-function rgbToHsl(r, g, b) {
-
- r = bound01(r, 255);
- g = bound01(g, 255);
- b = bound01(b, 255);
-
- var max = mathMax(r, g, b), min = mathMin(r, g, b);
- var h, s, l = (max + min) / 2;
-
- if (max == min) {
- h = s = 0; // achromatic
- }
- else {
- var d = max - min;
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
- switch (max) {
- case r:
- h = (g - b) / d + (g < b ? 6 : 0);
- break;
- case g:
- h = (b - r) / d + 2;
- break;
- case b:
- h = (r - g) / d + 4;
- break;
- }
-
- h /= 6;
- }
-
- return {h: h, s: s, l: l};
-}
-
-// `hslToRgb`
-// Converts an HSL color value to RGB.
-// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
-// *Returns:* { r, g, b } in the set [0, 255]
-function hslToRgb(h, s, l) {
- var r, g, b;
-
- h = bound01(h, 360);
- s = bound01(s, 100);
- l = bound01(l, 100);
-
- function hue2rgb(p, q, t) {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6) return p + (q - p) * 6 * t;
- if (t < 1 / 2) return q;
- if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
- return p;
- }
-
- if (s === 0) {
- r = g = b = l; // achromatic
- }
- else {
- var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- var p = 2 * l - q;
- r = hue2rgb(p, q, h + 1 / 3);
- g = hue2rgb(p, q, h);
- b = hue2rgb(p, q, h - 1 / 3);
- }
-
- return {r: r * 255, g: g * 255, b: b * 255};
-}
-
-// `rgbToHsv`
-// Converts an RGB color value to HSV
-// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
-// *Returns:* { h, s, v } in [0,1]
-function rgbToHsv(r, g, b) {
-
- r = bound01(r, 255);
- g = bound01(g, 255);
- b = bound01(b, 255);
-
- var max = mathMax(r, g, b), min = mathMin(r, g, b);
- var h, s, v = max;
-
- var d = max - min;
- s = max === 0 ? 0 : d / max;
-
- if (max == min) {
- h = 0; // achromatic
- }
- else {
- switch (max) {
- case r:
- h = (g - b) / d + (g < b ? 6 : 0);
- break;
- case g:
- h = (b - r) / d + 2;
- break;
- case b:
- h = (r - g) / d + 4;
- break;
- }
- h /= 6;
- }
- return {h: h, s: s, v: v};
-}
-
-// `hsvToRgb`
-// Converts an HSV color value to RGB.
-// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
-// *Returns:* { r, g, b } in the set [0, 255]
-function hsvToRgb(h, s, v) {
-
- h = bound01(h, 360) * 6;
- s = bound01(s, 100);
- v = bound01(v, 100);
-
- var i = Math.floor(h),
- f = h - i,
- p = v * (1 - s),
- q = v * (1 - f * s),
- t = v * (1 - (1 - f) * s),
- mod = i % 6,
- r = [v, q, p, p, t, v][mod],
- g = [t, v, v, q, p, p][mod],
- b = [p, p, t, v, v, q][mod];
-
- return {r: r * 255, g: g * 255, b: b * 255};
-}
-
-// `rgbToHex`
-// Converts an RGB color to hex
-// Assumes r, g, and b are contained in the set [0, 255]
-// Returns a 3 or 6 character hex
-function rgbToHex(r, g, b, allow3Char) {
-
- var hex = [
- pad2(mathRound(r).toString(16)),
- pad2(mathRound(g).toString(16)),
- pad2(mathRound(b).toString(16))
- ];
-
- // Return a 3 character hex if possible
- if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
- return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
- }
-
- return hex.join("");
-}
-
-// `rgbaToHex`
-// Converts an RGBA color plus alpha transparency to hex
-// Assumes r, g, b are contained in the set [0, 255] and
-// a in [0, 1]. Returns a 4 or 8 character rgba hex
-function rgbaToHex(r, g, b, a, allow4Char) {
-
- var hex = [
- pad2(mathRound(r).toString(16)),
- pad2(mathRound(g).toString(16)),
- pad2(mathRound(b).toString(16)),
- pad2(convertDecimalToHex(a))
- ];
-
- // Return a 4 character hex if possible
- if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
- return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
- }
-
- return hex.join("");
-}
-
-// `rgbaToArgbHex`
-// Converts an RGBA color to an ARGB Hex8 string
-// Rarely used, but required for "toFilter()"
-function rgbaToArgbHex(r, g, b, a) {
-
- var hex = [
- pad2(convertDecimalToHex(a)),
- pad2(mathRound(r).toString(16)),
- pad2(mathRound(g).toString(16)),
- pad2(mathRound(b).toString(16))
- ];
-
- return hex.join("");
-}
-
-// `equals`
-// Can be called with any tinycolor input
-tinycolor.equals = function (color1, color2) {
- if (!color1 || !color2) {
- return false;
- }
- return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
-};
-
-tinycolor.random = function () {
- return tinycolor.fromRatio({
- r: mathRandom(),
- g: mathRandom(),
- b: mathRandom()
- });
-};
-
-
-// Modification Functions
-// ----------------------
-// Thanks to less.js for some of the basics here
-//
-
-function desaturate(color, amount) {
- amount = (amount === 0) ? 0 : (amount || 10);
- var hsl = tinycolor(color).toHsl();
- hsl.s -= amount / 100;
- hsl.s = clamp01(hsl.s);
- return tinycolor(hsl);
-}
-
-function saturate(color, amount) {
- amount = (amount === 0) ? 0 : (amount || 10);
- var hsl = tinycolor(color).toHsl();
- hsl.s += amount / 100;
- hsl.s = clamp01(hsl.s);
- return tinycolor(hsl);
-}
-
-function greyscale(color) {
- return tinycolor(color).desaturate(100);
-}
-
-function lighten(color, amount) {
- amount = (amount === 0) ? 0 : (amount || 10);
- var hsl = tinycolor(color).toHsl();
- hsl.l += amount / 100;
- hsl.l = clamp01(hsl.l);
- return tinycolor(hsl);
-}
-
-function brighten(color, amount) {
- amount = (amount === 0) ? 0 : (amount || 10);
- var rgb = tinycolor(color).toRgb();
- rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * -(amount / 100))));
- rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * -(amount / 100))));
- rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * -(amount / 100))));
- return tinycolor(rgb);
-}
-
-function darken(color, amount) {
- amount = (amount === 0) ? 0 : (amount || 10);
- var hsl = tinycolor(color).toHsl();
- hsl.l -= amount / 100;
- hsl.l = clamp01(hsl.l);
- return tinycolor(hsl);
-}
-
-// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
-// Values outside of this range will be wrapped into this range.
-function spin(color, amount) {
- var hsl = tinycolor(color).toHsl();
- var hue = (hsl.h + amount) % 360;
- hsl.h = hue < 0 ? 360 + hue : hue;
- return tinycolor(hsl);
-}
-
-// Combination Functions
-// ---------------------
-// Thanks to jQuery xColor for some of the ideas behind these
-//
-
-function complement(color) {
- var hsl = tinycolor(color).toHsl();
- hsl.h = (hsl.h + 180) % 360;
- return tinycolor(hsl);
-}
-
-function triad(color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h;
- return [
- tinycolor(color),
- tinycolor({h: (h + 120) % 360, s: hsl.s, l: hsl.l}),
- tinycolor({h: (h + 240) % 360, s: hsl.s, l: hsl.l})
- ];
-}
-
-function tetrad(color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h;
- return [
- tinycolor(color),
- tinycolor({h: (h + 90) % 360, s: hsl.s, l: hsl.l}),
- tinycolor({h: (h + 180) % 360, s: hsl.s, l: hsl.l}),
- tinycolor({h: (h + 270) % 360, s: hsl.s, l: hsl.l})
- ];
-}
-
-function splitcomplement(color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h;
- return [
- tinycolor(color),
- tinycolor({h: (h + 72) % 360, s: hsl.s, l: hsl.l}),
- tinycolor({h: (h + 216) % 360, s: hsl.s, l: hsl.l})
- ];
-}
-
-function analogous(color, results, slices) {
- results = results || 6;
- slices = slices || 30;
-
- var hsl = tinycolor(color).toHsl();
- var part = 360 / slices;
- var ret = [tinycolor(color)];
-
- for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results;) {
- hsl.h = (hsl.h + part) % 360;
- ret.push(tinycolor(hsl));
- }
- return ret;
-}
-
-function monochromatic(color, results) {
- results = results || 6;
- var hsv = tinycolor(color).toHsv();
- var h = hsv.h, s = hsv.s, v = hsv.v;
- var ret = [];
- var modification = 1 / results;
-
- while (results--) {
- ret.push(tinycolor({h: h, s: s, v: v}));
- v = (v + modification) % 1;
- }
-
- return ret;
-}
-
-// Utility Functions
-// ---------------------
-
-tinycolor.mix = function (color1, color2, amount) {
- amount = (amount === 0) ? 0 : (amount || 50);
-
- var rgb1 = tinycolor(color1).toRgb();
- var rgb2 = tinycolor(color2).toRgb();
-
- var p = amount / 100;
-
- var rgba = {
- r: ((rgb2.r - rgb1.r) * p) + rgb1.r,
- g: ((rgb2.g - rgb1.g) * p) + rgb1.g,
- b: ((rgb2.b - rgb1.b) * p) + rgb1.b,
- a: ((rgb2.a - rgb1.a) * p) + rgb1.a
- };
-
- return tinycolor(rgba);
-};
-
-
-// Readability Functions
-// ---------------------
-// false
-// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
-tinycolor.isReadable = function (color1, color2, wcag2) {
- var readability = tinycolor.readability(color1, color2);
- var wcag2Parms, out;
-
- out = false;
-
- wcag2Parms = validateWCAG2Parms(wcag2);
- switch (wcag2Parms.level + wcag2Parms.size) {
- case "AAsmall":
- case "AAAlarge":
- out = readability >= 4.5;
- break;
- case "AAlarge":
- out = readability >= 3;
- break;
- case "AAAsmall":
- out = readability >= 7;
- break;
- }
- return out;
-
-};
-
-// `mostReadable`
-// Given a base color and a list of possible foreground or background
-// colors for that base, returns the most readable color.
-// Optionally returns Black or White if the most readable color is unreadable.
-// *Example*
-// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
-// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff"
-// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
-// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
-tinycolor.mostReadable = function (baseColor, colorList, args) {
- var bestColor = null;
- var bestScore = 0;
- var readability;
- var includeFallbackColors, level, size;
- args = args || {};
- includeFallbackColors = args.includeFallbackColors;
- level = args.level;
- size = args.size;
-
- for (var i = 0; i < colorList.length; i++) {
- readability = tinycolor.readability(baseColor, colorList[i]);
- if (readability > bestScore) {
- bestScore = readability;
- bestColor = tinycolor(colorList[i]);
- }
- }
-
- if (tinycolor.isReadable(baseColor, bestColor, {"level": level, "size": size}) || !includeFallbackColors) {
- return bestColor;
- }
- else {
- args.includeFallbackColors = false;
- return tinycolor.mostReadable(baseColor, ["#fff", "#000"], args);
- }
-};
-
-
-// Big List of Colors
-// ------------------
-//
-var names = tinycolor.names = {
- aliceblue: "f0f8ff",
- antiquewhite: "faebd7",
- aqua: "0ff",
- aquamarine: "7fffd4",
- azure: "f0ffff",
- beige: "f5f5dc",
- bisque: "ffe4c4",
- black: "000",
- blanchedalmond: "ffebcd",
- blue: "00f",
- blueviolet: "8a2be2",
- brown: "a52a2a",
- burlywood: "deb887",
- burntsienna: "ea7e5d",
- cadetblue: "5f9ea0",
- chartreuse: "7fff00",
- chocolate: "d2691e",
- coral: "ff7f50",
- cornflowerblue: "6495ed",
- cornsilk: "fff8dc",
- crimson: "dc143c",
- cyan: "0ff",
- darkblue: "00008b",
- darkcyan: "008b8b",
- darkgoldenrod: "b8860b",
- darkgray: "a9a9a9",
- darkgreen: "006400",
- darkgrey: "a9a9a9",
- darkkhaki: "bdb76b",
- darkmagenta: "8b008b",
- darkolivegreen: "556b2f",
- darkorange: "ff8c00",
- darkorchid: "9932cc",
- darkred: "8b0000",
- darksalmon: "e9967a",
- darkseagreen: "8fbc8f",
- darkslateblue: "483d8b",
- darkslategray: "2f4f4f",
- darkslategrey: "2f4f4f",
- darkturquoise: "00ced1",
- darkviolet: "9400d3",
- deeppink: "ff1493",
- deepskyblue: "00bfff",
- dimgray: "696969",
- dimgrey: "696969",
- dodgerblue: "1e90ff",
- firebrick: "b22222",
- floralwhite: "fffaf0",
- forestgreen: "228b22",
- fuchsia: "f0f",
- gainsboro: "dcdcdc",
- ghostwhite: "f8f8ff",
- gold: "ffd700",
- goldenrod: "daa520",
- gray: "808080",
- green: "008000",
- greenyellow: "adff2f",
- grey: "808080",
- honeydew: "f0fff0",
- hotpink: "ff69b4",
- indianred: "cd5c5c",
- indigo: "4b0082",
- ivory: "fffff0",
- khaki: "f0e68c",
- lavender: "e6e6fa",
- lavenderblush: "fff0f5",
- lawngreen: "7cfc00",
- lemonchiffon: "fffacd",
- lightblue: "add8e6",
- lightcoral: "f08080",
- lightcyan: "e0ffff",
- lightgoldenrodyellow: "fafad2",
- lightgray: "d3d3d3",
- lightgreen: "90ee90",
- lightgrey: "d3d3d3",
- lightpink: "ffb6c1",
- lightsalmon: "ffa07a",
- lightseagreen: "20b2aa",
- lightskyblue: "87cefa",
- lightslategray: "789",
- lightslategrey: "789",
- lightsteelblue: "b0c4de",
- lightyellow: "ffffe0",
- lime: "0f0",
- limegreen: "32cd32",
- linen: "faf0e6",
- magenta: "f0f",
- maroon: "800000",
- mediumaquamarine: "66cdaa",
- mediumblue: "0000cd",
- mediumorchid: "ba55d3",
- mediumpurple: "9370db",
- mediumseagreen: "3cb371",
- mediumslateblue: "7b68ee",
- mediumspringgreen: "00fa9a",
- mediumturquoise: "48d1cc",
- mediumvioletred: "c71585",
- midnightblue: "191970",
- mintcream: "f5fffa",
- mistyrose: "ffe4e1",
- moccasin: "ffe4b5",
- navajowhite: "ffdead",
- navy: "000080",
- oldlace: "fdf5e6",
- olive: "808000",
- olivedrab: "6b8e23",
- orange: "ffa500",
- orangered: "ff4500",
- orchid: "da70d6",
- palegoldenrod: "eee8aa",
- palegreen: "98fb98",
- paleturquoise: "afeeee",
- palevioletred: "db7093",
- papayawhip: "ffefd5",
- peachpuff: "ffdab9",
- peru: "cd853f",
- pink: "ffc0cb",
- plum: "dda0dd",
- powderblue: "b0e0e6",
- purple: "800080",
- rebeccapurple: "663399",
- red: "f00",
- rosybrown: "bc8f8f",
- royalblue: "4169e1",
- saddlebrown: "8b4513",
- salmon: "fa8072",
- sandybrown: "f4a460",
- seagreen: "2e8b57",
- seashell: "fff5ee",
- sienna: "a0522d",
- silver: "c0c0c0",
- skyblue: "87ceeb",
- slateblue: "6a5acd",
- slategray: "708090",
- slategrey: "708090",
- snow: "fffafa",
- springgreen: "00ff7f",
- steelblue: "4682b4",
- tan: "d2b48c",
- teal: "008080",
- thistle: "d8bfd8",
- tomato: "ff6347",
- turquoise: "40e0d0",
- violet: "ee82ee",
- wheat: "f5deb3",
- white: "fff",
- whitesmoke: "f5f5f5",
- yellow: "ff0",
- yellowgreen: "9acd32"
-};
-
-// Make it easy to access colors via `hexNames[hex]`
-var hexNames = tinycolor.hexNames = flip(names);
-
-
-// Utilities
-// ---------
-
-// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
-function flip(o) {
- var flipped = {};
- for (var i in o) {
- if (o.hasOwnProperty(i)) {
- flipped[o[i]] = i;
- }
- }
- return flipped;
-}
-
-// Return a valid alpha value [0,1] with all invalid values being set to 1
-function boundAlpha(a) {
- a = parseFloat(a);
-
- if (isNaN(a) || a < 0 || a > 1) {
- a = 1;
- }
-
- return a;
-}
-
-// Take input from [0, n] and return it as [0, 1]
-function bound01(n, max) {
- if (isOnePointZero(n)) {
- n = "100%";
- }
-
- var processPercent = isPercentage(n);
- n = mathMin(max, mathMax(0, parseFloat(n)));
-
- // Automatically convert percentage into number
- if (processPercent) {
- n = parseInt(n * max, 10) / 100;
- }
-
- // Handle floating point rounding errors
- if ((Math.abs(n - max) < 0.000001)) {
- return 1;
- }
-
- // Convert into [0, 1] range if it isn't already
- return (n % max) / parseFloat(max);
-}
-
-// Force a number between 0 and 1
-function clamp01(val) {
- return mathMin(1, mathMax(0, val));
-}
-
-// Parse a base-16 hex value into a base-10 integer
-function parseIntFromHex(val) {
- return parseInt(val, 16);
-}
-
-// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
-//
-function isOnePointZero(n) {
- return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
-}
-
-// Check to see if string passed in is a percentage
-function isPercentage(n) {
- return typeof n === "string" && n.indexOf('%') != -1;
-}
-
-// Force a hex value to have 2 characters
-function pad2(c) {
- return c.length == 1 ? '0' + c : '' + c;
-}
-
-// Replace a decimal with it's percentage value
-function convertToPercentage(n) {
- if (n <= 1) {
- n = (n * 100) + "%";
- }
-
- return n;
-}
-
-// Converts a decimal to a hex value
-function convertDecimalToHex(d) {
- return Math.round(parseFloat(d) * 255).toString(16);
-}
-// Converts a hex value to a decimal
-function convertHexToDecimal(h) {
- return (parseIntFromHex(h) / 255);
-}
-
-var matchers = (function () {
-
- //
- var CSS_INTEGER = "[-\\+]?\\d+%?";
-
- //
- var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
-
- // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
- var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
-
- // Actual matching.
- // Parentheses and commas are optional, but not required.
- // Whitespace can take the place of commas or opening paren
- var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
- var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
-
- return {
- CSS_UNIT: new RegExp(CSS_UNIT),
- rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
- rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
- hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
- hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
- hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
- hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
- hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
- hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
- hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
- hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
- };
-})();
-
-// `isValidCSSUnit`
-// Take in a single string / number and check to see if it looks like a CSS unit
-// (see `matchers` above for definition).
-function isValidCSSUnit(color) {
- return !!matchers.CSS_UNIT.exec(color);
-}
-
-// `stringInputToObject`
-// Permissive string parsing. Take in a number of formats, and output an object
-// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
-function stringInputToObject(color) {
-
- color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();
- var named = false;
- if (names[color]) {
- color = names[color];
- named = true;
- }
- else if (color == 'transparent') {
- return {r: 0, g: 0, b: 0, a: 0, format: "name"};
- }
-
- // Try to match string input using regular expressions.
- // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
- // Just return an object and let the conversion functions handle that.
- // This way the result will be the same whether the tinycolor is initialized with string or object.
- var match;
- if ((match = matchers.rgb.exec(color))) {
- return {r: match[1], g: match[2], b: match[3]};
- }
- if ((match = matchers.rgba.exec(color))) {
- return {r: match[1], g: match[2], b: match[3], a: match[4]};
- }
- if ((match = matchers.hsl.exec(color))) {
- return {h: match[1], s: match[2], l: match[3]};
- }
- if ((match = matchers.hsla.exec(color))) {
- return {h: match[1], s: match[2], l: match[3], a: match[4]};
- }
- if ((match = matchers.hsv.exec(color))) {
- return {h: match[1], s: match[2], v: match[3]};
- }
- if ((match = matchers.hsva.exec(color))) {
- return {h: match[1], s: match[2], v: match[3], a: match[4]};
- }
- if ((match = matchers.hex8.exec(color))) {
- return {
- r: parseIntFromHex(match[1]),
- g: parseIntFromHex(match[2]),
- b: parseIntFromHex(match[3]),
- a: convertHexToDecimal(match[4]),
- format: named ? "name" : "hex8"
- };
- }
- if ((match = matchers.hex6.exec(color))) {
- return {
- r: parseIntFromHex(match[1]),
- g: parseIntFromHex(match[2]),
- b: parseIntFromHex(match[3]),
- format: named ? "name" : "hex"
- };
- }
- if ((match = matchers.hex4.exec(color))) {
- return {
- r: parseIntFromHex(match[1] + '' + match[1]),
- g: parseIntFromHex(match[2] + '' + match[2]),
- b: parseIntFromHex(match[3] + '' + match[3]),
- a: convertHexToDecimal(match[4] + '' + match[4]),
- format: named ? "name" : "hex8"
- };
- }
- if ((match = matchers.hex3.exec(color))) {
- return {
- r: parseIntFromHex(match[1] + '' + match[1]),
- g: parseIntFromHex(match[2] + '' + match[2]),
- b: parseIntFromHex(match[3] + '' + match[3]),
- format: named ? "name" : "hex"
- };
- }
-
- return false;
-}
-
-function validateWCAG2Parms(parms) {
- // return valid WCAG2 parms for isReadable.
- // If input parms are invalid, return {"level":"AA", "size":"small"}
- var level, size;
- parms = parms || {"level": "AA", "size": "small"};
- level = (parms.level || "AA").toUpperCase();
- size = (parms.size || "small").toLowerCase();
- if (level !== "AA" && level !== "AAA") {
- level = "AA";
- }
- if (size !== "small" && size !== "large") {
- size = "small";
- }
- return {"level": level, "size": size};
-}
-
-
-export default tinycolor;
\ No newline at end of file
diff --git a/test/chart.wxDoughnut.Spec.js b/test/chart.wxDoughnut.Spec.js
index a8b0860..804f6f0 100644
--- a/test/chart.wxDoughnut.Spec.js
+++ b/test/chart.wxDoughnut.Spec.js
@@ -45,7 +45,7 @@ describe('WxDoughnut component test', () => {
}]);
wxDoughnut.on('draw',function() {
- done();
+ setTimeout(done, 200);
});
});
@@ -74,7 +74,7 @@ describe('WxDoughnut component test', () => {
}]);
wxDoughnut.on('draw',() => {
- done();
+ setTimeout(done, 200);
});
});
@@ -107,7 +107,7 @@ describe('WxDoughnut component test', () => {
percentage: 100
}]);
wxDoughnut.on('draw',() => {
- done();
+ setTimeout(done, 200);
});
});