{"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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"}