UNPKG

colorjs.io

Version:

Let’s get serious about color

81 lines (67 loc) 1.48 kB
import ColorSpace from "../space.js"; import sRGB from "./srgb.js"; export default new ColorSpace({ id: "hsl", name: "HSL", coords: { h: { refRange: [0, 360], type: "angle", name: "Hue" }, s: { range: [0, 100], name: "Saturation" }, l: { range: [0, 100], name: "Lightness" } }, base: sRGB, // Adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#From_RGB fromBase: rgb => { let max = Math.max(...rgb); let min = Math.min(...rgb); let [r, g, b] = rgb; let [h, s, l] = [NaN, 0, (min + max)/2]; let d = max - min; if (d !== 0) { s = (l === 0 || l === 1) ? 0 : (max - l) / Math.min(l, 1 - l); switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; } h = h * 60; } return [h, s * 100, l * 100]; }, // Adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB_alternative toBase: hsl => { let [h, s, l] = hsl; h = h % 360; if (h < 0) { h += 360; } s /= 100; l /= 100; function f(n) { let k = (n + h/30) % 12; let a = s * Math.min(l, 1 - l); return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)); } return [f(0), f(8), f(4)]; }, formats: { "hsl": { toGamut: true, coords: ["<number> | <angle>", "<percentage>", "<percentage>"], }, "hsla": { coords: ["<number> | <angle>", "<percentage>", "<percentage>"], commas: true, lastAlpha: true, } }, });