# All files / internalHelpers _hslToRgb.js

100% Statements 33/33
96.3% Branches 26/27
100% Functions 3/3
100% Lines 33/33

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61

    108x

    36x

    69x

    13x

    56x
    56x
    56x

    56x
    56x
    56x

    56x
    21x
    21x
    35x
    15x
    15x
    20x
    2x
    2x
    18x
    9x
    9x
    9x
    7x
    7x
    2x
    2x
    2x

    56x
    56x
    56x
    56x
    56x

     // @flow

    type ConversionFunction = (red: number, green: number, blue: number) => string;

    function colorToInt(color: number): number {
      return Math.round(color * 255)
    }

    function convertToInt(red, green, blue) {
      return `${colorToInt(red)},${colorToInt(green)},${colorToInt(blue)}`
    }

    function hslToRgb(
      hue: number,
      saturation: number,
      lightness: number,
      convert: ConversionFunction = convertToInt,
    ): string {
      if (saturation === 0) {
        // achromatic
        return convert(lightness, lightness, lightness)
      }

      // formular from https://en.wikipedia.org/wiki/HSL_and_HSV
      const huePrime = (hue % 360) / 60
      const chroma = (1 - Math.abs((2 * lightness) - 1)) * saturation
      const secondComponent = chroma * (1 - Math.abs((huePrime % 2) - 1))

      let red = 0
      let green = 0
      let blue = 0

      if (huePrime >= 0 && huePrime < 1) {
        red = chroma
        green = secondComponent
      } else if (huePrime >= 1 && huePrime < 2) {
        red = secondComponent
        green = chroma
      } else if (huePrime >= 2 && huePrime < 3) {
        green = chroma
        blue = secondComponent
      } else if (huePrime >= 3 && huePrime < 4) {
        green = secondComponent
        blue = chroma
      } else if (huePrime >= 4 && huePrime < 5) {
        red = secondComponent
        blue = chroma
      } else Eif (huePrime >= 5 && huePrime < 6) {
        red = chroma
        blue = secondComponent
      }

      const lightnessModification = lightness - (chroma / 2)
      const finalRed = red + lightnessModification
      const finalGreen = green + lightnessModification
      const finalBlue = blue + lightnessModification
      return convert(finalRed, finalGreen, finalBlue)
    }

    export default hslToRgb