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); }); });