UNPKG

vuestic-ui

Version:
1 lines 11.7 kB
{"version":3,"file":"color.mjs","sources":["../../../../src/utils/color.ts"],"sourcesContent":["const HEX_TEST_REGEX = /^#([A-Fa-f0-9]{3,4}|[A-Fa-f0-9]{6,8})$/\nconst RGB_TEST_REGEX = /^rgba?\\(([\\d.]+, ?){2}[\\d.]+(, ?[\\d.]+)?\\)$/\n/**\n * DIGIT - [\\d.]+ - any number of digits and dots\n * MAYBE_ANGLE - (deg|rad|turn|grad)? - optional angle unit: may be 200deg or 200\n * SEPARATOR - ,?\\s - optional comma and space: may be 200deg, 50% or 200deg 50%\n * MAYBE_PERCENT - %? - any number of digits and dots, optional percent: may be 50% or 50\n * MAYBE_SLASH - (\\/\\s)? - optional slash and space: may be 50% or 50 / 50%\n *\n * hsla?(DIGIT MAYBE_ANGLE SEPARATOR DIGIT MAYBE_PERCENT SEPARATOR DIGIT MAYBE_PERCENT (SEPARATOR MAYBE_SLASH DIGIT MAYBE_PERCENT)?)\n */\nconst HSL_TEST_REGEX = /hsla?\\([\\d.]+(deg|rad|turn|grad)?(,?\\s?[\\d.]+%?){2}(,?\\s?(\\/\\s?)?[\\d.]+%?)?\\)/\n\nexport const isColor = (strColor: string): boolean => {\n return HEX_TEST_REGEX.test(strColor) || RGB_TEST_REGEX.test(strColor) || HSL_TEST_REGEX.test(strColor)\n}\n\nexport type HSLObject = { h: number; s: number; l: number; a: number }\nexport type RGBObject = { r: number; g: number; b: number; a: number }\n\nconst isHSLObject = (obj: unknown): obj is HSLObject => {\n if (typeof obj !== 'object' || obj === null) { return false }\n return 'h' in obj && 's' in obj && 'l' in obj\n}\n\nconst isRGBObject = (obj: unknown): obj is RGBObject => {\n if (typeof obj !== 'object' || obj === null) { return false }\n return 'r' in obj && 'g' in obj && 'b' in obj\n}\n\nconst tryParseHex = (color: string): RGBObject | null => {\n if (!HEX_TEST_REGEX.test(color)) {\n return null\n }\n\n const hex = color.replace('#', '')\n const isShort = hex.length < 6\n const [r, g, b, a] = isShort\n ? hex.split('').map((char) => parseInt(char + char, 16))\n : hex.match(/.{2}/g)!.map((hex) => parseInt(hex, 16))\n\n return { r, g, b, a: a ?? 1 }\n}\n\nconst tryParseRgb = (color: string): RGBObject | null => {\n if (!RGB_TEST_REGEX.test(color)) {\n return null\n }\n\n const [r, g, b, a = 1] = color.match(/[\\d.]+/g)!.map(Number)\n return { r, g, b, a: a }\n}\n\nconst tryParseHsla = (color: string): HSLObject | null => {\n if (!HSL_TEST_REGEX.test(color)) {\n return null\n }\n\n const [h, s, l, a = '1'] = color.match(/[\\d.]+%?/g)!\n\n return {\n h: Number(h),\n s: Number(s.replace('%', '')),\n l: Number(l.replace('%', '')),\n a: (a.endsWith('%') ? Number(a.replace('%', '')) / 100 : Number(a)),\n }\n}\n\nexport const rgbaToHsla = (rgba: RGBObject): HSLObject => {\n const r = rgba.r / 255\n const g = rgba.g / 255\n const b = rgba.b / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n\n let h = 0\n let s = 0\n const l = (max + min) / 2\n\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0)\n break\n case g:\n h = (b - r) / d + 2\n break\n case b:\n h = (r - g) / d + 4\n break\n }\n\n h *= 60\n }\n\n return { h: Math.round(h), s: Math.round(s * 100), l: Math.round(l * 100), a: rgba.a }\n}\n\nconst hueToRgb = (p: number, q: number, t: number) => {\n if (t < 0) { t += 1 }\n if (t > 1) { t -= 1 }\n if (t < 1 / 6) { return p + (q - p) * 6 * t }\n if (t < 1 / 2) { return q }\n if (t < 2 / 3) { return p + (q - p) * (2 / 3 - t) * 6 }\n return p\n}\n\nexport const hslaToRgba = (hsla: HSLObject): RGBObject => {\n const h = hsla.h / 360\n const s = hsla.s / 100\n const l = hsla.l / 100\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n\n const r = hueToRgb(p, q, h + 1 / 3)\n const g = hueToRgb(p, q, h)\n const b = hueToRgb(p, q, h - 1 / 3)\n\n return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255), a: hsla.a }\n}\n\nexport const parseColorToHSL = (color: string | HSLObject | RGBObject) => {\n if (isHSLObject(color)) { return { ...color } }\n if (isRGBObject(color)) { return rgbaToHsla(color) }\n\n const rgb = tryParseHex(color) ?? tryParseRgb(color)\n\n if (rgb) { return rgbaToHsla(rgb) }\n\n const hsl = tryParseHsla(color)\n\n if (hsl) { return hsl }\n\n throw new Error(`Color ${color} is not valid. Please, provide valid color.`)\n}\n\nexport const hslToString = ({ h, s, l, a }: HSLObject) => {\n return `hsla(${h},${s}%,${l}%,${a ?? 1})`\n}\n\nexport const parseColorToRGB = (color: string | HSLObject | RGBObject) => {\n if (isRGBObject(color)) { return { ...color } }\n if (isHSLObject(color)) { return hslaToRgba(color) }\n\n const hsl = tryParseHsla(color)\n\n if (hsl) { return hslaToRgba(hsl) }\n\n const rgb = tryParseHex(color) ?? tryParseRgb(color)\n\n if (rgb) { return rgb }\n\n throw new Error(`Color ${color} is not valid. Please, provide valid color.`)\n}\n\nexport const rgbToString = ({ r, g, b, a }: RGBObject) => {\n if (a === 1) {\n return `rgb(${r},${g},${b})`\n }\n return `rgba(${r},${g},${b},${a ?? 1})`\n}\n\nexport const colorToString = (color: string | HSLObject | RGBObject) => {\n if (isHSLObject(color)) { return hslToString(color) }\n if (isRGBObject(color)) { return rgbToString(color) }\n if (typeof color === 'string') { return color }\n\n throw new Error(`Color ${color} is not valid. Please, provide valid color.`)\n}\n\nexport const setHSLA = (color: string | HSLObject | RGBObject, { h, s, l, a }: Partial<HSLObject>) => {\n const parsedColor = parseColorToHSL(color)\n\n parsedColor.a = parsedColor.a ?? 1\n\n parsedColor.h = h ?? parsedColor.h\n parsedColor.s = s ?? parsedColor.s\n parsedColor.l = l ?? parsedColor.l\n parsedColor.a = a ?? parsedColor.a\n\n if (parsedColor.h < 0) { parsedColor.h = 360 + parsedColor.h }\n if (parsedColor.h > 360) { parsedColor.h = parsedColor.h - 360 }\n\n parsedColor.s = Math.max(0, Math.min(100, parsedColor.s))\n parsedColor.l = Math.max(0, Math.min(100, parsedColor.l))\n parsedColor.a = Math.max(0, Math.min(1, parsedColor.a))\n\n return parsedColor\n}\n\nexport const shiftHSLA = (color: string | HSLObject | RGBObject, { h, s, l, a }: Partial<HSLObject>) => {\n const parsedColor = parseColorToHSL(color)\n\n parsedColor.a = parsedColor.a ?? 1\n\n parsedColor.h += h ?? 0\n parsedColor.s += s ?? 0\n parsedColor.l += l ?? 0\n parsedColor.a += a ?? 0\n\n if (parsedColor.h < 0) { parsedColor.h = 360 + parsedColor.h }\n if (parsedColor.h > 360) { parsedColor.h = parsedColor.h - 360 }\n\n parsedColor.s = Math.max(0, Math.min(100, parsedColor.s))\n parsedColor.l = Math.max(0, Math.min(100, parsedColor.l))\n parsedColor.a = Math.max(0, Math.min(1, parsedColor.a))\n\n return parsedColor\n}\n"],"names":["hex"],"mappings":"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"}