houser-js-utils
Version:
A comprehensive collection of TypeScript utility functions for common development tasks including array manipulation, string processing, date handling, random number generation, validation, and much more.
1 lines • 17.3 kB
Source Map (JSON)
{"version":3,"file":"ColorUtils.mjs","sources":["../src/ColorUtils.ts"],"sourcesContent":["/**\n * @module ColorUtils\n * @description A collection of utility functions for color manipulation and conversion.\n * Supports RGB, HEX, HSL, and CMYK color formats with conversion between them.\n *\n * @example\n * ```typescript\n * import { ColorUtils } from 'houser-js-utils';\n *\n * // Convert hex to RGB\n * const rgb = ColorUtils.hexToRgb('#FF0000');\n *\n * // Adjust color brightness\n * const darker = ColorUtils.adjustBrightness(rgb, -20);\n *\n * // Generate random color\n * const randomHex = ColorUtils.randomColor('hex');\n * ```\n */\n\n/**\n * Supported color format types\n */\ntype ColorType = \"rgb\" | \"hex\" | \"hsl\" | \"cmyk\";\n\n/**\n * RGB color representation\n */\ninterface RGBColor {\n /** Red component (0-255) */\n r: number;\n /** Green component (0-255) */\n g: number;\n /** Blue component (0-255) */\n b: number;\n}\n\n/**\n * HSL color representation\n */\ninterface HSLColor {\n /** Hue component (0-360) */\n h: number;\n /** Saturation component (0-100) */\n s: number;\n /** Lightness component (0-100) */\n l: number;\n}\n\n/**\n * CMYK color representation\n */\ninterface CMYKColor {\n /** Cyan component (0-100) */\n c: number;\n /** Magenta component (0-100) */\n m: number;\n /** Yellow component (0-100) */\n y: number;\n /** Key (black) component (0-100) */\n k: number;\n}\n\n/**\n * Validates RGB color values\n * @param color - RGB color to validate\n * @throws Error if color values are invalid\n */\nconst validateRGB = (color: RGBColor): void => {\n const { r, g, b } = color;\n if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {\n throw new Error(\"RGB values must be between 0 and 255\");\n }\n};\n\n/**\n * Validates HSL color values\n * @param color - HSL color to validate\n * @throws Error if color values are invalid\n */\nconst validateHSL = (color: HSLColor): void => {\n const { h, s, l } = color;\n if (h < 0 || h > 360 || s < 0 || s > 100 || l < 0 || l > 100) {\n throw new Error(\n \"HSL values must be between 0-360 for hue and 0-100 for saturation and lightness\"\n );\n }\n};\n\n/**\n * Validates CMYK color values\n * @param color - CMYK color to validate\n * @throws Error if color values are invalid\n */\nconst validateCMYK = (color: CMYKColor): void => {\n const { c, m, y, k } = color;\n if (\n c < 0 ||\n c > 100 ||\n m < 0 ||\n m > 100 ||\n y < 0 ||\n y > 100 ||\n k < 0 ||\n k > 100\n ) {\n throw new Error(\"CMYK values must be between 0 and 100\");\n }\n};\n\nexport const ColorUtils = {\n /**\n * Adjusts the brightness of a color\n * @param color - RGB color values\n * @param amount - Amount to adjust (-100 to 100)\n * @returns Adjusted RGB color values\n */\n adjustBrightness(color: RGBColor, amount: number): RGBColor {\n validateRGB(color);\n const adjust = (value: number) =>\n Math.max(0, Math.min(255, value + amount));\n return {\n r: adjust(color.r),\n g: adjust(color.g),\n b: adjust(color.b),\n };\n },\n\n /**\n * Adjusts the saturation of a color by a specified amount\n * @param color - RGB color values\n * @param amount - Amount to adjust (-100 to 100)\n * @returns Adjusted RGB color values\n */\n adjustSaturation(color: RGBColor, amount: number): RGBColor {\n validateRGB(color);\n const hsl = this.rgbToHsl(color);\n hsl.s = Math.max(0, Math.min(100, hsl.s + amount));\n return this.hslToRgb(hsl);\n },\n\n /**\n * Blends two colors together\n * @param color1 - First RGB color\n * @param color2 - Second RGB color\n * @param ratio - Blend ratio (0 to 1)\n * @returns Blended RGB color\n */\n blendColors(color1: RGBColor, color2: RGBColor, ratio: number): RGBColor {\n validateRGB(color1);\n validateRGB(color2);\n if (ratio < 0 || ratio > 1) {\n throw new Error(\"Blend ratio must be between 0 and 1\");\n }\n const blend = (a: number, b: number) =>\n Math.round(a * (1 - ratio) + b * ratio);\n return {\n r: blend(color1.r, color2.r),\n g: blend(color1.g, color2.g),\n b: blend(color1.b, color2.b),\n };\n },\n\n /**\n * Converts a CMYK color to RGB\n * @param cmyk - CMYK color values\n * @returns RGB color values\n */\n cmykToRgb(cmyk: CMYKColor): RGBColor {\n validateCMYK(cmyk);\n const { c, m, y, k } = cmyk;\n const r = 255 * (1 - c / 100) * (1 - k / 100);\n const g = 255 * (1 - m / 100) * (1 - k / 100);\n const b = 255 * (1 - y / 100) * (1 - k / 100);\n return { r: Math.round(r), g: Math.round(g), b: Math.round(b) };\n },\n\n /**\n * Calculates the contrast ratio between two colors\n * @param color1 - First RGB color\n * @param color2 - Second RGB color\n * @returns Contrast ratio (1 to 21)\n */\n contrastRatio(color1: RGBColor, color2: RGBColor): number {\n validateRGB(color1);\n validateRGB(color2);\n const getLuminance = (color: RGBColor) => {\n const [r, g, b] = [color.r, color.g, color.b].map((c) => {\n c = c / 255;\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n };\n\n const l1 = getLuminance(color1);\n const l2 = getLuminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n },\n\n /**\n * Converts a hex color to RGB\n * @param hex - Hex color string (e.g., \"#FF0000\")\n * @returns RGB color values\n */\n hexToRgb(hex: string): RGBColor {\n if (!this.isValidHexColor(hex)) {\n throw new Error(\"Invalid hex color format\");\n }\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) throw new Error(\"Invalid hex color\");\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n };\n },\n\n /**\n * Converts an HSL color to RGB\n * @param hsl - HSL color values\n * @returns RGB color values\n */\n hslToRgb(hsl: HSLColor): RGBColor {\n validateHSL(hsl);\n const { h, s, l } = hsl;\n const s1 = s / 100;\n const l1 = l / 100;\n\n const c = (1 - Math.abs(2 * l1 - 1)) * s1;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l1 - c / 2;\n\n let r = 0,\n g = 0,\n b = 0;\n\n if (h >= 0 && h < 60) {\n r = c;\n g = x;\n b = 0;\n } else if (h >= 60 && h < 120) {\n r = x;\n g = c;\n b = 0;\n } else if (h >= 120 && h < 180) {\n r = 0;\n g = c;\n b = x;\n } else if (h >= 180 && h < 240) {\n r = 0;\n g = x;\n b = c;\n } else if (h >= 240 && h < 300) {\n r = x;\n g = 0;\n b = c;\n } else if (h >= 300 && h < 360) {\n r = c;\n g = 0;\n b = x;\n }\n\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n };\n },\n\n /**\n * Inverts a color\n * @param color - RGB color values\n * @returns Inverted RGB color values\n */\n invertColor(color: RGBColor): RGBColor {\n validateRGB(color);\n return {\n r: 255 - color.r,\n g: 255 - color.g,\n b: 255 - color.b,\n };\n },\n\n /**\n * Validates if a string is a valid hex color\n * @param hex - Hex color string to validate\n * @returns True if the string is a valid hex color\n */\n isValidHexColor(hex: string): boolean {\n return /^#?([a-f\\d]{3}|[a-f\\d]{6})$/i.test(hex);\n },\n\n /**\n * Generates a random color in the specified format\n * @param type - Color format (rgb, hex, hsl, or cmyk)\n * @returns Random color string in the specified format\n */\n randomColor(type: ColorType = \"hex\"): string {\n const getRandomValue = (max: number): number =>\n Math.floor(Math.random() * max);\n\n switch (type) {\n case \"rgb\":\n const r = getRandomValue(256);\n const g = getRandomValue(256);\n const b = getRandomValue(256);\n return `rgb(${r}, ${g}, ${b})`;\n\n case \"hex\":\n const r1 = getRandomValue(256);\n const g1 = getRandomValue(256);\n const b1 = getRandomValue(256);\n return `#${[r1, g1, b1]\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n\n case \"hsl\":\n const h = getRandomValue(361);\n const s = getRandomValue(101);\n const l = getRandomValue(101);\n return `hsl(${h}, ${s}%, ${l}%)`;\n\n case \"cmyk\":\n const c = getRandomValue(101);\n const m = getRandomValue(101);\n const y = getRandomValue(101);\n const k = getRandomValue(101);\n return `cmyk(${c}%, ${m}%, ${y}%, ${k}%)`;\n\n default:\n const r2 = getRandomValue(256);\n const g2 = getRandomValue(256);\n const b2 = getRandomValue(256);\n return `#${[r2, g2, b2]\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n }\n },\n\n /**\n * Converts RGB color to CMYK\n * @param rgb - RGB color values\n * @returns CMYK color values\n */\n rgbToCmyk(rgb: RGBColor): CMYKColor {\n validateRGB(rgb);\n const { r, g, b } = rgb;\n const r1 = r / 255;\n const g1 = g / 255;\n const b1 = b / 255;\n\n const k = 1 - Math.max(r1, g1, b1);\n const c = (1 - r1 - k) / (1 - k) || 0;\n const m = (1 - g1 - k) / (1 - k) || 0;\n const y = (1 - b1 - k) / (1 - k) || 0;\n\n return {\n c: Math.round(c * 100),\n m: Math.round(m * 100),\n y: Math.round(y * 100),\n k: Math.round(k * 100),\n };\n },\n\n /**\n * Converts RGB color to hex\n * @param rgb - RGB color values\n * @returns Hex color string\n */\n rgbToHex(rgb: RGBColor): string {\n validateRGB(rgb);\n const { r, g, b } = rgb;\n return \"#\" + [r, g, b].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n },\n\n /**\n * Converts RGB color to HSL\n * @param rgb - RGB color values\n * @returns HSL color values\n */\n rgbToHsl(rgb: RGBColor): HSLColor {\n validateRGB(rgb);\n const { r, g, b } = rgb;\n const r1 = r / 255;\n const g1 = g / 255;\n const b1 = b / 255;\n\n const max = Math.max(r1, g1, b1);\n const min = Math.min(r1, g1, b1);\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 r1:\n h = (g1 - b1) / d + (g1 < b1 ? 6 : 0);\n break;\n case g1:\n h = (b1 - r1) / d + 2;\n break;\n case b1:\n h = (r1 - g1) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n },\n};\n"],"names":[],"mappings":"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"}