| | |
| | | * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md |
| | | */ |
| | | (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){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}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ |
| | | /* MIT license */
|
| | | var colorNames = require(5);
|
| | |
|
| | | module.exports = {
|
| | | getRgba: getRgba,
|
| | | getHsla: getHsla,
|
| | | getRgb: getRgb,
|
| | | getHsl: getHsl,
|
| | | getHwb: getHwb,
|
| | | getAlpha: getAlpha,
|
| | |
|
| | | hexString: hexString,
|
| | | rgbString: rgbString,
|
| | | rgbaString: rgbaString,
|
| | | percentString: percentString,
|
| | | percentaString: percentaString,
|
| | | hslString: hslString,
|
| | | hslaString: hslaString,
|
| | | hwbString: hwbString,
|
| | | keyword: keyword
|
| | | }
|
| | |
|
| | | function getRgba(string) {
|
| | | if (!string) {
|
| | | return;
|
| | | }
|
| | | var abbr = /^#([a-fA-F0-9]{3})$/,
|
| | | hex = /^#([a-fA-F0-9]{6})$/,
|
| | | rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,
|
| | | per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,
|
| | | keyword = /(\w+)/;
|
| | |
|
| | | var rgb = [0, 0, 0],
|
| | | a = 1,
|
| | | match = string.match(abbr);
|
| | | if (match) {
|
| | | match = match[1];
|
| | | for (var i = 0; i < rgb.length; i++) {
|
| | | rgb[i] = parseInt(match[i] + match[i], 16);
|
| | | }
|
| | | }
|
| | | else if (match = string.match(hex)) {
|
| | | match = match[1];
|
| | | for (var i = 0; i < rgb.length; i++) {
|
| | | rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);
|
| | | }
|
| | | }
|
| | | else if (match = string.match(rgba)) {
|
| | | for (var i = 0; i < rgb.length; i++) {
|
| | | rgb[i] = parseInt(match[i + 1]);
|
| | | }
|
| | | a = parseFloat(match[4]);
|
| | | }
|
| | | else if (match = string.match(per)) {
|
| | | for (var i = 0; i < rgb.length; i++) {
|
| | | rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
|
| | | }
|
| | | a = parseFloat(match[4]);
|
| | | }
|
| | | else if (match = string.match(keyword)) {
|
| | | if (match[1] == "transparent") {
|
| | | return [0, 0, 0, 0];
|
| | | }
|
| | | rgb = colorNames[match[1]];
|
| | | if (!rgb) {
|
| | | return;
|
| | | }
|
| | | }
|
| | |
|
| | | for (var i = 0; i < rgb.length; i++) {
|
| | | rgb[i] = scale(rgb[i], 0, 255);
|
| | | }
|
| | | if (!a && a != 0) {
|
| | | a = 1;
|
| | | }
|
| | | else {
|
| | | a = scale(a, 0, 1);
|
| | | }
|
| | | rgb[3] = a;
|
| | | return rgb;
|
| | | }
|
| | |
|
| | | function getHsla(string) {
|
| | | if (!string) {
|
| | | return;
|
| | | }
|
| | | var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
|
| | | var match = string.match(hsl);
|
| | | if (match) {
|
| | | var alpha = parseFloat(match[4]);
|
| | | var h = scale(parseInt(match[1]), 0, 360),
|
| | | s = scale(parseFloat(match[2]), 0, 100),
|
| | | l = scale(parseFloat(match[3]), 0, 100),
|
| | | a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
|
| | | return [h, s, l, a];
|
| | | }
|
| | | }
|
| | |
|
| | | function getHwb(string) {
|
| | | if (!string) {
|
| | | return;
|
| | | }
|
| | | var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
|
| | | var match = string.match(hwb);
|
| | | if (match) {
|
| | | var alpha = parseFloat(match[4]);
|
| | | var h = scale(parseInt(match[1]), 0, 360),
|
| | | w = scale(parseFloat(match[2]), 0, 100),
|
| | | b = scale(parseFloat(match[3]), 0, 100),
|
| | | a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
|
| | | return [h, w, b, a];
|
| | | }
|
| | | }
|
| | |
|
| | | function getRgb(string) {
|
| | | var rgba = getRgba(string);
|
| | | return rgba && rgba.slice(0, 3);
|
| | | }
|
| | |
|
| | | function getHsl(string) {
|
| | | var hsla = getHsla(string);
|
| | | return hsla && hsla.slice(0, 3);
|
| | | }
|
| | |
|
| | | function getAlpha(string) {
|
| | | var vals = getRgba(string);
|
| | | if (vals) {
|
| | | return vals[3];
|
| | | }
|
| | | else if (vals = getHsla(string)) {
|
| | | return vals[3];
|
| | | }
|
| | | else if (vals = getHwb(string)) {
|
| | | return vals[3];
|
| | | }
|
| | | }
|
| | |
|
| | | // generators
|
| | | function hexString(rgb) {
|
| | | return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1])
|
| | | + hexDouble(rgb[2]);
|
| | | }
|
| | |
|
| | | function rgbString(rgba, alpha) {
|
| | | if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
|
| | | return rgbaString(rgba, alpha);
|
| | | }
|
| | | return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")";
|
| | | }
|
| | |
|
| | | function rgbaString(rgba, alpha) {
|
| | | if (alpha === undefined) {
|
| | | alpha = (rgba[3] !== undefined ? rgba[3] : 1);
|
| | | }
|
| | | return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2]
|
| | | + ", " + alpha + ")";
|
| | | }
|
| | |
|
| | | function percentString(rgba, alpha) {
|
| | | if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
|
| | | return percentaString(rgba, alpha);
|
| | | }
|
| | | var r = Math.round(rgba[0]/255 * 100),
|
| | | g = Math.round(rgba[1]/255 * 100),
|
| | | b = Math.round(rgba[2]/255 * 100);
|
| | |
|
| | | return "rgb(" + r + "%, " + g + "%, " + b + "%)";
|
| | | }
|
| | |
|
| | | function percentaString(rgba, alpha) {
|
| | | var r = Math.round(rgba[0]/255 * 100),
|
| | | g = Math.round(rgba[1]/255 * 100),
|
| | | b = Math.round(rgba[2]/255 * 100);
|
| | | return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")";
|
| | | }
|
| | |
|
| | | function hslString(hsla, alpha) {
|
| | | if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {
|
| | | return hslaString(hsla, alpha);
|
| | | }
|
| | | return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)";
|
| | | }
|
| | |
|
| | | function hslaString(hsla, alpha) {
|
| | | if (alpha === undefined) {
|
| | | alpha = (hsla[3] !== undefined ? hsla[3] : 1);
|
| | | }
|
| | | return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, "
|
| | | + alpha + ")";
|
| | | }
|
| | |
|
| | | // hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
|
| | | // (hwb have alpha optional & 1 is default value)
|
| | | function hwbString(hwb, alpha) {
|
| | | if (alpha === undefined) {
|
| | | alpha = (hwb[3] !== undefined ? hwb[3] : 1);
|
| | | }
|
| | | return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%"
|
| | | + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")";
|
| | | }
|
| | |
|
| | | function keyword(rgb) {
|
| | | return reverseNames[rgb.slice(0, 3)];
|
| | | }
|
| | |
|
| | | // helpers
|
| | | function scale(num, min, max) {
|
| | | return Math.min(Math.max(min, num), max);
|
| | | }
|
| | |
|
| | | function hexDouble(num) {
|
| | | var str = num.toString(16).toUpperCase();
|
| | | return (str.length < 2) ? "0" + str : str;
|
| | | }
|
| | |
|
| | |
|
| | | //create a list of reverse color names
|
| | | var reverseNames = {};
|
| | | for (var name in colorNames) {
|
| | | reverseNames[colorNames[name]] = name;
|
| | | }
|
| | | /* MIT license */ |
| | | var colorNames = require(5); |
| | | |
| | | module.exports = { |
| | | getRgba: getRgba, |
| | | getHsla: getHsla, |
| | | getRgb: getRgb, |
| | | getHsl: getHsl, |
| | | getHwb: getHwb, |
| | | getAlpha: getAlpha, |
| | | |
| | | hexString: hexString, |
| | | rgbString: rgbString, |
| | | rgbaString: rgbaString, |
| | | percentString: percentString, |
| | | percentaString: percentaString, |
| | | hslString: hslString, |
| | | hslaString: hslaString, |
| | | hwbString: hwbString, |
| | | keyword: keyword |
| | | } |
| | | |
| | | function getRgba(string) { |
| | | if (!string) { |
| | | return; |
| | | } |
| | | var abbr = /^#([a-fA-F0-9]{3})$/, |
| | | hex = /^#([a-fA-F0-9]{6})$/, |
| | | rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/, |
| | | per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/, |
| | | keyword = /(\w+)/; |
| | | |
| | | var rgb = [0, 0, 0], |
| | | a = 1, |
| | | match = string.match(abbr); |
| | | if (match) { |
| | | match = match[1]; |
| | | for (var i = 0; i < rgb.length; i++) { |
| | | rgb[i] = parseInt(match[i] + match[i], 16); |
| | | } |
| | | } |
| | | else if (match = string.match(hex)) { |
| | | match = match[1]; |
| | | for (var i = 0; i < rgb.length; i++) { |
| | | rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); |
| | | } |
| | | } |
| | | else if (match = string.match(rgba)) { |
| | | for (var i = 0; i < rgb.length; i++) { |
| | | rgb[i] = parseInt(match[i + 1]); |
| | | } |
| | | a = parseFloat(match[4]); |
| | | } |
| | | else if (match = string.match(per)) { |
| | | for (var i = 0; i < rgb.length; i++) { |
| | | rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); |
| | | } |
| | | a = parseFloat(match[4]); |
| | | } |
| | | else if (match = string.match(keyword)) { |
| | | if (match[1] == "transparent") { |
| | | return [0, 0, 0, 0]; |
| | | } |
| | | rgb = colorNames[match[1]]; |
| | | if (!rgb) { |
| | | return; |
| | | } |
| | | } |
| | | |
| | | for (var i = 0; i < rgb.length; i++) { |
| | | rgb[i] = scale(rgb[i], 0, 255); |
| | | } |
| | | if (!a && a != 0) { |
| | | a = 1; |
| | | } |
| | | else { |
| | | a = scale(a, 0, 1); |
| | | } |
| | | rgb[3] = a; |
| | | return rgb; |
| | | } |
| | | |
| | | function getHsla(string) { |
| | | if (!string) { |
| | | return; |
| | | } |
| | | var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; |
| | | var match = string.match(hsl); |
| | | if (match) { |
| | | var alpha = parseFloat(match[4]); |
| | | var h = scale(parseInt(match[1]), 0, 360), |
| | | s = scale(parseFloat(match[2]), 0, 100), |
| | | l = scale(parseFloat(match[3]), 0, 100), |
| | | a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); |
| | | return [h, s, l, a]; |
| | | } |
| | | } |
| | | |
| | | function getHwb(string) { |
| | | if (!string) { |
| | | return; |
| | | } |
| | | var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; |
| | | var match = string.match(hwb); |
| | | if (match) { |
| | | var alpha = parseFloat(match[4]); |
| | | var h = scale(parseInt(match[1]), 0, 360), |
| | | w = scale(parseFloat(match[2]), 0, 100), |
| | | b = scale(parseFloat(match[3]), 0, 100), |
| | | a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); |
| | | return [h, w, b, a]; |
| | | } |
| | | } |
| | | |
| | | function getRgb(string) { |
| | | var rgba = getRgba(string); |
| | | return rgba && rgba.slice(0, 3); |
| | | } |
| | | |
| | | function getHsl(string) { |
| | | var hsla = getHsla(string); |
| | | return hsla && hsla.slice(0, 3); |
| | | } |
| | | |
| | | function getAlpha(string) { |
| | | var vals = getRgba(string); |
| | | if (vals) { |
| | | return vals[3]; |
| | | } |
| | | else if (vals = getHsla(string)) { |
| | | return vals[3]; |
| | | } |
| | | else if (vals = getHwb(string)) { |
| | | return vals[3]; |
| | | } |
| | | } |
| | | |
| | | // generators |
| | | function hexString(rgb) { |
| | | return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1]) |
| | | + hexDouble(rgb[2]); |
| | | } |
| | | |
| | | function rgbString(rgba, alpha) { |
| | | if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { |
| | | return rgbaString(rgba, alpha); |
| | | } |
| | | return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; |
| | | } |
| | | |
| | | function rgbaString(rgba, alpha) { |
| | | if (alpha === undefined) { |
| | | alpha = (rgba[3] !== undefined ? rgba[3] : 1); |
| | | } |
| | | return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] |
| | | + ", " + alpha + ")"; |
| | | } |
| | | |
| | | function percentString(rgba, alpha) { |
| | | if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { |
| | | return percentaString(rgba, alpha); |
| | | } |
| | | var r = Math.round(rgba[0]/255 * 100), |
| | | g = Math.round(rgba[1]/255 * 100), |
| | | b = Math.round(rgba[2]/255 * 100); |
| | | |
| | | return "rgb(" + r + "%, " + g + "%, " + b + "%)"; |
| | | } |
| | | |
| | | function percentaString(rgba, alpha) { |
| | | var r = Math.round(rgba[0]/255 * 100), |
| | | g = Math.round(rgba[1]/255 * 100), |
| | | b = Math.round(rgba[2]/255 * 100); |
| | | return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; |
| | | } |
| | | |
| | | function hslString(hsla, alpha) { |
| | | if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { |
| | | return hslaString(hsla, alpha); |
| | | } |
| | | return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; |
| | | } |
| | | |
| | | function hslaString(hsla, alpha) { |
| | | if (alpha === undefined) { |
| | | alpha = (hsla[3] !== undefined ? hsla[3] : 1); |
| | | } |
| | | return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " |
| | | + alpha + ")"; |
| | | } |
| | | |
| | | // hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax |
| | | // (hwb have alpha optional & 1 is default value) |
| | | function hwbString(hwb, alpha) { |
| | | if (alpha === undefined) { |
| | | alpha = (hwb[3] !== undefined ? hwb[3] : 1); |
| | | } |
| | | return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" |
| | | + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; |
| | | } |
| | | |
| | | function keyword(rgb) { |
| | | return reverseNames[rgb.slice(0, 3)]; |
| | | } |
| | | |
| | | // helpers |
| | | function scale(num, min, max) { |
| | | return Math.min(Math.max(min, num), max); |
| | | } |
| | | |
| | | function hexDouble(num) { |
| | | var str = num.toString(16).toUpperCase(); |
| | | return (str.length < 2) ? "0" + str : str; |
| | | } |
| | | |
| | | |
| | | //create a list of reverse color names |
| | | var reverseNames = {}; |
| | | for (var name in colorNames) { |
| | | reverseNames[colorNames[name]] = name; |
| | | } |
| | | |
| | | },{"5":5}],2:[function(require,module,exports){ |
| | | /* MIT license */
|
| | | var convert = require(4);
|
| | | var string = require(1);
|
| | |
|
| | | var Color = function (obj) {
|
| | | if (obj instanceof Color) {
|
| | | return obj;
|
| | | }
|
| | | if (!(this instanceof Color)) {
|
| | | return new Color(obj);
|
| | | }
|
| | |
|
| | | this.values = {
|
| | | rgb: [0, 0, 0],
|
| | | hsl: [0, 0, 0],
|
| | | hsv: [0, 0, 0],
|
| | | hwb: [0, 0, 0],
|
| | | cmyk: [0, 0, 0, 0],
|
| | | alpha: 1
|
| | | };
|
| | |
|
| | | // parse Color() argument
|
| | | var vals;
|
| | | if (typeof obj === 'string') {
|
| | | vals = string.getRgba(obj);
|
| | | if (vals) {
|
| | | this.setValues('rgb', vals);
|
| | | } else if (vals = string.getHsla(obj)) {
|
| | | this.setValues('hsl', vals);
|
| | | } else if (vals = string.getHwb(obj)) {
|
| | | this.setValues('hwb', vals);
|
| | | } else {
|
| | | throw new Error('Unable to parse color from string "' + obj + '"');
|
| | | }
|
| | | } else if (typeof obj === 'object') {
|
| | | vals = obj;
|
| | | if (vals.r !== undefined || vals.red !== undefined) {
|
| | | this.setValues('rgb', vals);
|
| | | } else if (vals.l !== undefined || vals.lightness !== undefined) {
|
| | | this.setValues('hsl', vals);
|
| | | } else if (vals.v !== undefined || vals.value !== undefined) {
|
| | | this.setValues('hsv', vals);
|
| | | } else if (vals.w !== undefined || vals.whiteness !== undefined) {
|
| | | this.setValues('hwb', vals);
|
| | | } else if (vals.c !== undefined || vals.cyan !== undefined) {
|
| | | this.setValues('cmyk', vals);
|
| | | } else {
|
| | | throw new Error('Unable to parse color from object ' + JSON.stringify(obj));
|
| | | }
|
| | | }
|
| | | };
|
| | |
|
| | | Color.prototype = {
|
| | | rgb: function () {
|
| | | return this.setSpace('rgb', arguments);
|
| | | },
|
| | | hsl: function () {
|
| | | return this.setSpace('hsl', arguments);
|
| | | },
|
| | | hsv: function () {
|
| | | return this.setSpace('hsv', arguments);
|
| | | },
|
| | | hwb: function () {
|
| | | return this.setSpace('hwb', arguments);
|
| | | },
|
| | | cmyk: function () {
|
| | | return this.setSpace('cmyk', arguments);
|
| | | },
|
| | |
|
| | | rgbArray: function () {
|
| | | return this.values.rgb;
|
| | | },
|
| | | hslArray: function () {
|
| | | return this.values.hsl;
|
| | | },
|
| | | hsvArray: function () {
|
| | | return this.values.hsv;
|
| | | },
|
| | | hwbArray: function () {
|
| | | var values = this.values;
|
| | | if (values.alpha !== 1) {
|
| | | return values.hwb.concat([values.alpha]);
|
| | | }
|
| | | return values.hwb;
|
| | | },
|
| | | cmykArray: function () {
|
| | | return this.values.cmyk;
|
| | | },
|
| | | rgbaArray: function () {
|
| | | var values = this.values;
|
| | | return values.rgb.concat([values.alpha]);
|
| | | },
|
| | | hslaArray: function () {
|
| | | var values = this.values;
|
| | | return values.hsl.concat([values.alpha]);
|
| | | },
|
| | | alpha: function (val) {
|
| | | if (val === undefined) {
|
| | | return this.values.alpha;
|
| | | }
|
| | | this.setValues('alpha', val);
|
| | | return this;
|
| | | },
|
| | |
|
| | | red: function (val) {
|
| | | return this.setChannel('rgb', 0, val);
|
| | | },
|
| | | green: function (val) {
|
| | | return this.setChannel('rgb', 1, val);
|
| | | },
|
| | | blue: function (val) {
|
| | | return this.setChannel('rgb', 2, val);
|
| | | },
|
| | | hue: function (val) {
|
| | | if (val) {
|
| | | val %= 360;
|
| | | val = val < 0 ? 360 + val : val;
|
| | | }
|
| | | return this.setChannel('hsl', 0, val);
|
| | | },
|
| | | saturation: function (val) {
|
| | | return this.setChannel('hsl', 1, val);
|
| | | },
|
| | | lightness: function (val) {
|
| | | return this.setChannel('hsl', 2, val);
|
| | | },
|
| | | saturationv: function (val) {
|
| | | return this.setChannel('hsv', 1, val);
|
| | | },
|
| | | whiteness: function (val) {
|
| | | return this.setChannel('hwb', 1, val);
|
| | | },
|
| | | blackness: function (val) {
|
| | | return this.setChannel('hwb', 2, val);
|
| | | },
|
| | | value: function (val) {
|
| | | return this.setChannel('hsv', 2, val);
|
| | | },
|
| | | cyan: function (val) {
|
| | | return this.setChannel('cmyk', 0, val);
|
| | | },
|
| | | magenta: function (val) {
|
| | | return this.setChannel('cmyk', 1, val);
|
| | | },
|
| | | yellow: function (val) {
|
| | | return this.setChannel('cmyk', 2, val);
|
| | | },
|
| | | black: function (val) {
|
| | | return this.setChannel('cmyk', 3, val);
|
| | | },
|
| | |
|
| | | hexString: function () {
|
| | | return string.hexString(this.values.rgb);
|
| | | },
|
| | | rgbString: function () {
|
| | | return string.rgbString(this.values.rgb, this.values.alpha);
|
| | | },
|
| | | rgbaString: function () {
|
| | | return string.rgbaString(this.values.rgb, this.values.alpha);
|
| | | },
|
| | | percentString: function () {
|
| | | return string.percentString(this.values.rgb, this.values.alpha);
|
| | | },
|
| | | hslString: function () {
|
| | | return string.hslString(this.values.hsl, this.values.alpha);
|
| | | },
|
| | | hslaString: function () {
|
| | | return string.hslaString(this.values.hsl, this.values.alpha);
|
| | | },
|
| | | hwbString: function () {
|
| | | return string.hwbString(this.values.hwb, this.values.alpha);
|
| | | },
|
| | | keyword: function () {
|
| | | return string.keyword(this.values.rgb, this.values.alpha);
|
| | | },
|
| | |
|
| | | rgbNumber: function () {
|
| | | var rgb = this.values.rgb;
|
| | | return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];
|
| | | },
|
| | |
|
| | | luminosity: function () {
|
| | | // http://www.w3.org/TR/WCAG20/#relativeluminancedef
|
| | | var rgb = this.values.rgb;
|
| | | var lum = [];
|
| | | for (var i = 0; i < rgb.length; i++) {
|
| | | var chan = rgb[i] / 255;
|
| | | lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);
|
| | | }
|
| | | return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
|
| | | },
|
| | |
|
| | | contrast: function (color2) {
|
| | | // http://www.w3.org/TR/WCAG20/#contrast-ratiodef
|
| | | var lum1 = this.luminosity();
|
| | | var lum2 = color2.luminosity();
|
| | | if (lum1 > lum2) {
|
| | | return (lum1 + 0.05) / (lum2 + 0.05);
|
| | | }
|
| | | return (lum2 + 0.05) / (lum1 + 0.05);
|
| | | },
|
| | |
|
| | | level: function (color2) {
|
| | | var contrastRatio = this.contrast(color2);
|
| | | if (contrastRatio >= 7.1) {
|
| | | return 'AAA';
|
| | | }
|
| | |
|
| | | return (contrastRatio >= 4.5) ? 'AA' : '';
|
| | | },
|
| | |
|
| | | dark: function () {
|
| | | // YIQ equation from http://24ways.org/2010/calculating-color-contrast
|
| | | var rgb = this.values.rgb;
|
| | | var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
|
| | | return yiq < 128;
|
| | | },
|
| | |
|
| | | light: function () {
|
| | | return !this.dark();
|
| | | },
|
| | |
|
| | | negate: function () {
|
| | | var rgb = [];
|
| | | for (var i = 0; i < 3; i++) {
|
| | | rgb[i] = 255 - this.values.rgb[i];
|
| | | }
|
| | | this.setValues('rgb', rgb);
|
| | | return this;
|
| | | },
|
| | |
|
| | | lighten: function (ratio) {
|
| | | var hsl = this.values.hsl;
|
| | | hsl[2] += hsl[2] * ratio;
|
| | | this.setValues('hsl', hsl);
|
| | | return this;
|
| | | },
|
| | |
|
| | | darken: function (ratio) {
|
| | | var hsl = this.values.hsl;
|
| | | hsl[2] -= hsl[2] * ratio;
|
| | | this.setValues('hsl', hsl);
|
| | | return this;
|
| | | },
|
| | |
|
| | | saturate: function (ratio) {
|
| | | var hsl = this.values.hsl;
|
| | | hsl[1] += hsl[1] * ratio;
|
| | | this.setValues('hsl', hsl);
|
| | | return this;
|
| | | },
|
| | |
|
| | | desaturate: function (ratio) {
|
| | | var hsl = this.values.hsl;
|
| | | hsl[1] -= hsl[1] * ratio;
|
| | | this.setValues('hsl', hsl);
|
| | | return this;
|
| | | },
|
| | |
|
| | | whiten: function (ratio) {
|
| | | var hwb = this.values.hwb;
|
| | | hwb[1] += hwb[1] * ratio;
|
| | | this.setValues('hwb', hwb);
|
| | | return this;
|
| | | },
|
| | |
|
| | | blacken: function (ratio) {
|
| | | var hwb = this.values.hwb;
|
| | | hwb[2] += hwb[2] * ratio;
|
| | | this.setValues('hwb', hwb);
|
| | | return this;
|
| | | },
|
| | |
|
| | | greyscale: function () {
|
| | | var rgb = this.values.rgb;
|
| | | // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
|
| | | var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
|
| | | this.setValues('rgb', [val, val, val]);
|
| | | return this;
|
| | | },
|
| | |
|
| | | clearer: function (ratio) {
|
| | | var alpha = this.values.alpha;
|
| | | this.setValues('alpha', alpha - (alpha * ratio));
|
| | | return this;
|
| | | },
|
| | |
|
| | | opaquer: function (ratio) {
|
| | | var alpha = this.values.alpha;
|
| | | this.setValues('alpha', alpha + (alpha * ratio));
|
| | | return this;
|
| | | },
|
| | |
|
| | | rotate: function (degrees) {
|
| | | var hsl = this.values.hsl;
|
| | | var hue = (hsl[0] + degrees) % 360;
|
| | | hsl[0] = hue < 0 ? 360 + hue : hue;
|
| | | this.setValues('hsl', hsl);
|
| | | return this;
|
| | | },
|
| | |
|
| | | /**
|
| | | * Ported from sass implementation in C
|
| | | * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209
|
| | | */
|
| | | mix: function (mixinColor, weight) {
|
| | | var color1 = this;
|
| | | var color2 = mixinColor;
|
| | | var p = weight === undefined ? 0.5 : weight;
|
| | |
|
| | | var w = 2 * p - 1;
|
| | | var a = color1.alpha() - color2.alpha();
|
| | |
|
| | | var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
|
| | | var w2 = 1 - w1;
|
| | |
|
| | | return this
|
| | | .rgb(
|
| | | w1 * color1.red() + w2 * color2.red(),
|
| | | w1 * color1.green() + w2 * color2.green(),
|
| | | w1 * color1.blue() + w2 * color2.blue()
|
| | | )
|
| | | .alpha(color1.alpha() * p + color2.alpha() * (1 - p));
|
| | | },
|
| | |
|
| | | toJSON: function () {
|
| | | return this.rgb();
|
| | | },
|
| | |
|
| | | clone: function () {
|
| | | // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,
|
| | | // making the final build way to big to embed in Chart.js. So let's do it manually,
|
| | | // assuming that values to clone are 1 dimension arrays containing only numbers,
|
| | | // except 'alpha' which is a number.
|
| | | var result = new Color();
|
| | | var source = this.values;
|
| | | var target = result.values;
|
| | | var value, type;
|
| | |
|
| | | for (var prop in source) {
|
| | | if (source.hasOwnProperty(prop)) {
|
| | | value = source[prop];
|
| | | type = ({}).toString.call(value);
|
| | | if (type === '[object Array]') {
|
| | | target[prop] = value.slice(0);
|
| | | } else if (type === '[object Number]') {
|
| | | target[prop] = value;
|
| | | } else {
|
| | | console.error('unexpected color value:', value);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | return result;
|
| | | }
|
| | | };
|
| | |
|
| | | Color.prototype.spaces = {
|
| | | rgb: ['red', 'green', 'blue'],
|
| | | hsl: ['hue', 'saturation', 'lightness'],
|
| | | hsv: ['hue', 'saturation', 'value'],
|
| | | hwb: ['hue', 'whiteness', 'blackness'],
|
| | | cmyk: ['cyan', 'magenta', 'yellow', 'black']
|
| | | };
|
| | |
|
| | | Color.prototype.maxes = {
|
| | | rgb: [255, 255, 255],
|
| | | hsl: [360, 100, 100],
|
| | | hsv: [360, 100, 100],
|
| | | hwb: [360, 100, 100],
|
| | | cmyk: [100, 100, 100, 100]
|
| | | };
|
| | |
|
| | | Color.prototype.getValues = function (space) {
|
| | | var values = this.values;
|
| | | var vals = {};
|
| | |
|
| | | for (var i = 0; i < space.length; i++) {
|
| | | vals[space.charAt(i)] = values[space][i];
|
| | | }
|
| | |
|
| | | if (values.alpha !== 1) {
|
| | | vals.a = values.alpha;
|
| | | }
|
| | |
|
| | | // {r: 255, g: 255, b: 255, a: 0.4}
|
| | | return vals;
|
| | | };
|
| | |
|
| | | Color.prototype.setValues = function (space, vals) {
|
| | | var values = this.values;
|
| | | var spaces = this.spaces;
|
| | | var maxes = this.maxes;
|
| | | var alpha = 1;
|
| | | var i;
|
| | |
|
| | | if (space === 'alpha') {
|
| | | alpha = vals;
|
| | | } else if (vals.length) {
|
| | | // [10, 10, 10]
|
| | | values[space] = vals.slice(0, space.length);
|
| | | alpha = vals[space.length];
|
| | | } else if (vals[space.charAt(0)] !== undefined) {
|
| | | // {r: 10, g: 10, b: 10}
|
| | | for (i = 0; i < space.length; i++) {
|
| | | values[space][i] = vals[space.charAt(i)];
|
| | | }
|
| | |
|
| | | alpha = vals.a;
|
| | | } else if (vals[spaces[space][0]] !== undefined) {
|
| | | // {red: 10, green: 10, blue: 10}
|
| | | var chans = spaces[space];
|
| | |
|
| | | for (i = 0; i < space.length; i++) {
|
| | | values[space][i] = vals[chans[i]];
|
| | | }
|
| | |
|
| | | alpha = vals.alpha;
|
| | | }
|
| | |
|
| | | values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));
|
| | |
|
| | | if (space === 'alpha') {
|
| | | return false;
|
| | | }
|
| | |
|
| | | var capped;
|
| | |
|
| | | // cap values of the space prior converting all values
|
| | | for (i = 0; i < space.length; i++) {
|
| | | capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));
|
| | | values[space][i] = Math.round(capped);
|
| | | }
|
| | |
|
| | | // convert to all the other color spaces
|
| | | for (var sname in spaces) {
|
| | | if (sname !== space) {
|
| | | values[sname] = convert[space][sname](values[space]);
|
| | | }
|
| | | }
|
| | |
|
| | | return true;
|
| | | };
|
| | |
|
| | | Color.prototype.setSpace = function (space, args) {
|
| | | var vals = args[0];
|
| | |
|
| | | if (vals === undefined) {
|
| | | // color.rgb()
|
| | | return this.getValues(space);
|
| | | }
|
| | |
|
| | | // color.rgb(10, 10, 10)
|
| | | if (typeof vals === 'number') {
|
| | | vals = Array.prototype.slice.call(args);
|
| | | }
|
| | |
|
| | | this.setValues(space, vals);
|
| | | return this;
|
| | | };
|
| | |
|
| | | Color.prototype.setChannel = function (space, index, val) {
|
| | | var svalues = this.values[space];
|
| | | if (val === undefined) {
|
| | | // color.red()
|
| | | return svalues[index];
|
| | | } else if (val === svalues[index]) {
|
| | | // color.red(color.red())
|
| | | return this;
|
| | | }
|
| | |
|
| | | // color.red(100)
|
| | | svalues[index] = val;
|
| | | this.setValues(space, svalues);
|
| | |
|
| | | return this;
|
| | | };
|
| | |
|
| | | if (typeof window !== 'undefined') {
|
| | | window.Color = Color;
|
| | | }
|
| | |
|
| | | module.exports = Color;
|
| | | /* MIT license */ |
| | | var convert = require(4); |
| | | var string = require(1); |
| | | |
| | | var Color = function (obj) { |
| | | if (obj instanceof Color) { |
| | | return obj; |
| | | } |
| | | if (!(this instanceof Color)) { |
| | | return new Color(obj); |
| | | } |
| | | |
| | | this.values = { |
| | | rgb: [0, 0, 0], |
| | | hsl: [0, 0, 0], |
| | | hsv: [0, 0, 0], |
| | | hwb: [0, 0, 0], |
| | | cmyk: [0, 0, 0, 0], |
| | | alpha: 1 |
| | | }; |
| | | |
| | | // parse Color() argument |
| | | var vals; |
| | | if (typeof obj === 'string') { |
| | | vals = string.getRgba(obj); |
| | | if (vals) { |
| | | this.setValues('rgb', vals); |
| | | } else if (vals = string.getHsla(obj)) { |
| | | this.setValues('hsl', vals); |
| | | } else if (vals = string.getHwb(obj)) { |
| | | this.setValues('hwb', vals); |
| | | } else { |
| | | throw new Error('Unable to parse color from string "' + obj + '"'); |
| | | } |
| | | } else if (typeof obj === 'object') { |
| | | vals = obj; |
| | | if (vals.r !== undefined || vals.red !== undefined) { |
| | | this.setValues('rgb', vals); |
| | | } else if (vals.l !== undefined || vals.lightness !== undefined) { |
| | | this.setValues('hsl', vals); |
| | | } else if (vals.v !== undefined || vals.value !== undefined) { |
| | | this.setValues('hsv', vals); |
| | | } else if (vals.w !== undefined || vals.whiteness !== undefined) { |
| | | this.setValues('hwb', vals); |
| | | } else if (vals.c !== undefined || vals.cyan !== undefined) { |
| | | this.setValues('cmyk', vals); |
| | | } else { |
| | | throw new Error('Unable to parse color from object ' + JSON.stringify(obj)); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | Color.prototype = { |
| | | rgb: function () { |
| | | return this.setSpace('rgb', arguments); |
| | | }, |
| | | hsl: function () { |
| | | return this.setSpace('hsl', arguments); |
| | | }, |
| | | hsv: function () { |
| | | return this.setSpace('hsv', arguments); |
| | | }, |
| | | hwb: function () { |
| | | return this.setSpace('hwb', arguments); |
| | | }, |
| | | cmyk: function () { |
| | | return this.setSpace('cmyk', arguments); |
| | | }, |
| | | |
| | | rgbArray: function () { |
| | | return this.values.rgb; |
| | | }, |
| | | hslArray: function () { |
| | | return this.values.hsl; |
| | | }, |
| | | hsvArray: function () { |
| | | return this.values.hsv; |
| | | }, |
| | | hwbArray: function () { |
| | | var values = this.values; |
| | | if (values.alpha !== 1) { |
| | | return values.hwb.concat([values.alpha]); |
| | | } |
| | | return values.hwb; |
| | | }, |
| | | cmykArray: function () { |
| | | return this.values.cmyk; |
| | | }, |
| | | rgbaArray: function () { |
| | | var values = this.values; |
| | | return values.rgb.concat([values.alpha]); |
| | | }, |
| | | hslaArray: function () { |
| | | var values = this.values; |
| | | return values.hsl.concat([values.alpha]); |
| | | }, |
| | | alpha: function (val) { |
| | | if (val === undefined) { |
| | | return this.values.alpha; |
| | | } |
| | | this.setValues('alpha', val); |
| | | return this; |
| | | }, |
| | | |
| | | red: function (val) { |
| | | return this.setChannel('rgb', 0, val); |
| | | }, |
| | | green: function (val) { |
| | | return this.setChannel('rgb', 1, val); |
| | | }, |
| | | blue: function (val) { |
| | | return this.setChannel('rgb', 2, val); |
| | | }, |
| | | hue: function (val) { |
| | | if (val) { |
| | | val %= 360; |
| | | val = val < 0 ? 360 + val : val; |
| | | } |
| | | return this.setChannel('hsl', 0, val); |
| | | }, |
| | | saturation: function (val) { |
| | | return this.setChannel('hsl', 1, val); |
| | | }, |
| | | lightness: function (val) { |
| | | return this.setChannel('hsl', 2, val); |
| | | }, |
| | | saturationv: function (val) { |
| | | return this.setChannel('hsv', 1, val); |
| | | }, |
| | | whiteness: function (val) { |
| | | return this.setChannel('hwb', 1, val); |
| | | }, |
| | | blackness: function (val) { |
| | | return this.setChannel('hwb', 2, val); |
| | | }, |
| | | value: function (val) { |
| | | return this.setChannel('hsv', 2, val); |
| | | }, |
| | | cyan: function (val) { |
| | | return this.setChannel('cmyk', 0, val); |
| | | }, |
| | | magenta: function (val) { |
| | | return this.setChannel('cmyk', 1, val); |
| | | }, |
| | | yellow: function (val) { |
| | | return this.setChannel('cmyk', 2, val); |
| | | }, |
| | | black: function (val) { |
| | | return this.setChannel('cmyk', 3, val); |
| | | }, |
| | | |
| | | hexString: function () { |
| | | return string.hexString(this.values.rgb); |
| | | }, |
| | | rgbString: function () { |
| | | return string.rgbString(this.values.rgb, this.values.alpha); |
| | | }, |
| | | rgbaString: function () { |
| | | return string.rgbaString(this.values.rgb, this.values.alpha); |
| | | }, |
| | | percentString: function () { |
| | | return string.percentString(this.values.rgb, this.values.alpha); |
| | | }, |
| | | hslString: function () { |
| | | return string.hslString(this.values.hsl, this.values.alpha); |
| | | }, |
| | | hslaString: function () { |
| | | return string.hslaString(this.values.hsl, this.values.alpha); |
| | | }, |
| | | hwbString: function () { |
| | | return string.hwbString(this.values.hwb, this.values.alpha); |
| | | }, |
| | | keyword: function () { |
| | | return string.keyword(this.values.rgb, this.values.alpha); |
| | | }, |
| | | |
| | | rgbNumber: function () { |
| | | var rgb = this.values.rgb; |
| | | return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; |
| | | }, |
| | | |
| | | luminosity: function () { |
| | | // http://www.w3.org/TR/WCAG20/#relativeluminancedef |
| | | var rgb = this.values.rgb; |
| | | var lum = []; |
| | | for (var i = 0; i < rgb.length; i++) { |
| | | var chan = rgb[i] / 255; |
| | | lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); |
| | | } |
| | | return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; |
| | | }, |
| | | |
| | | contrast: function (color2) { |
| | | // http://www.w3.org/TR/WCAG20/#contrast-ratiodef |
| | | var lum1 = this.luminosity(); |
| | | var lum2 = color2.luminosity(); |
| | | if (lum1 > lum2) { |
| | | return (lum1 + 0.05) / (lum2 + 0.05); |
| | | } |
| | | return (lum2 + 0.05) / (lum1 + 0.05); |
| | | }, |
| | | |
| | | level: function (color2) { |
| | | var contrastRatio = this.contrast(color2); |
| | | if (contrastRatio >= 7.1) { |
| | | return 'AAA'; |
| | | } |
| | | |
| | | return (contrastRatio >= 4.5) ? 'AA' : ''; |
| | | }, |
| | | |
| | | dark: function () { |
| | | // YIQ equation from http://24ways.org/2010/calculating-color-contrast |
| | | var rgb = this.values.rgb; |
| | | var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; |
| | | return yiq < 128; |
| | | }, |
| | | |
| | | light: function () { |
| | | return !this.dark(); |
| | | }, |
| | | |
| | | negate: function () { |
| | | var rgb = []; |
| | | for (var i = 0; i < 3; i++) { |
| | | rgb[i] = 255 - this.values.rgb[i]; |
| | | } |
| | | this.setValues('rgb', rgb); |
| | | return this; |
| | | }, |
| | | |
| | | lighten: function (ratio) { |
| | | var hsl = this.values.hsl; |
| | | hsl[2] += hsl[2] * ratio; |
| | | this.setValues('hsl', hsl); |
| | | return this; |
| | | }, |
| | | |
| | | darken: function (ratio) { |
| | | var hsl = this.values.hsl; |
| | | hsl[2] -= hsl[2] * ratio; |
| | | this.setValues('hsl', hsl); |
| | | return this; |
| | | }, |
| | | |
| | | saturate: function (ratio) { |
| | | var hsl = this.values.hsl; |
| | | hsl[1] += hsl[1] * ratio; |
| | | this.setValues('hsl', hsl); |
| | | return this; |
| | | }, |
| | | |
| | | desaturate: function (ratio) { |
| | | var hsl = this.values.hsl; |
| | | hsl[1] -= hsl[1] * ratio; |
| | | this.setValues('hsl', hsl); |
| | | return this; |
| | | }, |
| | | |
| | | whiten: function (ratio) { |
| | | var hwb = this.values.hwb; |
| | | hwb[1] += hwb[1] * ratio; |
| | | this.setValues('hwb', hwb); |
| | | return this; |
| | | }, |
| | | |
| | | blacken: function (ratio) { |
| | | var hwb = this.values.hwb; |
| | | hwb[2] += hwb[2] * ratio; |
| | | this.setValues('hwb', hwb); |
| | | return this; |
| | | }, |
| | | |
| | | greyscale: function () { |
| | | var rgb = this.values.rgb; |
| | | // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale |
| | | var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; |
| | | this.setValues('rgb', [val, val, val]); |
| | | return this; |
| | | }, |
| | | |
| | | clearer: function (ratio) { |
| | | var alpha = this.values.alpha; |
| | | this.setValues('alpha', alpha - (alpha * ratio)); |
| | | return this; |
| | | }, |
| | | |
| | | opaquer: function (ratio) { |
| | | var alpha = this.values.alpha; |
| | | this.setValues('alpha', alpha + (alpha * ratio)); |
| | | return this; |
| | | }, |
| | | |
| | | rotate: function (degrees) { |
| | | var hsl = this.values.hsl; |
| | | var hue = (hsl[0] + degrees) % 360; |
| | | hsl[0] = hue < 0 ? 360 + hue : hue; |
| | | this.setValues('hsl', hsl); |
| | | return this; |
| | | }, |
| | | |
| | | /** |
| | | * Ported from sass implementation in C |
| | | * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 |
| | | */ |
| | | mix: function (mixinColor, weight) { |
| | | var color1 = this; |
| | | var color2 = mixinColor; |
| | | var p = weight === undefined ? 0.5 : weight; |
| | | |
| | | var w = 2 * p - 1; |
| | | var a = color1.alpha() - color2.alpha(); |
| | | |
| | | var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; |
| | | var w2 = 1 - w1; |
| | | |
| | | return this |
| | | .rgb( |
| | | w1 * color1.red() + w2 * color2.red(), |
| | | w1 * color1.green() + w2 * color2.green(), |
| | | w1 * color1.blue() + w2 * color2.blue() |
| | | ) |
| | | .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); |
| | | }, |
| | | |
| | | toJSON: function () { |
| | | return this.rgb(); |
| | | }, |
| | | |
| | | clone: function () { |
| | | // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, |
| | | // making the final build way to big to embed in Chart.js. So let's do it manually, |
| | | // assuming that values to clone are 1 dimension arrays containing only numbers, |
| | | // except 'alpha' which is a number. |
| | | var result = new Color(); |
| | | var source = this.values; |
| | | var target = result.values; |
| | | var value, type; |
| | | |
| | | for (var prop in source) { |
| | | if (source.hasOwnProperty(prop)) { |
| | | value = source[prop]; |
| | | type = ({}).toString.call(value); |
| | | if (type === '[object Array]') { |
| | | target[prop] = value.slice(0); |
| | | } else if (type === '[object Number]') { |
| | | target[prop] = value; |
| | | } else { |
| | | console.error('unexpected color value:', value); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | }; |
| | | |
| | | Color.prototype.spaces = { |
| | | rgb: ['red', 'green', 'blue'], |
| | | hsl: ['hue', 'saturation', 'lightness'], |
| | | hsv: ['hue', 'saturation', 'value'], |
| | | hwb: ['hue', 'whiteness', 'blackness'], |
| | | cmyk: ['cyan', 'magenta', 'yellow', 'black'] |
| | | }; |
| | | |
| | | Color.prototype.maxes = { |
| | | rgb: [255, 255, 255], |
| | | hsl: [360, 100, 100], |
| | | hsv: [360, 100, 100], |
| | | hwb: [360, 100, 100], |
| | | cmyk: [100, 100, 100, 100] |
| | | }; |
| | | |
| | | Color.prototype.getValues = function (space) { |
| | | var values = this.values; |
| | | var vals = {}; |
| | | |
| | | for (var i = 0; i < space.length; i++) { |
| | | vals[space.charAt(i)] = values[space][i]; |
| | | } |
| | | |
| | | if (values.alpha !== 1) { |
| | | vals.a = values.alpha; |
| | | } |
| | | |
| | | // {r: 255, g: 255, b: 255, a: 0.4} |
| | | return vals; |
| | | }; |
| | | |
| | | Color.prototype.setValues = function (space, vals) { |
| | | var values = this.values; |
| | | var spaces = this.spaces; |
| | | var maxes = this.maxes; |
| | | var alpha = 1; |
| | | var i; |
| | | |
| | | if (space === 'alpha') { |
| | | alpha = vals; |
| | | } else if (vals.length) { |
| | | // [10, 10, 10] |
| | | values[space] = vals.slice(0, space.length); |
| | | alpha = vals[space.length]; |
| | | } else if (vals[space.charAt(0)] !== undefined) { |
| | | // {r: 10, g: 10, b: 10} |
| | | for (i = 0; i < space.length; i++) { |
| | | values[space][i] = vals[space.charAt(i)]; |
| | | } |
| | | |
| | | alpha = vals.a; |
| | | } else if (vals[spaces[space][0]] !== undefined) { |
| | | // {red: 10, green: 10, blue: 10} |
| | | var chans = spaces[space]; |
| | | |
| | | for (i = 0; i < space.length; i++) { |
| | | values[space][i] = vals[chans[i]]; |
| | | } |
| | | |
| | | alpha = vals.alpha; |
| | | } |
| | | |
| | | values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); |
| | | |
| | | if (space === 'alpha') { |
| | | return false; |
| | | } |
| | | |
| | | var capped; |
| | | |
| | | // cap values of the space prior converting all values |
| | | for (i = 0; i < space.length; i++) { |
| | | capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); |
| | | values[space][i] = Math.round(capped); |
| | | } |
| | | |
| | | // convert to all the other color spaces |
| | | for (var sname in spaces) { |
| | | if (sname !== space) { |
| | | values[sname] = convert[space][sname](values[space]); |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | }; |
| | | |
| | | Color.prototype.setSpace = function (space, args) { |
| | | var vals = args[0]; |
| | | |
| | | if (vals === undefined) { |
| | | // color.rgb() |
| | | return this.getValues(space); |
| | | } |
| | | |
| | | // color.rgb(10, 10, 10) |
| | | if (typeof vals === 'number') { |
| | | vals = Array.prototype.slice.call(args); |
| | | } |
| | | |
| | | this.setValues(space, vals); |
| | | return this; |
| | | }; |
| | | |
| | | Color.prototype.setChannel = function (space, index, val) { |
| | | var svalues = this.values[space]; |
| | | if (val === undefined) { |
| | | // color.red() |
| | | return svalues[index]; |
| | | } else if (val === svalues[index]) { |
| | | // color.red(color.red()) |
| | | return this; |
| | | } |
| | | |
| | | // color.red(100) |
| | | svalues[index] = val; |
| | | this.setValues(space, svalues); |
| | | |
| | | return this; |
| | | }; |
| | | |
| | | if (typeof window !== 'undefined') { |
| | | window.Color = Color; |
| | | } |
| | | |
| | | module.exports = Color; |
| | | |
| | | },{"1":1,"4":4}],3:[function(require,module,exports){ |
| | | /* MIT license */ |
| | |
| | | |
| | | module.exports = convert; |
| | | },{"3":3}],5:[function(require,module,exports){ |
| | | module.exports = {
|
| | | "aliceblue": [240, 248, 255],
|
| | | "antiquewhite": [250, 235, 215],
|
| | | "aqua": [0, 255, 255],
|
| | | "aquamarine": [127, 255, 212],
|
| | | "azure": [240, 255, 255],
|
| | | "beige": [245, 245, 220],
|
| | | "bisque": [255, 228, 196],
|
| | | "black": [0, 0, 0],
|
| | | "blanchedalmond": [255, 235, 205],
|
| | | "blue": [0, 0, 255],
|
| | | "blueviolet": [138, 43, 226],
|
| | | "brown": [165, 42, 42],
|
| | | "burlywood": [222, 184, 135],
|
| | | "cadetblue": [95, 158, 160],
|
| | | "chartreuse": [127, 255, 0],
|
| | | "chocolate": [210, 105, 30],
|
| | | "coral": [255, 127, 80],
|
| | | "cornflowerblue": [100, 149, 237],
|
| | | "cornsilk": [255, 248, 220],
|
| | | "crimson": [220, 20, 60],
|
| | | "cyan": [0, 255, 255],
|
| | | "darkblue": [0, 0, 139],
|
| | | "darkcyan": [0, 139, 139],
|
| | | "darkgoldenrod": [184, 134, 11],
|
| | | "darkgray": [169, 169, 169],
|
| | | "darkgreen": [0, 100, 0],
|
| | | "darkgrey": [169, 169, 169],
|
| | | "darkkhaki": [189, 183, 107],
|
| | | "darkmagenta": [139, 0, 139],
|
| | | "darkolivegreen": [85, 107, 47],
|
| | | "darkorange": [255, 140, 0],
|
| | | "darkorchid": [153, 50, 204],
|
| | | "darkred": [139, 0, 0],
|
| | | "darksalmon": [233, 150, 122],
|
| | | "darkseagreen": [143, 188, 143],
|
| | | "darkslateblue": [72, 61, 139],
|
| | | "darkslategray": [47, 79, 79],
|
| | | "darkslategrey": [47, 79, 79],
|
| | | "darkturquoise": [0, 206, 209],
|
| | | "darkviolet": [148, 0, 211],
|
| | | "deeppink": [255, 20, 147],
|
| | | "deepskyblue": [0, 191, 255],
|
| | | "dimgray": [105, 105, 105],
|
| | | "dimgrey": [105, 105, 105],
|
| | | "dodgerblue": [30, 144, 255],
|
| | | "firebrick": [178, 34, 34],
|
| | | "floralwhite": [255, 250, 240],
|
| | | "forestgreen": [34, 139, 34],
|
| | | "fuchsia": [255, 0, 255],
|
| | | "gainsboro": [220, 220, 220],
|
| | | "ghostwhite": [248, 248, 255],
|
| | | "gold": [255, 215, 0],
|
| | | "goldenrod": [218, 165, 32],
|
| | | "gray": [128, 128, 128],
|
| | | "green": [0, 128, 0],
|
| | | "greenyellow": [173, 255, 47],
|
| | | "grey": [128, 128, 128],
|
| | | "honeydew": [240, 255, 240],
|
| | | "hotpink": [255, 105, 180],
|
| | | "indianred": [205, 92, 92],
|
| | | "indigo": [75, 0, 130],
|
| | | "ivory": [255, 255, 240],
|
| | | "khaki": [240, 230, 140],
|
| | | "lavender": [230, 230, 250],
|
| | | "lavenderblush": [255, 240, 245],
|
| | | "lawngreen": [124, 252, 0],
|
| | | "lemonchiffon": [255, 250, 205],
|
| | | "lightblue": [173, 216, 230],
|
| | | "lightcoral": [240, 128, 128],
|
| | | "lightcyan": [224, 255, 255],
|
| | | "lightgoldenrodyellow": [250, 250, 210],
|
| | | "lightgray": [211, 211, 211],
|
| | | "lightgreen": [144, 238, 144],
|
| | | "lightgrey": [211, 211, 211],
|
| | | "lightpink": [255, 182, 193],
|
| | | "lightsalmon": [255, 160, 122],
|
| | | "lightseagreen": [32, 178, 170],
|
| | | "lightskyblue": [135, 206, 250],
|
| | | "lightslategray": [119, 136, 153],
|
| | | "lightslategrey": [119, 136, 153],
|
| | | "lightsteelblue": [176, 196, 222],
|
| | | "lightyellow": [255, 255, 224],
|
| | | "lime": [0, 255, 0],
|
| | | "limegreen": [50, 205, 50],
|
| | | "linen": [250, 240, 230],
|
| | | "magenta": [255, 0, 255],
|
| | | "maroon": [128, 0, 0],
|
| | | "mediumaquamarine": [102, 205, 170],
|
| | | "mediumblue": [0, 0, 205],
|
| | | "mediumorchid": [186, 85, 211],
|
| | | "mediumpurple": [147, 112, 219],
|
| | | "mediumseagreen": [60, 179, 113],
|
| | | "mediumslateblue": [123, 104, 238],
|
| | | "mediumspringgreen": [0, 250, 154],
|
| | | "mediumturquoise": [72, 209, 204],
|
| | | "mediumvioletred": [199, 21, 133],
|
| | | "midnightblue": [25, 25, 112],
|
| | | "mintcream": [245, 255, 250],
|
| | | "mistyrose": [255, 228, 225],
|
| | | "moccasin": [255, 228, 181],
|
| | | "navajowhite": [255, 222, 173],
|
| | | "navy": [0, 0, 128],
|
| | | "oldlace": [253, 245, 230],
|
| | | "olive": [128, 128, 0],
|
| | | "olivedrab": [107, 142, 35],
|
| | | "orange": [255, 165, 0],
|
| | | "orangered": [255, 69, 0],
|
| | | "orchid": [218, 112, 214],
|
| | | "palegoldenrod": [238, 232, 170],
|
| | | "palegreen": [152, 251, 152],
|
| | | "paleturquoise": [175, 238, 238],
|
| | | "palevioletred": [219, 112, 147],
|
| | | "papayawhip": [255, 239, 213],
|
| | | "peachpuff": [255, 218, 185],
|
| | | "peru": [205, 133, 63],
|
| | | "pink": [255, 192, 203],
|
| | | "plum": [221, 160, 221],
|
| | | "powderblue": [176, 224, 230],
|
| | | "purple": [128, 0, 128],
|
| | | "rebeccapurple": [102, 51, 153],
|
| | | "red": [255, 0, 0],
|
| | | "rosybrown": [188, 143, 143],
|
| | | "royalblue": [65, 105, 225],
|
| | | "saddlebrown": [139, 69, 19],
|
| | | "salmon": [250, 128, 114],
|
| | | "sandybrown": [244, 164, 96],
|
| | | "seagreen": [46, 139, 87],
|
| | | "seashell": [255, 245, 238],
|
| | | "sienna": [160, 82, 45],
|
| | | "silver": [192, 192, 192],
|
| | | "skyblue": [135, 206, 235],
|
| | | "slateblue": [106, 90, 205],
|
| | | "slategray": [112, 128, 144],
|
| | | "slategrey": [112, 128, 144],
|
| | | "snow": [255, 250, 250],
|
| | | "springgreen": [0, 255, 127],
|
| | | "steelblue": [70, 130, 180],
|
| | | "tan": [210, 180, 140],
|
| | | "teal": [0, 128, 128],
|
| | | "thistle": [216, 191, 216],
|
| | | "tomato": [255, 99, 71],
|
| | | "turquoise": [64, 224, 208],
|
| | | "violet": [238, 130, 238],
|
| | | "wheat": [245, 222, 179],
|
| | | "white": [255, 255, 255],
|
| | | "whitesmoke": [245, 245, 245],
|
| | | "yellow": [255, 255, 0],
|
| | | "yellowgreen": [154, 205, 50]
|
| | | module.exports = { |
| | | "aliceblue": [240, 248, 255], |
| | | "antiquewhite": [250, 235, 215], |
| | | "aqua": [0, 255, 255], |
| | | "aquamarine": [127, 255, 212], |
| | | "azure": [240, 255, 255], |
| | | "beige": [245, 245, 220], |
| | | "bisque": [255, 228, 196], |
| | | "black": [0, 0, 0], |
| | | "blanchedalmond": [255, 235, 205], |
| | | "blue": [0, 0, 255], |
| | | "blueviolet": [138, 43, 226], |
| | | "brown": [165, 42, 42], |
| | | "burlywood": [222, 184, 135], |
| | | "cadetblue": [95, 158, 160], |
| | | "chartreuse": [127, 255, 0], |
| | | "chocolate": [210, 105, 30], |
| | | "coral": [255, 127, 80], |
| | | "cornflowerblue": [100, 149, 237], |
| | | "cornsilk": [255, 248, 220], |
| | | "crimson": [220, 20, 60], |
| | | "cyan": [0, 255, 255], |
| | | "darkblue": [0, 0, 139], |
| | | "darkcyan": [0, 139, 139], |
| | | "darkgoldenrod": [184, 134, 11], |
| | | "darkgray": [169, 169, 169], |
| | | "darkgreen": [0, 100, 0], |
| | | "darkgrey": [169, 169, 169], |
| | | "darkkhaki": [189, 183, 107], |
| | | "darkmagenta": [139, 0, 139], |
| | | "darkolivegreen": [85, 107, 47], |
| | | "darkorange": [255, 140, 0], |
| | | "darkorchid": [153, 50, 204], |
| | | "darkred": [139, 0, 0], |
| | | "darksalmon": [233, 150, 122], |
| | | "darkseagreen": [143, 188, 143], |
| | | "darkslateblue": [72, 61, 139], |
| | | "darkslategray": [47, 79, 79], |
| | | "darkslategrey": [47, 79, 79], |
| | | "darkturquoise": [0, 206, 209], |
| | | "darkviolet": [148, 0, 211], |
| | | "deeppink": [255, 20, 147], |
| | | "deepskyblue": [0, 191, 255], |
| | | "dimgray": [105, 105, 105], |
| | | "dimgrey": [105, 105, 105], |
| | | "dodgerblue": [30, 144, 255], |
| | | "firebrick": [178, 34, 34], |
| | | "floralwhite": [255, 250, 240], |
| | | "forestgreen": [34, 139, 34], |
| | | "fuchsia": [255, 0, 255], |
| | | "gainsboro": [220, 220, 220], |
| | | "ghostwhite": [248, 248, 255], |
| | | "gold": [255, 215, 0], |
| | | "goldenrod": [218, 165, 32], |
| | | "gray": [128, 128, 128], |
| | | "green": [0, 128, 0], |
| | | "greenyellow": [173, 255, 47], |
| | | "grey": [128, 128, 128], |
| | | "honeydew": [240, 255, 240], |
| | | "hotpink": [255, 105, 180], |
| | | "indianred": [205, 92, 92], |
| | | "indigo": [75, 0, 130], |
| | | "ivory": [255, 255, 240], |
| | | "khaki": [240, 230, 140], |
| | | "lavender": [230, 230, 250], |
| | | "lavenderblush": [255, 240, 245], |
| | | "lawngreen": [124, 252, 0], |
| | | "lemonchiffon": [255, 250, 205], |
| | | "lightblue": [173, 216, 230], |
| | | "lightcoral": [240, 128, 128], |
| | | "lightcyan": [224, 255, 255], |
| | | "lightgoldenrodyellow": [250, 250, 210], |
| | | "lightgray": [211, 211, 211], |
| | | "lightgreen": [144, 238, 144], |
| | | "lightgrey": [211, 211, 211], |
| | | "lightpink": [255, 182, 193], |
| | | "lightsalmon": [255, 160, 122], |
| | | "lightseagreen": [32, 178, 170], |
| | | "lightskyblue": [135, 206, 250], |
| | | "lightslategray": [119, 136, 153], |
| | | "lightslategrey": [119, 136, 153], |
| | | "lightsteelblue": [176, 196, 222], |
| | | "lightyellow": [255, 255, 224], |
| | | "lime": [0, 255, 0], |
| | | "limegreen": [50, 205, 50], |
| | | "linen": [250, 240, 230], |
| | | "magenta": [255, 0, 255], |
| | | "maroon": [128, 0, 0], |
| | | "mediumaquamarine": [102, 205, 170], |
| | | "mediumblue": [0, 0, 205], |
| | | "mediumorchid": [186, 85, 211], |
| | | "mediumpurple": [147, 112, 219], |
| | | "mediumseagreen": [60, 179, 113], |
| | | "mediumslateblue": [123, 104, 238], |
| | | "mediumspringgreen": [0, 250, 154], |
| | | "mediumturquoise": [72, 209, 204], |
| | | "mediumvioletred": [199, 21, 133], |
| | | "midnightblue": [25, 25, 112], |
| | | "mintcream": [245, 255, 250], |
| | | "mistyrose": [255, 228, 225], |
| | | "moccasin": [255, 228, 181], |
| | | "navajowhite": [255, 222, 173], |
| | | "navy": [0, 0, 128], |
| | | "oldlace": [253, 245, 230], |
| | | "olive": [128, 128, 0], |
| | | "olivedrab": [107, 142, 35], |
| | | "orange": [255, 165, 0], |
| | | "orangered": [255, 69, 0], |
| | | "orchid": [218, 112, 214], |
| | | "palegoldenrod": [238, 232, 170], |
| | | "palegreen": [152, 251, 152], |
| | | "paleturquoise": [175, 238, 238], |
| | | "palevioletred": [219, 112, 147], |
| | | "papayawhip": [255, 239, 213], |
| | | "peachpuff": [255, 218, 185], |
| | | "peru": [205, 133, 63], |
| | | "pink": [255, 192, 203], |
| | | "plum": [221, 160, 221], |
| | | "powderblue": [176, 224, 230], |
| | | "purple": [128, 0, 128], |
| | | "rebeccapurple": [102, 51, 153], |
| | | "red": [255, 0, 0], |
| | | "rosybrown": [188, 143, 143], |
| | | "royalblue": [65, 105, 225], |
| | | "saddlebrown": [139, 69, 19], |
| | | "salmon": [250, 128, 114], |
| | | "sandybrown": [244, 164, 96], |
| | | "seagreen": [46, 139, 87], |
| | | "seashell": [255, 245, 238], |
| | | "sienna": [160, 82, 45], |
| | | "silver": [192, 192, 192], |
| | | "skyblue": [135, 206, 235], |
| | | "slateblue": [106, 90, 205], |
| | | "slategray": [112, 128, 144], |
| | | "slategrey": [112, 128, 144], |
| | | "snow": [255, 250, 250], |
| | | "springgreen": [0, 255, 127], |
| | | "steelblue": [70, 130, 180], |
| | | "tan": [210, 180, 140], |
| | | "teal": [0, 128, 128], |
| | | "thistle": [216, 191, 216], |
| | | "tomato": [255, 99, 71], |
| | | "turquoise": [64, 224, 208], |
| | | "violet": [238, 130, 238], |
| | | "wheat": [245, 222, 179], |
| | | "white": [255, 255, 255], |
| | | "whitesmoke": [245, 245, 245], |
| | | "yellow": [255, 255, 0], |
| | | "yellowgreen": [154, 205, 50] |
| | | }; |
| | | },{}],6:[function(require,module,exports){ |
| | | //! moment.js |