hsla-to-rgba.mjs 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // Adapted from https://gist.github.com/mjackson/5311256
  2. function hueToRgb(p, q, t) {
  3. if (t < 0)
  4. t += 1;
  5. if (t > 1)
  6. t -= 1;
  7. if (t < 1 / 6)
  8. return p + (q - p) * 6 * t;
  9. if (t < 1 / 2)
  10. return q;
  11. if (t < 2 / 3)
  12. return p + (q - p) * (2 / 3 - t) * 6;
  13. return p;
  14. }
  15. function hslaToRgba({ hue, saturation, lightness, alpha }) {
  16. hue /= 360;
  17. saturation /= 100;
  18. lightness /= 100;
  19. let red = 0;
  20. let green = 0;
  21. let blue = 0;
  22. if (!saturation) {
  23. red = green = blue = lightness;
  24. }
  25. else {
  26. const q = lightness < 0.5
  27. ? lightness * (1 + saturation)
  28. : lightness + saturation - lightness * saturation;
  29. const p = 2 * lightness - q;
  30. red = hueToRgb(p, q, hue + 1 / 3);
  31. green = hueToRgb(p, q, hue);
  32. blue = hueToRgb(p, q, hue - 1 / 3);
  33. }
  34. return {
  35. red: Math.round(red * 255),
  36. green: Math.round(green * 255),
  37. blue: Math.round(blue * 255),
  38. alpha,
  39. };
  40. }
  41. export { hslaToRgba };