{"version":3,"file":"colorManipulator.cjs","sources":["../../../src/themes/colorManipulator.ts"],"sourcesContent":["// Code based on Material-UI\n// https://github.com/mui-org/material-ui/blob/1b096070faf102281f8e3c4f9b2bf50acf91f412/packages/material-ui/src/styles/colorManipulator.js#L97\n// MIT License Copyright (c) 2014 Call-Em-All\n\nimport tinycolor from 'tinycolor2';\n\n/**\n * Returns a number whose value is limited to the given range.\n * @param value The value to be clamped\n * @param min The lower boundary of the output range\n * @param max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @beta\n */\nfunction clamp(value: number, min = 0, max = 1) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (value < min || value > max) {\n      console.error(`The value provided ${value} is out of range [${min}, ${max}].`);\n    }\n  }\n\n  return Math.min(Math.max(min, value), max);\n}\n\n/**\n * Converts a color from CSS hex format to CSS rgb format.\n * @param color - Hex color, i.e. #nnn or #nnnnnn\n * @returns A CSS rgb color string\n * @beta\n */\nexport function hexToRgb(color: string) {\n  color = color.slice(1);\n\n  const re = new RegExp(`.{1,${color.length >= 6 ? 2 : 1}}`, 'g');\n  let result = color.match(re);\n\n  if (!result) {\n    return '';\n  }\n\n  let colors = Array.from(result);\n\n  if (colors[0].length === 1) {\n    colors = colors.map((n) => n + n);\n  }\n\n  return colors\n    ? `rgb${colors.length === 4 ? 'a' : ''}(${colors\n        .map((n, index) => {\n          return index < 3 ? parseInt(n, 16) : Math.round((parseInt(n, 16) / 255) * 1000) / 1000;\n        })\n        .join(', ')})`\n    : '';\n}\n\nfunction intToHex(int: number) {\n  const hex = int.toString(16);\n  return hex.length === 1 ? `0${hex}` : hex;\n}\n\n/**\n * Converts a color from CSS rgb format to CSS hex format.\n * @param color - RGB color, i.e. rgb(n, n, n)\n * @returns A CSS rgb color string, i.e. #nnnnnn\n * @beta\n */\nexport function rgbToHex(color: string) {\n  // Idempotent\n  if (color.indexOf('#') === 0) {\n    return color;\n  }\n\n  const { values } = decomposeColor(color);\n  return `#${values.map((n: number) => intToHex(n)).join('')}`;\n}\n\n/**\n * Converts a color to hex6 format if there is no alpha, hex8 if there is.\n * @param color - Hex, RGB, HSL color\n * @returns A hex color string, i.e. #ff0000 or #ff0000ff\n */\nexport function asHexString(color: string): string {\n  if (color[0] === '#') {\n    return color;\n  }\n  const tColor = tinycolor(color);\n  return tColor.getAlpha() === 1 ? tColor.toHexString() : tColor.toHex8String();\n}\n\n/**\n * Converts a color to rgb string\n */\nexport function asRgbString(color: string) {\n  if (color.startsWith('rgb')) {\n    return color;\n  }\n\n  return tinycolor(color).toRgbString();\n}\n\n/**\n * Converts a color from hsl format to rgb format.\n * @param color - HSL color values\n * @returns rgb color values\n * @beta\n */\nexport function hslToRgb(color: string | DecomposeColor) {\n  const parts = decomposeColor(color);\n  const { values } = parts;\n  const h = values[0];\n  const s = values[1] / 100;\n  const l = values[2] / 100;\n  const a = s * Math.min(l, 1 - l);\n  const f = (n: number, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\n  let type = 'rgb';\n  const rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n\n  if (parts.type === 'hsla') {\n    type += 'a';\n    rgb.push(values[3]);\n  }\n\n  return recomposeColor({ type, values: rgb });\n}\n\n/**\n * Returns an object with the type and values of a color.\n *\n * Note: Does not support rgb % values.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {object} - A MUI color object: {type: string, values: number[]}\n * @beta\n */\nexport function decomposeColor(color: string | DecomposeColor): DecomposeColor {\n  // Idempotent\n  if (typeof color !== 'string') {\n    return color;\n  }\n\n  if (color.charAt(0) === '#') {\n    return decomposeColor(hexToRgb(color));\n  }\n\n  const marker = color.indexOf('(');\n  const type = color.substring(0, marker);\n\n  if (['rgb', 'rgba', 'hsl', 'hsla', 'color'].indexOf(type) === -1) {\n    throw new Error(\n      `Unsupported '${color}' color. The following formats are supported: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()`\n    );\n  }\n\n  let values: any = color.substring(marker + 1, color.length - 1);\n  let colorSpace;\n\n  if (type === 'color') {\n    values = values.split(' ');\n    colorSpace = values.shift();\n    if (values.length === 4 && values[3].charAt(0) === '/') {\n      values[3] = values[3].slice(1);\n    }\n    if (['srgb', 'display-p3', 'a98-rgb', 'prophoto-rgb', 'rec-2020'].indexOf(colorSpace) === -1) {\n      throw new Error(\n        `Unsupported ${colorSpace} color space. The following color spaces are supported: srgb, display-p3, a98-rgb, prophoto-rgb, rec-2020.`\n      );\n    }\n  } else {\n    values = values.split(',');\n  }\n\n  values = values.map((value: string) => parseFloat(value));\n  return { type, values, colorSpace };\n}\n\n/**\n * Converts a color object with type and values to a string.\n * @param {object} color - Decomposed color\n * @param color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla'\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\n * @returns A CSS color string\n * @beta\n */\nexport function recomposeColor(color: DecomposeColor) {\n  const { type, colorSpace } = color;\n  let values = color.values;\n\n  if (type.indexOf('rgb') !== -1) {\n    // Only convert the first 3 values to int (i.e. not alpha)\n    values = values.map((n: string, i: number) => (i < 3 ? parseInt(n, 10) : n));\n  } else if (type.indexOf('hsl') !== -1) {\n    values[1] = `${values[1]}%`;\n    values[2] = `${values[2]}%`;\n  }\n  if (type.indexOf('color') !== -1) {\n    values = `${colorSpace} ${values.join(' ')}`;\n  } else {\n    values = `${values.join(', ')}`;\n  }\n\n  return `${type}(${values})`;\n}\n\n/**\n * Calculates the contrast ratio between two colors.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param canvas - A CSS color that alpha based backgrounds blends into\n * @returns A contrast ratio value in the range 0 - 21.\n * @beta\n */\nexport function getContrastRatio(foreground: string, background: string, canvas?: string) {\n  const lumA = getLuminance(foreground);\n  const lumB = getLuminance(background, canvas);\n  return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param background - CSS color that needs to be take in to account to calculate luminance for colors with opacity\n * @returns The relative brightness of the color in the range 0 - 1\n * @beta\n */\nexport function getLuminance(color: string, background?: string) {\n  const parts = decomposeColor(color);\n\n  let rgb = parts.type === 'hsl' ? decomposeColor(hslToRgb(color)).values : parts.values;\n\n  if (background && parts.type === 'rgba') {\n    const backgroundParts = decomposeColor(background);\n    const alpha = rgb[3];\n    rgb[0] = rgb[0] * alpha + backgroundParts.values[0] * (1 - alpha);\n    rgb[1] = rgb[1] * alpha + backgroundParts.values[1] * (1 - alpha);\n    rgb[2] = rgb[2] * alpha + backgroundParts.values[2] * (1 - alpha);\n  }\n\n  const rgbNumbers = rgb.map((val: any) => {\n    if (parts.type !== 'color') {\n      val /= 255; // normalized\n    }\n    return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4;\n  });\n\n  // Truncate at 3 digits\n  return Number((0.2126 * rgbNumbers[0] + 0.7152 * rgbNumbers[1] + 0.0722 * rgbNumbers[2]).toFixed(3));\n}\n\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param coefficient=0.15 - multiplier in the range 0 - 1\n * @returns A CSS color string. Hex input values are returned as rgb\n * @beta\n */\nexport function emphasize(color: string, coefficient = 0.15) {\n  return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n\n/**\n * Set the absolute transparency of a color.\n * Any existing alpha values are overwritten.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param value - value to set the alpha channel to in the range 0 - 1\n * @returns A CSS color string. Hex input values are returned as rgb\n * @beta\n */\nexport function alpha(color: string, value: number) {\n  if (color === '') {\n    return '#000000';\n  }\n\n  value = clamp(value);\n\n  // hex 3, hex 4 (w/alpha), hex 6, hex 8 (w/alpha)\n  if (color[0] === '#') {\n    if (color.length === 9) {\n      color = color.substring(0, 7);\n    } else if (color.length <= 5) {\n      let c = '#';\n      for (let i = 1; i < 4; i++) {\n        c += color[i] + color[i];\n      }\n      color = c;\n    }\n\n    return (\n      color +\n      Math.round(value * 255)\n        .toString(16)\n        .padStart(2, '0')\n    );\n  }\n  // rgb(, hsl(\n  else if (color[3] === '(') {\n    // rgb() and hsl() do not require the \"a\" suffix to accept alpha values in modern browsers:\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb()#accepts_alpha_value\n    return color.replace(')', `, ${value})`);\n  }\n  // rgba(, hsla(\n  else if (color[4] === '(') {\n    return color.substring(0, color.lastIndexOf(',')) + `, ${value})`;\n  }\n\n  const parts = decomposeColor(color);\n\n  if (parts.type === 'color') {\n    parts.values[3] = `/${value}`;\n  } else {\n    parts.values[3] = value;\n  }\n\n  return recomposeColor(parts);\n}\n\n/**\n * Darkens a color.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param coefficient - multiplier in the range 0 - 1\n * @returns A CSS color string. Hex input values are returned as rgb\n * @beta\n */\nexport function darken(color: string, coefficient: number) {\n  const parts = decomposeColor(color);\n  coefficient = clamp(coefficient);\n\n  if (parts.type.indexOf('hsl') !== -1) {\n    parts.values[2] *= 1 - coefficient;\n  } else if (parts.type.indexOf('rgb') !== -1 || parts.type.indexOf('color') !== -1) {\n    for (let i = 0; i < 3; i += 1) {\n      parts.values[i] *= 1 - coefficient;\n    }\n  }\n  return recomposeColor(parts);\n}\n\n/**\n * Lightens a color.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param coefficient - multiplier in the range 0 - 1\n * @returns A CSS color string. Hex input values are returned as rgb\n * @beta\n */\nexport function lighten(color: string, coefficient: number) {\n  const parts = decomposeColor(color);\n  coefficient = clamp(coefficient);\n\n  if (parts.type.indexOf('hsl') !== -1) {\n    parts.values[2] += (100 - parts.values[2]) * coefficient;\n  } else if (parts.type.indexOf('rgb') !== -1) {\n    for (let i = 0; i < 3; i += 1) {\n      parts.values[i] += (255 - parts.values[i]) * coefficient;\n    }\n  } else if (parts.type.indexOf('color') !== -1) {\n    for (let i = 0; i < 3; i += 1) {\n      parts.values[i] += (1 - parts.values[i]) * coefficient;\n    }\n  }\n\n  return recomposeColor(parts);\n}\n\n/**\n * given foreground and background colors, returns the color of the foreground color on the background color.\n * this is valuable for foreground colors with alpha.\n *\n * adapted from https://github.com/scttcper/tinycolor/blob/2927a9d2aa03e037486a79a295542a7848621691/src/index.ts#L583-L594\n *\n * @param foreground\n * @param background\n * @returns a tinycolor instance\n */\nexport const onBackground = (\n  foreground: tinycolor.ColorInput,\n  background: tinycolor.ColorInput\n): tinycolor.Instance => {\n  const fg = tinycolor(foreground).toRgb();\n  const bg = tinycolor(background).toRgb();\n  const alpha = fg.a + bg.a * (1 - fg.a);\n\n  return tinycolor({\n    r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / alpha,\n    g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / alpha,\n    b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / alpha,\n    a: alpha,\n  });\n};\n\ninterface DecomposeColor {\n  type: string;\n  values: any;\n  colorSpace?: string;\n}\n\nexport const colorManipulator = {\n  clamp,\n  hexToRgb,\n  rgbToHex,\n  asHexString,\n  asRgbString,\n  hslToRgb,\n  decomposeColor,\n  recomposeColor,\n  getContrastRatio,\n  getLuminance,\n  emphasize,\n  alpha,\n  darken,\n  lighten,\n  onBackground,\n};\n"],"names":["tinycolor","alpha"],"mappings":"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"}