polished
Version:
A lightweight toolset for writing styles in Javascript.
60 lines (52 loc) • 1.28 kB
Flow
// @flow
import type {
HslColor, HslaColor, RgbColor, RgbaColor,
} from '../types/color'
function rgbToHsl(color: RgbColor | RgbaColor): HslColor | HslaColor {
// make sure rgb are contained in a set of [0, 255]
const red = color.red / 255
const green = color.green / 255
const blue = color.blue / 255
const max = Math.max(red, green, blue)
const min = Math.min(red, green, blue)
const lightness = (max + min) / 2
if (max === min) {
// achromatic
if (color.alpha !== undefined) {
return {
hue: 0,
saturation: 0,
lightness,
alpha: color.alpha,
}
} else {
return { hue: 0, saturation: 0, lightness }
}
}
let hue
const delta = max - min
const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min)
switch (max) {
case red:
hue = (green - blue) / delta + (green < blue ? 6 : 0)
break
case green:
hue = (blue - red) / delta + 2
break
default:
// blue case
hue = (red - green) / delta + 4
break
}
hue *= 60
if (color.alpha !== undefined) {
return {
hue,
saturation,
lightness,
alpha: color.alpha,
}
}
return { hue, saturation, lightness }
}
export default rgbToHsl