UNPKG

gradient

Version:

A class for generating gradients.

1,855 lines (1,570 loc) 54.5 kB
/* MIT license */ var Color = (function() {var require = function (file, cwd) { var resolved = require.resolve(file, cwd || '/'); var mod = require.modules[resolved]; if (!mod) throw new Error( 'Failed to resolve module ' + file + ', tried ' + resolved ); var res = mod._cached ? mod._cached : mod(); return res; } var __require = require; require.paths = []; require.modules = {}; require.extensions = [".js",".coffee"]; require.resolve = (function () { var core = [ 'assert', 'events', 'fs', 'path', 'vm' ] .reduce(function (acc, x) { acc[x] = true; return acc; }, {}) ; return function (x, cwd) { if (!cwd) cwd = '/'; if (core[x]) return x; var path = require.modules.path(); var y = cwd || '.'; if (x.match(/^(?:\.\.?\/|\/)/)) { var m = loadAsFileSync(path.resolve(y, x)) || loadAsDirectorySync(path.resolve(y, x)); if (m) return m; } var n = loadNodeModulesSync(x, y); if (n) return n; throw new Error("Cannot find module '" + x + "'"); function loadAsFileSync (x) { if (require.modules[x]) { return x; } for (var i = 0; i < require.extensions.length; i++) { var ext = require.extensions[i]; if (require.modules[x + ext]) return x + ext; } } function loadAsDirectorySync (x) { x = x.replace(/\/+$/, ''); var pkgfile = x + '/package.json'; if (require.modules[pkgfile]) { var pkg = require.modules[pkgfile](); var b = pkg.browserify; if (typeof b === 'object' && b.main) { var m = loadAsFileSync(path.resolve(x, b.main)); if (m) return m; } else if (typeof b === 'string') { var m = loadAsFileSync(path.resolve(x, b)); if (m) return m; } else if (pkg.main) { var m = loadAsFileSync(path.resolve(x, pkg.main)); if (m) return m; } } return loadAsFileSync(x + '/index'); } function loadNodeModulesSync (x, start) { var dirs = nodeModulesPathsSync(start); for (var i = 0; i < dirs.length; i++) { var dir = dirs[i]; var m = loadAsFileSync(dir + '/' + x); if (m) return m; var n = loadAsDirectorySync(dir + '/' + x); if (n) return n; } var m = loadAsFileSync(x); if (m) return m; } function nodeModulesPathsSync (start) { var parts; if (start === '/') parts = [ '' ]; else parts = path.normalize(start).split(/\/+/); var dirs = []; for (var i = parts.length - 1; i >= 0; i--) { if (parts[i] === 'node_modules') continue; var dir = parts.slice(0, i + 1).join('/') + '/node_modules'; dirs.push(dir); } return dirs; } }; })(); require.alias = function (from, to) { var path = require.modules.path(); var res = null; try { res = require.resolve(from + '/package.json', '/'); } catch (err) { res = require.resolve(from, '/'); } var basedir = path.dirname(res); Object.keys(require.modules) .forEach(function (x) { if (x.slice(0, basedir.length + 1) === basedir + '/') { var f = x.slice(basedir.length); require.modules[to + f] = require.modules[basedir + f]; } else if (x === basedir) { require.modules[to] = require.modules[basedir]; } }) ; }; if (typeof process === 'undefined') process = {}; if (!process.nextTick) process.nextTick = function (fn) { setTimeout(fn, 0); }; if (!process.title) process.title = 'browser'; if (!process.binding) process.binding = function (name) { if (name === 'evals') return require('vm') else throw new Error('No such module') }; if (!process.cwd) process.cwd = function () { return '.' }; require.modules["path"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "."; var __filename = "path"; var require = function (file) { return __require(file, "."); }; require.resolve = function (file) { return __require.resolve(name, "."); }; require.modules = __require.modules; __require.modules["path"]._cached = module.exports; (function () { // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length; i >= 0; i--) { var last = parts[i]; if (last == '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // Regex to split a filename into [*, dir, basename, ext] // posix version var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/; // path.resolve([from ...], to) // posix version exports.resolve = function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string' || !path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(resolvedPath.split('/').filter(function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function(path) { var isAbsolute = path.charAt(0) === '/', trailingSlash = path.slice(-1) === '/'; // Normalize the path path = normalizeArray(path.split('/').filter(function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.join = function() { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(paths.filter(function(p, index) { return p && typeof p === 'string'; }).join('/')); }; exports.dirname = function(path) { var dir = splitPathRe.exec(path)[1] || ''; var isWindows = false; if (!dir) { // No dirname return '.'; } else if (dir.length === 1 || (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) { // It is just a slash or a drive letter with a slash return dir; } else { // It is a full dirname, strip trailing slash return dir.substring(0, dir.length - 1); } }; exports.basename = function(path, ext) { var f = splitPathRe.exec(path)[2] || ''; // TODO: make this comparison case-insensitive on windows? if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function(path) { return splitPathRe.exec(path)[3] || ''; }; ; }).call(module.exports); __require.modules["path"]._cached = module.exports; return module.exports; }; require.modules["/gradient.js"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "/"; var __filename = "/gradient.js"; var require = function (file) { return __require(file, "/"); }; require.resolve = function (file) { return __require.resolve(name, "/"); }; require.modules = __require.modules; __require.modules["/gradient.js"]._cached = module.exports; (function () { var sets = function(xs) { var loop = function(acc, i) { if (i == xs.length || !xs[i+1]) { return acc; } acc.push([xs[i], xs[i+1]]); return loop(acc, i + 1); } return loop([], 0); }; // ------------------------------------------------------------------------ // var Color = require('color') , Gradient = function(/* [color1, color2, steps] -or- [[array], steps] */) { var args = arguments[0]; this.stops = []; this.steps = 2; // Slice up arguments if (Object.prototype.toString.call(args[0]) === '[object Array]') { for (var i = 0; i < (args[0].length); i++) { this.stops.push(Color(args[0][i])); } this.steps = args[1]; } else { for (var i = 0; i < (args.length - 1); i++) { this.stops.push(Color(args[i])); } this.steps = args[args.length - 1]; } }; (function(obj){ // Build given number of steps, including start and end var buildSteps = function(start, end, span) { var steps = [start]; if (span < 0) { steps.push(end); for (var i = 0; i < Math.abs(span); i++) { steps.pop(); } } else { var base = { h: start.hue(), s: start.saturation(), l: start.lightness(), a: start.alpha() }; var delta = { h: (base.h - end.hue()) / span, s: (base.s - end.saturation()) / span, l: (base.l - end.lightness()) / span, a: (base.a - end.alpha()) / span }; for (var i = 1; i <= span; i++) { var h = base.h - (delta.h * i); var s = base.s - (delta.s * i); var l = base.l - (delta.l * i); var a = base.a - (delta.a * i); // Round out values if (h > 360) { h -= 360; } else if (h < 0) { h += 360; } if (s > 100) { s = 100; } else if (s < 0) { s = 0; } if (l > 100) { l = 100; } else if (l < 0) { l = 0; } if (a > 1) { a = 1; } else if (a < 0) { a = 0; } // Build new color object var c = Color().hue(h).saturation(s).lightness(l).alpha(a); steps.push(c); } steps.push(end); } return steps; }; // To array obj.toArray = function(format) { // Generate gradient steps if (typeof this.__cache === 'undefined') { var stops = this.stops; var steps = this.steps; var overflow = Math.floor(stops.length / 2); var cs = []; sets(stops).forEach(function(x){ // Determine step span for set var span; if (stops.length === 2) { span = steps; } else { span = Math.floor(steps / (stops.length - 1)); if (overflow > 0 && steps % (stops.length - 1) != 0) { span += 1; overflow--; } } // Don't double count the start/end span -= 2; // Generate colors for this set cs = cs.concat(buildSteps(x[0], x[1], span)); }); this.__cache = cs; } // Return in specified format if (typeof format !== 'undefined') { return this.__cache.map(function(x){ return x[format](); }); } else { return this.__cache; } }; }(Gradient.prototype)); module.exports = function() { return new Gradient(Array.prototype.slice.call(arguments,0)); }; ; }).call(module.exports); __require.modules["/gradient.js"]._cached = module.exports; return module.exports; }; require.modules["color/package.json"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "color"; var __filename = "color/package.json"; var require = function (file) { return __require(file, "color"); }; require.resolve = function (file) { return __require.resolve(name, "color"); }; require.modules = __require.modules; __require.modules["color/package.json"]._cached = module.exports; (function () { module.exports = {"name":"color","description":"Color conversion and manipulation with CSS string support","version":"0.7.1","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/color.git"},"main":"./color","dependencies":{"color-convert":"0.5.x","color-string":"0.2.x"},"devDependencies":{"nomnom":"~1.5.2","browserify":"~2.18.1","grunt":"~0.4.1","grunt-contrib-uglify":"~0.2.0"},"keywords":["color","colour","css"],"bugs":{"url":"https://github.com/harthur/color/issues"},"homepage":"https://github.com/harthur/color","_id":"color@0.7.1","dist":{"shasum":"a2676f19c6ccb708b7586dc98b5c6e37dc9a199c","tarball":"http://registry.npmjs.org/color/-/color-0.7.1.tgz"},"_from":"color@>=0.4.0","_npmVersion":"1.3.25","_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}],"directories":{},"_shasum":"a2676f19c6ccb708b7586dc98b5c6e37dc9a199c","_resolved":"https://registry.npmjs.org/color/-/color-0.7.1.tgz"}; }).call(module.exports); __require.modules["color/package.json"]._cached = module.exports; return module.exports; }; require.modules["color"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "."; var __filename = "color"; var require = function (file) { return __require(file, "."); }; require.resolve = function (file) { return __require.resolve(name, "."); }; require.modules = __require.modules; __require.modules["color"]._cached = module.exports; (function () { /* MIT license */ var convert = require("color-convert"), string = require("color-string"); module.exports = function(cssString) { return new Color(cssString); }; var Color = function(cssString) { 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 if (typeof cssString == "string") { var vals = string.getRgba(cssString); if (vals) { this.setValues("rgb", vals); } else if(vals = string.getHsla(cssString)) { this.setValues("hsl", vals); } else if(vals = string.getHwb(cssString)) { this.setValues("hwb", vals); } else { throw new Error("Unable to parse color from string " + cssString); } } else if (typeof cssString == "object") { var vals = cssString; 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(cssString)); } } } Color.prototype = { rgb: function (vals) { return this.setSpace("rgb", arguments); }, hsl: function(vals) { return this.setSpace("hsl", arguments); }, hsv: function(vals) { return this.setSpace("hsv", arguments); }, hwb: function(vals) { return this.setSpace("hwb", arguments); }, cmyk: function(vals) { 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() { if (this.values.alpha !== 1) { return this.values.hwb.concat([this.values.alpha]) } return this.values.hwb; }, cmykArray: function() { return this.values.cmyk; }, rgbaArray: function() { var rgb = this.values.rgb; return rgb.concat([this.values.alpha]); }, hslaArray: function() { var hsl = this.values.hsl; return hsl.concat([this.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) { 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); }, 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); return (contrastRatio >= 7.1) ? 'AAA' : (contrastRatio >= 4.5) ? 'AA' : ''; }, dark: function() { // YIQ equation from http://24ways.org/2010/calculating-color-contrast var rgb = this.values.rgb, 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) { this.values.hsl[2] += this.values.hsl[2] * ratio; this.setValues("hsl", this.values.hsl); return this; }, darken: function(ratio) { this.values.hsl[2] -= this.values.hsl[2] * ratio; this.setValues("hsl", this.values.hsl); return this; }, saturate: function(ratio) { this.values.hsl[1] += this.values.hsl[1] * ratio; this.setValues("hsl", this.values.hsl); return this; }, desaturate: function(ratio) { this.values.hsl[1] -= this.values.hsl[1] * ratio; this.setValues("hsl", this.values.hsl); return this; }, whiten: function(ratio) { this.values.hwb[1] += this.values.hwb[1] * ratio; this.setValues("hwb", this.values.hwb); return this; }, blacken: function(ratio) { this.values.hwb[2] += this.values.hwb[2] * ratio; this.setValues("hwb", this.values.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) { this.setValues("alpha", this.values.alpha - (this.values.alpha * ratio)); return this; }, opaquer: function(ratio) { this.setValues("alpha", this.values.alpha + (this.values.alpha * ratio)); return this; }, rotate: function(degrees) { var hue = this.values.hsl[0]; hue = (hue + degrees) % 360; hue = hue < 0 ? 360 + hue : hue; this.values.hsl[0] = hue; this.setValues("hsl", this.values.hsl); return this; }, mix: function(color2, weight) { weight = 1 - (weight == null ? 0.5 : weight); // algorithm from Sass's mix(). Ratio of first color in mix is // determined by the alphas of both colors and the weight var t1 = weight * 2 - 1, d = this.alpha() - color2.alpha(); var weight1 = (((t1 * d == -1) ? t1 : (t1 + d) / (1 + t1 * d)) + 1) / 2; var weight2 = 1 - weight1; var rgb = this.rgbArray(); var rgb2 = color2.rgbArray(); for (var i = 0; i < rgb.length; i++) { rgb[i] = rgb[i] * weight1 + rgb2[i] * weight2; } this.setValues("rgb", rgb); var alpha = this.alpha() * weight + color2.alpha() * (1 - weight); this.setValues("alpha", alpha); return this; }, toJSON: function() { return this.rgb(); }, clone: function() { return new Color(this.rgb()); } } Color.prototype.getValues = function(space) { var vals = {}; for (var i = 0; i < space.length; i++) { vals[space[i]] = this.values[space][i]; } if (this.values.alpha != 1) { vals["a"] = this.values.alpha; } // {r: 255, g: 255, b: 255, a: 0.4} return vals; } Color.prototype.setValues = function(space, vals) { var spaces = { "rgb": ["red", "green", "blue"], "hsl": ["hue", "saturation", "lightness"], "hsv": ["hue", "saturation", "value"], "hwb": ["hue", "whiteness", "blackness"], "cmyk": ["cyan", "magenta", "yellow", "black"] }; var maxes = { "rgb": [255, 255, 255], "hsl": [360, 100, 100], "hsv": [360, 100, 100], "hwb": [360, 100, 100], "cmyk": [100, 100, 100, 100] }; var alpha = 1; if (space == "alpha") { alpha = vals; } else if (vals.length) { // [10, 10, 10] this.values[space] = vals.slice(0, space.length); alpha = vals[space.length]; } else if (vals[space[0]] !== undefined) { // {r: 10, g: 10, b: 10} for (var i = 0; i < space.length; i++) { this.values[space][i] = vals[space[i]]; } alpha = vals.a; } else if (vals[spaces[space][0]] !== undefined) { // {red: 10, green: 10, blue: 10} var chans = spaces[space]; for (var i = 0; i < space.length; i++) { this.values[space][i] = vals[chans[i]]; } alpha = vals.alpha; } this.values.alpha = Math.max(0, Math.min(1, (alpha !== undefined ? alpha : this.values.alpha) )); if (space == "alpha") { return; } // cap values of the space prior converting all values for (var i = 0; i < space.length; i++) { var capped = Math.max(0, Math.min(maxes[space][i], this.values[space][i])); this.values[space][i] = Math.round(capped); } // convert to all the other color spaces for (var sname in spaces) { if (sname != space) { this.values[sname] = convert[space][sname](this.values[space]) } // cap values for (var i = 0; i < sname.length; i++) { var capped = Math.max(0, Math.min(maxes[sname][i], this.values[sname][i])); this.values[sname][i] = Math.round(capped); } } 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) { if (val === undefined) { // color.red() return this.values[space][index]; } // color.red(100) this.values[space][index] = val; this.setValues(space, this.values[space]); return this; } ; }).call(module.exports); __require.modules["color"]._cached = module.exports; return module.exports; }; require.modules["color/node_modules/color-convert/package.json"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "color/node_modules/color-convert"; var __filename = "color/node_modules/color-convert/package.json"; var require = function (file) { return __require(file, "color/node_modules/color-convert"); }; require.resolve = function (file) { return __require.resolve(name, "color/node_modules/color-convert"); }; require.modules = __require.modules; __require.modules["color/node_modules/color-convert/package.json"]._cached = module.exports; (function () { module.exports = {"name":"color-convert","description":"Plain color conversion functions","version":"0.5.0","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/color-convert.git"},"main":"./index","devDependencies":{"browserify":">=1.0.0","uglify-js":"1.0.x"},"keywords":["color","colour","rgb"],"bugs":{"url":"https://github.com/harthur/color-convert/issues"},"homepage":"https://github.com/harthur/color-convert","_id":"color-convert@0.5.0","_shasum":"4032cab2128c81670c7b394d77b6783f49caaaf7","_from":"color-convert@>=0.5.0 <0.6.0","_npmVersion":"1.4.9","_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}],"dist":{"shasum":"4032cab2128c81670c7b394d77b6783f49caaaf7","tarball":"http://registry.npmjs.org/color-convert/-/color-convert-0.5.0.tgz"},"directories":{},"_resolved":"https://registry.npmjs.org/color-convert/-/color-convert-0.5.0.tgz"}; }).call(module.exports); __require.modules["color/node_modules/color-convert/package.json"]._cached = module.exports; return module.exports; }; require.modules["color-convert"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "."; var __filename = "color-convert"; var require = function (file) { return __require(file, "."); }; require.resolve = function (file) { return __require.resolve(name, "."); }; require.modules = __require.modules; __require.modules["color-convert"]._cached = module.exports; (function () { var conversions = require("./conversions"); var convert = function() { return new Converter(); } for (var func in conversions) { // export Raw versions convert[func + "Raw"] = (function(func) { // accept array or plain args return function(arg) { if (typeof arg == "number") arg = Array.prototype.slice.call(arguments); return conversions[func](arg); } })(func); var pair = /(\w+)2(\w+)/.exec(func), from = pair[1], to = pair[2]; // export rgb2hsl and ["rgb"]["hsl"] convert[from] = convert[from] || {}; convert[from][to] = convert[func] = (function(func) { return function(arg) { if (typeof arg == "number") arg = Array.prototype.slice.call(arguments); var val = conversions[func](arg); if (typeof val == "string" || val === undefined) return val; // keyword for (var i = 0; i < val.length; i++) val[i] = Math.round(val[i]); return val; } })(func); } /* Converter does lazy conversion and caching */ var Converter = function() { this.convs = {}; }; /* Either get the values for a space or set the values for a space, depending on args */ Converter.prototype.routeSpace = function(space, args) { var values = args[0]; if (values === undefined) { // color.rgb() return this.getValues(space); } // color.rgb(10, 10, 10) if (typeof values == "number") { values = Array.prototype.slice.call(args); } return this.setValues(space, values); }; /* Set the values for a space, invalidating cache */ Converter.prototype.setValues = function(space, values) { this.space = space; this.convs = {}; this.convs[space] = values; return this; }; /* Get the values for a space. If there's already a conversion for the space, fetch it, otherwise compute it */ Converter.prototype.getValues = function(space) { var vals = this.convs[space]; if (!vals) { var fspace = this.space, from = this.convs[fspace]; vals = convert[fspace][space](from); this.convs[space] = vals; } return vals; }; ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { Converter.prototype[space] = function(vals) { return this.routeSpace(space, arguments); } }); module.exports = convert;; }).call(module.exports); __require.modules["color-convert"]._cached = module.exports; return module.exports; }; require.modules["./conversions"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "."; var __filename = "./conversions"; var require = function (file) { return __require(file, "."); }; require.resolve = function (file) { return __require.resolve(name, "."); }; require.modules = __require.modules; __require.modules["./conversions"]._cached = module.exports; (function () { /* MIT license */ module.exports = { rgb2hsl: rgb2hsl, rgb2hsv: rgb2hsv, rgb2hwb: rgb2hwb, rgb2cmyk: rgb2cmyk, rgb2keyword: rgb2keyword, rgb2xyz: rgb2xyz, rgb2lab: rgb2lab, rgb2lch: rgb2lch, hsl2rgb: hsl2rgb, hsl2hsv: hsl2hsv, hsl2hwb: hsl2hwb, hsl2cmyk: hsl2cmyk, hsl2keyword: hsl2keyword, hsv2rgb: hsv2rgb, hsv2hsl: hsv2hsl, hsv2hwb: hsv2hwb, hsv2cmyk: hsv2cmyk, hsv2keyword: hsv2keyword, hwb2rgb: hwb2rgb, hwb2hsl: hwb2hsl, hwb2hsv: hwb2hsv, hwb2cmyk: hwb2cmyk, hwb2keyword: hwb2keyword, cmyk2rgb: cmyk2rgb, cmyk2hsl: cmyk2hsl, cmyk2hsv: cmyk2hsv, cmyk2hwb: cmyk2hwb, cmyk2keyword: cmyk2keyword, keyword2rgb: keyword2rgb, keyword2hsl: keyword2hsl, keyword2hsv: keyword2hsv, keyword2hwb: keyword2hwb, keyword2cmyk: keyword2cmyk, keyword2lab: keyword2lab, keyword2xyz: keyword2xyz, xyz2rgb: xyz2rgb, xyz2lab: xyz2lab, xyz2lch: xyz2lch, lab2xyz: lab2xyz, lab2rgb: lab2rgb, lab2lch: lab2lch, lch2lab: lch2lab, lch2xyz: lch2xyz, lch2rgb: lch2rgb } function rgb2hsl(rgb) { var r = rgb[0]/255, g = rgb[1]/255, b = rgb[2]/255, min = Math.min(r, g, b), max = Math.max(r, g, b), delta = max - min, h, s, l; if (max == min) h = 0; else if (r == max) h = (g - b) / delta; else if (g == max) h = 2 + (b - r) / delta; else if (b == max) h = 4 + (r - g)/ delta; h = Math.min(h * 60, 360); if (h < 0) h += 360; l = (min + max) / 2; if (max == min) s = 0; else if (l <= 0.5) s = delta / (max + min); else s = delta / (2 - max - min); return [h, s * 100, l * 100]; } function rgb2hsv(rgb) { var r = rgb[0], g = rgb[1], b = rgb[2], min = Math.min(r, g, b), max = Math.max(r, g, b), delta = max - min, h, s, v; if (max == 0) s = 0; else s = (delta/max * 1000)/10; if (max == min) h = 0; else if (r == max) h = (g - b) / delta; else if (g == max) h = 2 + (b - r) / delta; else if (b == max) h = 4 + (r - g) / delta; h = Math.min(h * 60, 360); if (h < 0) h += 360; v = ((max / 255) * 1000) / 10; return [h, s, v]; } function rgb2hwb(rgb) { var r = rgb[0], g = rgb[1], b = rgb[2], h = rgb2hsl(rgb)[0] w = 1/255 * Math.min(r, Math.min(g, b)) b = 1 - 1/255 * Math.max(r, Math.max(g, b)); return [h, w * 100, b * 100]; } function rgb2cmyk(rgb) { var r = rgb[0] / 255, g = rgb[1] / 255, b = rgb[2] / 255, c, m, y, k; k = Math.min(1 - r, 1 - g, 1 - b); c = (1 - r - k) / (1 - k); m = (1 - g - k) / (1 - k); y = (1 - b - k) / (1 - k); return [c * 100, m * 100, y * 100, k * 100]; } function rgb2keyword(rgb) { return reverseKeywords[JSON.stringify(rgb)]; } function rgb2xyz(rgb) { var r = rgb[0] / 255, g = rgb[1] / 255, b = rgb[2] / 255; // assume sRGB r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); return [x * 100, y *100, z * 100]; } function rgb2lab(rgb) { var xyz = rgb2xyz(rgb), x = xyz[0], y = xyz[1], z = xyz[2], l, a, b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); l = (116 * y) - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; } function rgb2lch(args) { return lab2lch(rgb2lab(args)); } function hsl2rgb(hsl) { var h = hsl[0] / 360, s = hsl[1] / 100, l = hsl[2] / 100, t1, t2, t3, rgb, val; if (s == 0) { val = l * 255; return [val, val, val]; } if (l < 0.5) t2 = l * (1 + s); else t2 = l + s - l * s; t1 = 2 * l - t2; rgb = [0, 0, 0]; for (var i = 0; i < 3; i++) { t3 = h + 1 / 3 * - (i - 1); t3 < 0 && t3++; t3 > 1 && t3--; if (6 * t3 < 1) val = t1 + (t2 - t1) * 6 * t3; else if (2 * t3 < 1) val = t2; else if (3 * t3 < 2) val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; else val = t1; rgb[i] = val * 255; } return rgb; } function hsl2hsv(hsl) { var h = hsl[0], s = hsl[1] / 100, l = hsl[2] / 100, sv, v; l *= 2; s *= (l <= 1) ? l : 2 - l; v = (l + s) / 2; sv = (2 * s) / (l + s); return [h, sv * 100, v * 100]; } function hsl2hwb(args) { return rgb2hwb(hsl2rgb(args)); } function hsl2cmyk(args) { return rgb2cmyk(hsl2rgb(args)); } function hsl2keyword(args) { return rgb2keyword(hsl2rgb(args)); } function hsv2rgb(hsv) { var h = hsv[0] / 60, s = hsv[1] / 100, v = hsv[2] / 100, hi = Math.floor(h) % 6; var f = h - Math.floor(h), p = 255 * v * (1 - s), q = 255 * v * (1 - (s * f)), t = 255 * v * (1 - (s * (1 - f))), v = 255 * v; switch(hi) { case 0: return [v, t, p]; case 1: return [q, v, p]; case 2: return [p, v, t]; case 3: return [p, q, v]; case 4: return [t, p, v]; case 5: return [v, p, q]; } } function hsv2hsl(hsv) { var h = hsv[0], s = hsv[1] / 100, v = hsv[2] / 100, sl, l; l = (2 - s) * v; sl = s * v; sl /= (l <= 1) ? l : 2 - l; l /= 2; return [h, sl * 100, l * 100]; } function hsv2hwb(args) { return rgb2hwb(hsv2rgb(args)) } function hsv2cmyk(args) { return rgb2cmyk(hsv2rgb(args)); } function hsv2keyword(args) { return rgb2keyword(hsv2rgb(args)); } // http://dev.w3.org/csswg/css-color/#hwb-to-rgb function hwb2rgb(hwb) { var h = hwb[0] / 360, wh = hwb[1] / 100, bl = hwb[2] / 100, ratio = wh + bl, i, v, f, n; // wh + bl cant be > 1 if (ratio > 1) { wh /= ratio; bl /= ratio; } i = Math.floor(6 * h); v = 1 - bl; f = 6 * h - i; if ((i & 0x01) != 0) { f = 1 - f; } n = wh + f * (v - wh); // linear interpolation switch (i) { default: case 6: case 0: r = v; g = n; b = wh; break; case 1: r = n; g = v; b = wh; break; case 2: r = wh; g = v; b = n; break; case 3: r = wh; g = n; b = v; break; case 4: r = n; g = wh; b = v; break; case 5: r = v; g = wh; b = n; break; } return [r * 255, g * 255, b * 255]; } function hwb2hsl(args) { return rgb2hsl(hwb2rgb(args)); } function hwb2hsv(args) { return rgb2hsv(hwb2rgb(args)); } function hwb2cmyk(args) { return rgb2cmyk(hwb2rgb(args)); } function hwb2keyword(args) { return rgb2keyword(hwb2rgb(args)); } function cmyk2rgb(cmyk) { var c = cmyk[0] / 100, m = cmyk[1] / 100, y = cmyk[2] / 100, k = cmyk[3] / 100, r, g, b; r = 1 - Math.min(1, c * (1 - k) + k); g = 1 - Math.min(1, m * (1 - k) + k); b = 1 - Math.min(1, y * (1 - k) + k); return [r * 255, g * 255, b * 255]; } function cmyk2hsl(args) { return rgb2hsl(cmyk2rgb(args)); } function cmyk2hsv(args) { return rgb2hsv(cmyk2rgb(args)); } function cmyk2hwb(args) { return rgb2hwb(cmyk2rgb(args)); } function cmyk2keyword(args) { return rgb2keyword(cmyk2rgb(args)); } function xyz2rgb(xyz) { var x = xyz[0] / 100, y = xyz[1] / 100, z = xyz[2] / 100, r, g, b; r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); // assume sRGB r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) : r = (r * 12.92); g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) : g = (g * 12.92); b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) : b = (b * 12.92); r = Math.min(Math.max(0, r), 1); g = Math.min(Math.max(0, g), 1); b = Math.min(Math.max(0, b), 1); return [r * 255, g * 255, b * 255]; } function xyz2lab(xyz) { var x = xyz[0], y = xyz[1], z = xyz[2], l, a, b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); l = (116 * y) - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; } function xyz2lch(args) { return lab2lch(xyz2lab(args)); } function lab2xyz(lab) { var l = lab[0], a = lab[1], b = lab[2], x, y, z, y2; if (l <= 8) { y = (l * 100) / 903.3; y2 = (7.787 * (y / 100)) + (16 / 116); } else { y = 100 * Math.pow((l + 16) / 116, 3); y2 = Math.pow(y / 100, 1/3); } x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); return [x, y, z]; } function lab2lch(lab) { var l = lab[0], a = lab[1], b = lab[2], hr, h, c; hr = Math.atan2(b, a); h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } c = Math.sqrt(a * a + b * b); return [l, c, h]; } function lab2rgb(args) { return xyz2rgb(lab2xyz(args)); } function lch2lab(lch) { var l = lch[0], c = lch[1], h = lch[2], a, b, hr; hr = h / 360 * 2 * Math.PI; a = c * Math.cos(hr); b = c * Math.sin(hr); return [l, a, b]; } function lch2xyz(args) { return lab2xyz(lch2lab(args)); } function lch2rgb(args) { return lab2rgb(lch2lab(args)); } function keyword2rgb(keyword) { return cssKeywords[keyword]; } function keyword2hsl(args) { return rgb2hsl(keyword2rgb(args)); } function keyword2hsv(args) { return rgb2hsv(keyword2rgb(args)); } function keyword2hwb(args) { return rgb2hwb(keyword2rgb(args)); } function keyword2cmyk(args) { return rgb2cmyk(keyword2rgb(args)); } function keyword2lab(args) { return rgb2lab(keyword2rgb(args)); } function keyword2xyz(args) { return rgb2xyz(keyword2rgb(args)); } var cssKeywords = { 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] }; var reverseKeywords = {}; for (var key in cssKeywords) { reverseKeywords[JSON.stringify(cssKeywords[key])] = key; } ; }).call(module.exports); __require.modules["./conversions"]._cached = module.exports; return module.exports; }; require.modules["color/node_modules/color-string/package.json"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "color/node_modules/color-string"; var __filename = "color/node_modules/color-string/package.json"; var require = function (file) { return __require(file, "color/node_modules/color-string"); }; require.resolve = function (file) { return __require.resolve(name, "color/node_modules/color-string"); }; require.modules = __require.modules; __require.modules["color/node_modules/color-string/package.json"]._cached = module.exports; (function () { module.exports = {"name":"color-string","description":"Parser and generator for CSS color strings","version":"0.2.1","author":{"name":"Heather Arthur","email":"fayearthur@gmail.com"},"repository":{"type":"git","url":"http://github.com/harthur/color-string.git"},"main":"./color-string","dependencies":{"color-convert":"0.5.x"},"devDependencies":{"browserify":">=1.0.0","uglify-js":"1.0.x"},"keywords":["color","colour","rgb","css"],"bugs":{"url":"https://github.com/harthur/color-string/issues"},"homepage":"https://github.com/harthur/color-string","_id":"color-string@0.2.1","dist":{"shasum":"2f3c1e6c1d04ddf751633b28db7fbc152055d34e","tarball":"http://registry.npmjs.org/color-string/-/color-string-0.2.1.tgz"},"_from":"color-string@>=0.2.0 <0.3.0","_npmVersion":"1.3.25","_npmUser":{"name":"harth","email":"fayearthur@gmail.com"},"maintainers":[{"name":"harth","email":"fayearthur@gmail.com"}],"directories":{},"_shasum":"2f3c1e6c1d04ddf751633b28db7fbc152055d34e","_resolved":"https://registry.npmjs.org/color-string/-/color-string-0.2.1.tgz"}; }).call(module.exports); __require.modules["color/node_modules/color-string/package.json"]._cached = module.exports; return module.exports; }; require.modules["color-string"] = function () { var module = { exports : {} }; var exports = module.exports; var __dirname = "."; var __filename = "color-string"; var require = function (file) { return __require(file, "."); }; require.resolve = function (file) { return __require.resolve(name, "."); }; require.modules = __require.modules; __require.modules["color-string"]._cached = module.exports; (function () { /* MIT license */ var convert = require("color-convert"); 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 = /(\D+)/; 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); }