@clerk/shared
Version:
Internal package utils used by the Clerk SDKs
1 lines • 8.06 kB
Source Map (JSON)
{"version":3,"file":"color.mjs","names":[],"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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"}