60 lines
1.9 KiB
JavaScript
60 lines
1.9 KiB
JavaScript
// In our case, there's only one dependency
|
|
|
|
var toRgb = require('hsl-to-rgb-for-reals')
|
|
|
|
// Typically all dependencies should be declared at the top of the file.
|
|
|
|
// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.
|
|
// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by "spinning" them around until they fall within the 0 to 359 range.
|
|
// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.
|
|
// Let's write some utility functions to handle this logic:
|
|
|
|
function max (val, n) {
|
|
return (val > n) ? n : val
|
|
}
|
|
|
|
function min (val, n) {
|
|
return (val < n) ? n : val
|
|
}
|
|
|
|
function cycle (val) {
|
|
// for safety:
|
|
val = max(val, 1e7)
|
|
val = min(val, -1e7)
|
|
// cycle value:
|
|
while (val < 0) { val += 360 }
|
|
while (val > 359) { val -= 360 }
|
|
return val
|
|
}
|
|
|
|
// Now for the main piece, the `hsl` function:
|
|
|
|
function hsl (hue, saturation, luminosity) {
|
|
// resolve degrees to 0 - 359 range
|
|
hue = cycle(hue)
|
|
|
|
// enforce constraints
|
|
saturation = min(max(saturation, 100), 0)
|
|
luminosity = min(max(luminosity, 100), 0)
|
|
|
|
// convert to 0 to 1 range used by hsl-to-rgb-for-reals
|
|
saturation /= 100
|
|
luminosity /= 100
|
|
|
|
// let hsl-to-rgb-for-reals do the hard work
|
|
var rgb = toRgb(hue, saturation, luminosity)
|
|
|
|
// convert each value in the returned RGB array
|
|
// to a 2 character hex value, join the array into
|
|
// a string, prefixed with a hash
|
|
return '#' + rgb
|
|
.map(function (n) {
|
|
return (256 + n).toString(16).substr(-2)
|
|
})
|
|
.join('')
|
|
}
|
|
|
|
// In order to make our code into a bona fide module we have to export it:
|
|
|
|
module.exports = hsl
|