@radial-color-picker/angular-color-picker
Version:
Radial Color Picker - Angular
145 lines • 16 kB
JavaScript
export var hexToRgb = function (hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
var r = parseInt(result[1], 16);
var g = parseInt(result[2], 16);
var b = parseInt(result[3], 16);
return { r: r, g: g, b: b };
};
export var extractRGB = function (rgb) {
var result = /^(?:rgb\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\))$/i.exec(rgb);
var r = parseInt(result[1], 10);
var g = parseInt(result[2], 10);
var b = parseInt(result[3], 10);
return { r: r, g: g, b: b };
};
export var extractHSL = function (hsl) {
var result = /^(?:hsl\((\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\))$/i.exec(hsl);
var h = parseInt(result[1], 10);
var s = parseInt(result[2], 10);
var l = parseInt(result[3], 10);
return { h: h, s: s, l: l };
};
/**
* Converts RGB color model to hexadecimal string.
*
* @memberOf Utilities
*
* @param r Integer between 0 and 255
* @param g Integer between 0 and 255
* @param b Integer between 0 and 255
*
* @return 6 char long hex string
*/
export var rgbToHex = function (r, g, b) {
// tslint:disable-next-line:no-bitwise
return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
};
/**
* Converts RGB color model to HSL model.
*
* @memberOf Utilities
*
* @param r Integer between 0 and 255
* @param g Integer between 0 and 255
* @param Integer between 0 and 255
*
* @return The HSL representation containing the hue (in degrees),
* saturation (in percentage) and luminosity (in percentage) fields.
*/
export var rgbToHsl = function (r, g, b) {
r = r / 255;
g = g / 255;
b = b / 255;
var h, s;
var max = Math.max(r, g, b);
var min = Math.min(r, g, b);
var l = (max + min) / 2;
if (max === min) {
h = s = 0; // achromatic
}
else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
if (max === r) {
h = (g - b) / d + (g < b ? 6 : 0);
}
if (max === g) {
h = (b - r) / d + 2;
}
if (max === b) {
h = (r - g) / d + 4;
}
}
return {
hue: h * 60,
saturation: s * 100,
luminosity: l * 100
};
};
/**
* Converts HSL color model to hexademical string.
*
* @memberOf Utilities
*
* @param h Integer between 0 and 360
* @param s Integer between 0 and 100
* @param l Integer between 0 and 50
*
* @return 6 char long hex string
*/
export var hslToHex = function (h, s, l) {
var colorModel = hslToRgb(h, s, l);
return rgbToHex(colorModel.red, colorModel.green, colorModel.blue);
};
/**
* Converts HSL color model to RGB model.
* Shamelessly taken from http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
*
* @memberOf Utilities
*
* @param h The hue. Number in the 0-360 range
* @param s The saturation. Number in the 0-100 range
* @param l The luminosity. Number in the 0-100 range
*
* @return The RGB representation containing the red, green and blue fields
*/
export var hslToRgb = function (h, s, l) {
var r, g, b;
h = h / 360;
s = s / 100;
l = l / 100;
if (s === 0) {
r = g = b = l; // achromatic
}
else {
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = _hue2rgb(p, q, h + 1 / 3);
g = _hue2rgb(p, q, h);
b = _hue2rgb(p, q, h - 1 / 3);
}
return {
red: Math.round(r * 255),
green: Math.round(g * 255),
blue: Math.round(b * 255)
};
};
export var _hue2rgb = function (p, q, t) {
if (t < 0) {
t += 1;
}
if (t > 1) {
t -= 1;
}
if (t < 1 / 6) {
return p + (q - p) * 6 * t;
}
if (t < 1 / 2) {
return q;
}
if (t < 2 / 3) {
return p + (q - p) * (2 / 3 - t) * 6;
}
return p;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHJhZGlhbC1jb2xvci1waWNrZXIvYW5ndWxhci1jb2xvci1waWNrZXIvIiwic291cmNlcyI6WyJsaWIvaGVscGVycy9jb2xvci1mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLElBQU0sUUFBUSxHQUFHLFVBQUMsR0FBRztJQUMxQixJQUFNLE1BQU0sR0FBRywyQ0FBMkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckUsSUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxJQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLElBQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsT0FBTyxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLElBQU0sVUFBVSxHQUFHLFVBQUMsR0FBRztJQUM1QixJQUFNLE1BQU0sR0FBRyx5REFBeUQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkYsSUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxJQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLElBQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsT0FBTyxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLElBQU0sVUFBVSxHQUFHLFVBQUMsR0FBRztJQUM1QixJQUFNLE1BQU0sR0FBRywyREFBMkQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckYsSUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxJQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLElBQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsT0FBTyxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUMsR0FBQSxFQUFFLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBSUY7Ozs7Ozs7Ozs7RUFVRTtBQUNGLE1BQU0sQ0FBQyxJQUFNLFFBQVEsR0FBRyxVQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN0RCxzQ0FBc0M7SUFDdEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsSUFBTSxRQUFRLEdBQUcsVUFBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFDdEQsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDWixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNaLENBQUMsR0FBRyxDQUFD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LENBQUMsR0FBRyxDQUFDLENBQUM7S0FDdEM7SUFFRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBoZXhUb1JnYiA9IChoZXgpID0+IHtcclxuICBjb25zdCByZXN1bHQgPSAvXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pLmV4ZWMoaGV4KTtcclxuICBjb25zdCByID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxNik7XHJcbiAgY29uc3QgZyA9IHBhcnNlSW50KHJlc3VsdFsyXSwgMTYpO1xyXG4gIGNvbnN0IGIgPSBwYXJzZUludChyZXN1bHRbM10sIDE2KTtcclxuXHJcbiAgcmV0dXJuIHsgciwgZywgYiB9O1xyXG59O1xyXG5leHBvcnQgY29uc3QgZXh0cmFjdFJHQiA9IChyZ2IpID0+IHtcclxuICBjb25zdCByZXN1bHQgPSAvXig/OnJnYlxcKChcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxcKSkkL2kuZXhlYyhyZ2IpO1xyXG4gIGNvbnN0IHIgPSBwYXJzZUludChyZXN1bHRbMV0sIDEwKTtcclxuICBjb25zdCBnID0gcGFyc2VJbnQocmVzdWx0WzJdLCAxMCk7XHJcbiAgY29uc3QgYiA9IHBhcnNlSW50KHJlc3VsdFszXSwgMTApO1xyXG5cclxuICByZXR1cm4geyByLCBnLCBiIH07XHJcbn07XHJcbmV4cG9ydCBjb25zdCBleHRyYWN0SFNMID0gKGhzbCkgPT4ge1xyXG4gIGNvbnN0IHJlc3VsdCA9IC9eKD86aHNsXFwoKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSklXFxzKixcXHMqKFxcZHsxLDN9KSVcXCkpJC9pLmV4ZWMoaHNsKTtcclxuICBjb25zdCBoID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxMCk7XHJcbiAgY29uc3QgcyA9IHBhcnNlSW50KHJlc3VsdFsyXSwgMTApO1xyXG4gIGNvbnN0IGwgPSBwYXJzZUludChyZXN1bHRbM10sIDEwKTtcclxuXHJcbiAgcmV0dXJuIHsgaCwgcywgbCB9O1xyXG59O1xyXG5cclxuXHJcblxyXG4vKipcclxuICogQ29udmVydHMgUkdCIGNvbG9yIG1vZGVsIHRvIGhleGFkZWNpbWFsIHN0cmluZy5cclxuICpcclxuICogQG1lbWJlck9mIFV0aWxpdGllc1xyXG4gKlxyXG4gKiBAcGFyYW0gciBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1XHJcbiAqIEBwYXJhbSBnIEludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTVcclxuICogQHBhcmFtIGIgSW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NVxyXG4gKlxyXG4gKiBAcmV0dXJuIDYgY2hhciBsb25nIGhleCBzdHJpbmdcclxuKi9cclxuZXhwb3J0IGNvbnN0IHJnYlRvSGV4ID0gKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXHJcbiAgcmV0dXJuICgoMSA8PCAyNCkgKyAociA8PCAxNikgKyAoZyA8PCA4KSArIGIpLnRvU3RyaW5nKDE2KS5zbGljZSgxKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBSR0IgY29sb3IgbW9kZWwgdG8gSFNMIG1vZGVsLlxyXG4gKlxyXG4gKiBAbWVtYmVyT2YgVXRpbGl0aWVzXHJcbiAqXHJcbiAqIEBwYXJhbSByIEludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTVcclxuICogQHBhcmFtIGcgSW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NVxyXG4gKiBAcGFyYW0gSW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NVxyXG4gKlxyXG4gKiBAcmV0dXJuIFRoZSBIU0wgcmVwcmVzZW50YXRpb24gY29udGFpbmluZyB0aGUgaHVlIChpbiBkZWdyZWVzKSxcclxuICogICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uIChpbiBwZXJjZW50YWdlKSBhbmQgbHVtaW5vc2l0eSAoaW4gcGVyY2VudGFnZSkgZmllbGRzLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJnYlRvSHNsID0gKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiB7IGh1ZTogbnVtYmVyLCBzYXR1cmF0aW9uOiBudW1iZXIsIGx1bWlub3NpdHk6IG51bWJlciB9ID0+IHtcclxuICByID0gciAvIDI1NTtcclxuICBnID0gZyAvIDI1NTtcclxuICBiID0gYiAvIDI1NTtcclxuXHJcbiAgbGV0IGgsIHM7XHJcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XHJcbiAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYik7XHJcbiAgY29uc3QgbCA9IChtYXggKyBtaW4pIC8gMjtcclxuXHJcbiAgaWYgKG1heCA9PT0gbWluKSB7XHJcbiAgICBoID0gcyA9IDA7IC8vIGFjaHJvbWF0aWNcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgZCA9IG1heCAtIG1pbjtcclxuXHJcbiAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7XHJcblxyXG4gICAgaWYgKG1heCA9PT0gcikge1xyXG4gICAgICBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7XHJcbiAgICB9XHJcbiAgICBpZiAobWF4ID09PSBnKSB7XHJcbiAgICAgIGggPSAoYiAtIHIpIC8gZCArIDI7XHJcbiAgICB9XHJcbiAgICBpZiAobWF4ID09PSBiKSB7XHJcbiAgICAgIGggPSAociAtIGcpIC8gZCArIDQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgaHVlOiBoICogNjAsXHJcbiAgICBzYXR1cmF0aW9uOiBzICogMTAwLFxyXG4gICAgbHVtaW5vc2l0eTogbCAqIDEwMFxyXG4gIH07XHJcbn07XHJcblxyXG4vKipcclxuICogQ29udmVydHMgSFNMIGNvbG9yIG1vZGVsIHRvIGhleGFkZW1pY2FsIHN0cmluZy5cclxuICpcclxuICogQG1lbWJlck9mIFV0aWxpdGllc1xyXG4gKlxyXG4gKiBAcGFyYW0gaCBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMzYwXHJcbiAqIEBwYXJhbSBzIEludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDBcclxuICogQHBhcmFtIGwgSW50ZWdlciBiZXR3ZWVuIDAgYW5kIDUwXHJcbiAqXHJcbiAqIEByZXR1cm4gNiBjaGFyIGxvbmcgaGV4IHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhzbFRvSGV4ID0gKGg6IG51bWJlciwgczogbnVtYmVyLCBsOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGNvbG9yTW9kZWwgPSBoc2xUb1JnYihoLCBzLCBsKTtcclxuXHJcbiAgcmV0dXJuIHJnYlRvSGV4KGNvbG9yTW9kZWwucmVkLCBjb2xvck1vZGVsLmdyZWVuLCBjb2xvck1vZGVsLmJsdWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIEhTTCBjb2xvciBtb2RlbCB0byBSR0IgbW9kZWwuXHJcbiAqIFNoYW1lbGVzc2x5IHRha2VuIGZyb20gaHR0cDovL2F4b25mbHV4LmNvbS9oYW5keS1yZ2ItdG8taHNsLWFuZC1yZ2ItdG8taHN2LWNvbG9yLW1vZGVsLWNcclxuICpcclxuICogQG1lbWJlck9mIFV0aWxpdGllc1xyXG4gKlxyXG4gKiBAcGFyYW0gaCBUaGUgaHVlLiBOdW1iZXIgaW4gdGhlIDAtMzYwIHJhbmdlXHJcbiAqIEBwYXJhbSBzIFRoZSBzYXR1cmF0aW9uLiBOdW1iZXIgaW4gdGhlIDAtMTAwIHJhbmdlXHJcbiAqIEBwYXJhbSBsIFRoZSBsdW1pbm9zaXR5LiBOdW1iZXIgaW4gdGhlIDAtMTAwIHJhbmdlXHJcbiAqXHJcbiAqIEByZXR1cm4gVGhlIFJHQiByZXByZXNlbnRhdGlvbiBjb250YWluaW5nIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGZpZWxkc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhzbFRvUmdiID0gKGgsIHMsIGwpOiB7IHJlZDogbnVtYmVyLCBncmVlbjogbnVtYmVyLCBibHVlOiBudW1iZXIgfSA9PiB7XHJcbiAgbGV0IHIsIGcsIGI7XHJcblxyXG4gIGggPSBoIC8gMzYwO1xyXG4gIHMgPSBzIC8gMTAwO1xyXG4gIGwgPSBsIC8gMTAwO1xyXG5cclxuICBpZiAocyA9PT0gMCkge1xyXG4gICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpY1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcclxuICAgIGNvbnN0IHAgPSAyICogbCAtIHE7XHJcblxyXG4gICAgciA9IF9odWUycmdiKHAsIHEsIGggKyAxIC8gMyk7XHJcbiAgICBnID0gX2h1ZTJyZ2IocCwgcSwgaCk7XHJcbiAgICBiID0gX2h1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICByZWQ6IE1hdGgucm91bmQociAqIDI1NSksXHJcbiAgICBncmVlbjogTWF0aC5yb3VuZChnICogMjU1KSxcclxuICAgIGJsdWU6IE1hdGgucm91bmQoYiAqIDI1NSlcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IF9odWUycmdiID0gKHAsIHEsIHQpID0+IHtcclxuICBpZiAodCA8IDApIHtcclxuICAgIHQgKz0gMTtcclxuICB9XHJcbiAgaWYgKHQgPiAxKSB7XHJcbiAgICB0IC09IDE7XHJcbiAgfVxyXG4gIGlmICh0IDwgMSAvIDYpIHtcclxuICAgIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xyXG4gIH1cclxuICBpZiAodCA8IDEgLyAyKSB7XHJcbiAgICByZXR1cm4gcTtcclxuICB9XHJcbiAgaWYgKHQgPCAyIC8gMykge1xyXG4gICAgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHA7XHJcbn07XHJcbiJdfQ==