{"version":3,"file":"color.mjs","names":["res: HslaColor"],"sources":["../../src/color.ts"],"sourcesContent":["import type { Color, HslaColor, RgbaColor, TransparentColor } from './types';\n\nconst IS_HEX_COLOR_REGEX = /^#?([A-F0-9]{6}|[A-F0-9]{3})$/i;\n\nconst IS_RGB_COLOR_REGEX = /^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/i;\nconst IS_RGBA_COLOR_REGEX = /^rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+)(,\\s*\\d+(\\.\\d+)?)\\)$/i;\n\nconst IS_HSL_COLOR_REGEX = /^hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)$/i;\nconst IS_HSLA_COLOR_REGEX = /^hsla\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%(,\\s*\\d+(\\.\\d+)?)*\\)$/i;\n\nexport const isValidHexString = (s: string) => {\n  return !!s.match(IS_HEX_COLOR_REGEX);\n};\n\nexport const isValidRgbaString = (s: string) => {\n  return !!(s.match(IS_RGB_COLOR_REGEX) || s.match(IS_RGBA_COLOR_REGEX));\n};\n\nexport const isValidHslaString = (s: string) => {\n  return !!s.match(IS_HSL_COLOR_REGEX) || !!s.match(IS_HSLA_COLOR_REGEX);\n};\n\nexport const isRGBColor = (c: Color): c is RgbaColor => {\n  return typeof c !== 'string' && 'r' in c;\n};\n\nexport const isHSLColor = (c: Color): c is HslaColor => {\n  return typeof c !== 'string' && 'h' in c;\n};\n\nexport const isTransparent = (c: Color): c is TransparentColor => {\n  return c === 'transparent';\n};\n\nexport const hasAlpha = (color: Color): boolean => {\n  return typeof color !== 'string' && color.a != undefined && color.a < 1;\n};\n\nconst CLEAN_HSLA_REGEX = /[hsla()]/g;\nconst CLEAN_RGBA_REGEX = /[rgba()]/g;\n\nexport const stringToHslaColor = (value: string): HslaColor | null => {\n  if (value === 'transparent') {\n    return { h: 0, s: 0, l: 0, a: 0 };\n  }\n\n  if (isValidHexString(value)) {\n    return hexStringToHslaColor(value);\n  }\n\n  if (isValidHslaString(value)) {\n    return parseHslaString(value);\n  }\n\n  if (isValidRgbaString(value)) {\n    return rgbaStringToHslaColor(value);\n  }\n\n  return null;\n};\n\nexport const stringToSameTypeColor = (value: string): Color => {\n  value = value.trim();\n  if (isValidHexString(value)) {\n    return value.startsWith('#') ? value : `#${value}`;\n  }\n\n  if (isValidRgbaString(value)) {\n    return parseRgbaString(value);\n  }\n\n  if (isValidHslaString(value)) {\n    return parseHslaString(value);\n  }\n\n  if (isTransparent(value)) {\n    return value;\n  }\n  return '';\n};\n\nexport const colorToSameTypeString = (color: Color): string | TransparentColor => {\n  if (typeof color === 'string' && (isValidHexString(color) || isTransparent(color))) {\n    return color;\n  }\n\n  if (isRGBColor(color)) {\n    return rgbaColorToRgbaString(color);\n  }\n\n  if (isHSLColor(color)) {\n    return hslaColorToHslaString(color);\n  }\n\n  return '';\n};\n\nexport const hexStringToRgbaColor = (hex: string): RgbaColor => {\n  hex = hex.replace('#', '');\n  const r = parseInt(hex.substring(0, 2), 16);\n  const g = parseInt(hex.substring(2, 4), 16);\n  const b = parseInt(hex.substring(4, 6), 16);\n  return { r, g, b };\n};\n\nconst rgbaColorToRgbaString = (color: RgbaColor): string => {\n  const { a, b, g, r } = color;\n  return color.a === 0 ? 'transparent' : color.a != undefined ? `rgba(${r},${g},${b},${a})` : `rgb(${r},${g},${b})`;\n};\n\nconst hslaColorToHslaString = (color: HslaColor): string => {\n  const { h, s, l, a } = color;\n  const sPerc = Math.round(s * 100);\n  const lPerc = Math.round(l * 100);\n  return color.a === 0\n    ? 'transparent'\n    : color.a != undefined\n      ? `hsla(${h},${sPerc}%,${lPerc}%,${a})`\n      : `hsl(${h},${sPerc}%,${lPerc}%)`;\n};\n\nconst hexStringToHslaColor = (hex: string): HslaColor => {\n  const rgbaString = colorToSameTypeString(hexStringToRgbaColor(hex));\n  return rgbaStringToHslaColor(rgbaString);\n};\n\nconst rgbaStringToHslaColor = (rgba: string): HslaColor => {\n  const rgbaColor = parseRgbaString(rgba);\n  const r = rgbaColor.r / 255;\n  const g = rgbaColor.g / 255;\n  const b = rgbaColor.b / 255;\n\n  const max = Math.max(r, g, b),\n    min = Math.min(r, g, b);\n  let h, s;\n  const l = (max + min) / 2;\n\n  if (max == min) {\n    h = s = 0;\n  } else {\n    const d = max - min;\n    s = l >= 0.5 ? d / (2 - (max + min)) : d / (max + min);\n    switch (max) {\n      case r:\n        h = ((g - b) / d) * 60;\n        break;\n      case g:\n        h = ((b - r) / d + 2) * 60;\n        break;\n      default:\n        h = ((r - g) / d + 4) * 60;\n        break;\n    }\n  }\n\n  const res: HslaColor = { h: Math.round(h), s, l };\n  const a = rgbaColor.a;\n  if (a != undefined) {\n    res.a = a;\n  }\n  return res;\n};\n\nconst parseRgbaString = (str: string): RgbaColor => {\n  const [r, g, b, a] = str\n    .replace(CLEAN_RGBA_REGEX, '')\n    .split(',')\n    .map(c => Number.parseFloat(c));\n  return { r, g, b, a };\n};\n\nconst parseHslaString = (str: string): HslaColor => {\n  const [h, s, l, a] = str\n    .replace(CLEAN_HSLA_REGEX, '')\n    .split(',')\n    .map(c => Number.parseFloat(c));\n  return { h, s: s / 100, l: l / 100, a };\n};\n"],"mappings":"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"}