Skip to content

Instantly share code, notes, and snippets.

@ivorpad
Created August 24, 2020 12:07
Show Gist options
  • Save ivorpad/2c75a48a55a56e70fb64f6b0f168845f to your computer and use it in GitHub Desktop.
Save ivorpad/2c75a48a55a56e70fb64f6b0f168845f to your computer and use it in GitHub Desktop.
function componentToHex(component) {
const hex = component.toString(16);
return hex.length === 1 ? `0${hex}` : hex;
}
function rgbFromHueAndChroma(hue, chroma) {
const huePrime = hue / 60;
const hueDelta = 1 - Math.abs((huePrime % 2) - 1);
const intermediateValue = chroma * hueDelta;
let red = 0;
let green = 0;
let blue = 0;
if (huePrime >= 0 && huePrime <= 1) {
red = chroma;
green = intermediateValue;
blue = 0;
}
if (huePrime >= 1 && huePrime <= 2) {
red = intermediateValue;
green = chroma;
blue = 0;
}
if (huePrime >= 2 && huePrime <= 3) {
red = 0;
green = chroma;
blue = intermediateValue;
}
if (huePrime >= 3 && huePrime <= 4) {
red = 0;
green = intermediateValue;
blue = chroma;
}
if (huePrime >= 4 && huePrime <= 5) {
red = intermediateValue;
green = 0;
blue = chroma;
}
if (huePrime >= 5 && huePrime <= 6) {
red = chroma;
green = 0;
blue = intermediateValue;
}
return { red, green, blue };
}
function hsbToRgb(color) {
const { hue, saturation, brightness, alpha = 1 } = color;
const chroma = brightness * saturation;
let { red, green, blue } = rgbFromHueAndChroma(hue, chroma);
const chromaBrightnessDelta = brightness - chroma;
red += chromaBrightnessDelta;
green += chromaBrightnessDelta;
blue += chromaBrightnessDelta;
return {
red: Math.round(red * 255),
green: Math.round(green * 255),
blue: Math.round(blue * 255),
alpha,
};
}
function rgbToHex({ red, green, blue }) {
return `#${componentToHex(red)}${componentToHex(green)}${componentToHex(
blue
)}`;
}
export function hsbToHex(color) {
return rgbToHex(hsbToRgb(color));
}
function hslToRgb(color) {
const { hue, saturation, lightness, alpha = 1 } = color;
const chroma = (1 - Math.abs(2 * (lightness / 100) - 1)) * (saturation / 100);
let { red, green, blue } = rgbFromHueAndChroma(hue, chroma);
const lightnessVal = lightness / 100 - chroma / 2;
red += lightnessVal;
green += lightnessVal;
blue += lightnessVal;
return {
red: Math.round(red * 255),
green: Math.round(green * 255),
blue: Math.round(blue * 255),
alpha,
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment