UNPKG

angular-color-picker-fixed

Version:
145 lines 15.4 kB
export const hexToRgb = (hex) => { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); const r = parseInt(result[1], 16); const g = parseInt(result[2], 16); const b = parseInt(result[3], 16); return { r, g, b }; }; export const extractRGB = (rgb) => { const result = /^(?:rgb\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\))$/i.exec(rgb); const r = parseInt(result[1], 10); const g = parseInt(result[2], 10); const b = parseInt(result[3], 10); return { r, g, b }; }; export const extractHSL = (hsl) => { const result = /^(?:hsl\((\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\))$/i.exec(hsl); const h = parseInt(result[1], 10); const s = parseInt(result[2], 10); const l = parseInt(result[3], 10); return { h, s, 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 const rgbToHex = (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 const rgbToHsl = (r, g, b) => { r = r / 255; g = g / 255; b = b / 255; let h, s; const max = Math.max(r, g, b); const min = Math.min(r, g, b); const l = (max + min) / 2; if (max === min) { h = s = 0; // achromatic } else { const 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 const hslToHex = (h, s, l) => { const 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 const hslToRgb = (h, s, l) => { let r, g, b; h = h / 360; s = s / 100; l = l / 100; if (s === 0) { r = g = b = l; // achromatic } else { const q = l < 0.5 ? l * (1 + s) : l + s - l * s; const 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 const _hue2rgb = (p, q, t) => { if (t < 0) { t += 1; } if (t > 1) { t -= 1; } if (t < 1 / 6) { return p + (q - p) * 6 * t; } if (t < 1 / 2) { return q; } if (t < 2 / 3) { return p + (q - p) * (2 / 3 - t) * 6; } return p; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHJhZGlhbC1jb2xvci1waWNrZXIvYW5ndWxhci1jb2xvci1waWNrZXIvIiwic291cmNlcyI6WyJsaWIvaGVscGVycy9jb2xvci1mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7SUFDOUIsTUFBTSxNQUFNLEdBQUcsMkNBQTJDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFO0lBQ2hDLE1BQU0sTUFBTSxHQUFHLHlEQUF5RCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxPQUFPLEVBQUUsQ0FB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QUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3RDO0lBRUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgaGV4VG9SZ2IgPSAoaGV4KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuICBjb25zdCByID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxNik7XG4gIGNvbnN0IGcgPSBwYXJzZUludChyZXN1bHRbMl0sIDE2KTtcbiAgY29uc3QgYiA9IHBhcnNlSW50KHJlc3VsdFszXSwgMTYpO1xuXG4gIHJldHVybiB7IHIsIGcsIGIgfTtcbn07XG5leHBvcnQgY29uc3QgZXh0cmFjdFJHQiA9IChyZ2IpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gL14oPzpyZ2JcXCgoXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXCkpJC9pLmV4ZWMocmdiKTtcbiAgY29uc3QgciA9IHBhcnNlSW50KHJlc3VsdFsxXSwgMTApO1xuICBjb25zdCBnID0gcGFyc2VJbnQocmVzdWx0WzJdLCAxMCk7XG4gIGNvbnN0IGIgPSBwYXJzZUludChyZXN1bHRbM10sIDEwKTtcblxuICByZXR1cm4geyByLCBnLCBiIH07XG59O1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RIU0wgPSAoaHNsKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IC9eKD86aHNsXFwoKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSklXFxzKixcXHMqKFxcZHsxLDN9KSVcXCkpJC9pLmV4ZWMoaHNsKTtcbiAgY29uc3QgaCA9IHBhcnNlSW50KHJlc3VsdFsxXSwgMTApO1xuICBjb25zdCBzID0gcGFyc2VJbnQocmVzdWx0WzJdLCAxMCk7XG4gIGNvbnN0IGwgPSBwYXJzZUludChyZXN1bHRbM10sIDEwKTtcblxuICByZXR1cm4geyBoLCBzLCBsIH07XG59O1xuXG5cblxuLyoqXG4gKiBDb252ZXJ0cyBSR0IgY29sb3IgbW9kZWwgdG8gaGV4YWRlY2ltYWwgc3RyaW5nLlxuICpcbiAqIEBtZW1iZXJPZiBVdGlsaXRpZXNcbiAqXG4gKiBAcGFyYW0gciBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1XG4gKiBAcGFyYW0gZyBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1XG4gKiBAcGFyYW0gYiBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1XG4gKlxuICogQHJldHVybiA2IGNoYXIgbG9uZyBoZXggc3RyaW5nXG4qL1xuZXhwb3J0IGNvbnN0IHJnYlRvSGV4ID0gKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICByZXR1cm4gKCgxIDw8IDI0KSArIChyIDw8IDE2KSArIChnIDw8IDgpICsgYikudG9TdHJpbmcoMTYpLnNsaWNlKDEpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBSR0IgY29sb3IgbW9kZWwgdG8gSFNMIG1vZGVsLlxuICpcbiAqIEBtZW1iZXJPZiBVdGlsaXRpZXNcbiAqXG4gKiBAcGFyYW0gciBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1XG4gKiBAcGFyYW0gZyBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1XG4gKiBAcGFyYW0gSW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NVxuICpcbiAqIEByZXR1cm4gVGhlIEhTTCByZXByZXNlbnRhdGlvbiBjb250YWluaW5nIHRoZSBodWUgKGluIGRlZ3JlZXMpLFxuICogICAgICAgICAgICAgICAgICAgICBzYXR1cmF0aW9uIChpbiBwZXJjZW50YWdlKSBhbmQgbHVtaW5vc2l0eSAoaW4gcGVyY2VudGFnZSkgZmllbGRzLlxuICovXG5leHBvcnQgY29uc3QgcmdiVG9Ic2wgPSAocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IHsgaHVlOiBudW1iZXIsIHNhdHVyYXRpb246IG51bWJlciwgbHVtaW5vc2l0eTogbnVtYmVyIH0gPT4ge1xuICByID0gciAvIDI1NTtcbiAgZyA9IGcgLyAyNTU7XG4gIGIgPSBiIC8gMjU1O1xuXG4gIGxldCBoLCBzO1xuICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gIGNvbnN0IGwgPSAobWF4ICsgbWluKSAvIDI7XG5cbiAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgaCA9IHMgPSAwOyAvLyBhY2hyb21hdGljXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZCA9IG1heCAtIG1pbjtcblxuICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKTtcblxuICAgIGlmIChtYXggPT09IHIpIHtcbiAgICAgIGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTtcbiAgICB9XG4gICAgaWYgKG1heCA9PT0gZykge1xuICAgICAgaCA9IChiIC0gcikgLyBkICsgMjtcbiAgICB9XG4gICAgaWYgKG1heCA9PT0gYikge1xuICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGh1ZTogaCAqIDYwLFxuICAgIHNhdHVyYXRpb246IHMgKiAxMDAsXG4gICAgbHVtaW5vc2l0eTogbCAqIDEwMFxuICB9O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBIU0wgY29sb3IgbW9kZWwgdG8gaGV4YWRlbWljYWwgc3RyaW5nLlxuICpcbiAqIEBtZW1iZXJPZiBVdGlsaXRpZXNcbiAqXG4gKiBAcGFyYW0gaCBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMzYwXG4gKiBAcGFyYW0gcyBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwXG4gKiBAcGFyYW0gbCBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgNTBcbiAqXG4gKiBAcmV0dXJuIDYgY2hhciBsb25nIGhleCBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGhzbFRvSGV4ID0gKGg6IG51bWJlciwgczogbnVtYmVyLCBsOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjb2xvck1vZGVsID0gaHNsVG9SZ2IoaCwgcywgbCk7XG5cbiAgcmV0dXJuIHJnYlRvSGV4KGNvbG9yTW9kZWwucmVkLCBjb2xvck1vZGVsLmdyZWVuLCBjb2xvck1vZGVsLmJsdWUpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBIU0wgY29sb3IgbW9kZWwgdG8gUkdCIG1vZGVsLlxuICogU2hhbWVsZXNzbHkgdGFrZW4gZnJvbSBodHRwOi8vYXhvbmZsdXguY29tL2hhbmR5LXJnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY1xuICpcbiAqIEBtZW1iZXJPZiBVdGlsaXRpZXNcbiAqXG4gKiBAcGFyYW0gaCBUaGUgaHVlLiBOdW1iZXIgaW4gdGhlIDAtMzYwIHJhbmdlXG4gKiBAcGFyYW0gcyBUaGUgc2F0dXJhdGlvbi4gTnVtYmVyIGluIHRoZSAwLTEwMCByYW5nZVxuICogQHBhcmFtIGwgVGhlIGx1bWlub3NpdHkuIE51bWJlciBpbiB0aGUgMC0xMDAgcmFuZ2VcbiAqXG4gKiBAcmV0dXJuIFRoZSBSR0IgcmVwcmVzZW50YXRpb24gY29udGFpbmluZyB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBmaWVsZHNcbiAqL1xuZXhwb3J0IGNvbnN0IGhzbFRvUmdiID0gKGgsIHMsIGwpOiB7IHJlZDogbnVtYmVyLCBncmVlbjogbnVtYmVyLCBibHVlOiBudW1iZXIgfSA9PiB7XG4gIGxldCByLCBnLCBiO1xuXG4gIGggPSBoIC8gMzYwO1xuICBzID0gcyAvIDEwMDtcbiAgbCA9IGwgLyAxMDA7XG5cbiAgaWYgKHMgPT09IDApIHtcbiAgICByID0gZyA9IGIgPSBsOyAvLyBhY2hyb21hdGljXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgY29uc3QgcCA9IDIgKiBsIC0gcTtcblxuICAgIHIgPSBfaHVlMnJnYihwLCBxLCBoICsgMSAvIDMpO1xuICAgIGcgPSBfaHVlMnJnYihwLCBxLCBoKTtcbiAgICBiID0gX2h1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVkOiBNYXRoLnJvdW5kKHIgKiAyNTUpLFxuICAgIGdyZWVuOiBNYXRoLnJvdW5kKGcgKiAyNTUpLFxuICAgIGJsdWU6IE1hdGgucm91bmQoYiAqIDI1NSlcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBfaHVlMnJnYiA9IChwLCBxLCB0KSA9PiB7XG4gIGlmICh0IDwgMCkge1xuICAgIHQgKz0gMTtcbiAgfVxuICBpZiAodCA+IDEpIHtcbiAgICB0IC09IDE7XG4gIH1cbiAgaWYgKHQgPCAxIC8gNikge1xuICAgIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICB9XG4gIGlmICh0IDwgMSAvIDIpIHtcbiAgICByZXR1cm4gcTtcbiAgfVxuICBpZiAodCA8IDIgLyAzKSB7XG4gICAgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2O1xuICB9XG5cbiAgcmV0dXJuIHA7XG59O1xuIl19