{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "color",
  "title": "颜色计算",
  "description": "零依赖 HEX、RGB、HSV 与 HSL 颜色转换。",
  "files": [
    {
      "path": "src/registry/lib/color.ts",
      "content": "/** 颜色计算保留浮点精度，只在格式化输出时取整。 */\ntype RGB = { r: number; g: number; b: number; a: number }\ntype HSV = { h: number; s: number; v: number; a: number }\ntype HSL = { h: number; s: number; l: number; a: number }\nfunction clamp(value: number, max = 1) {\n  return Math.min(max, Math.max(0, value))\n}\nfunction parseHex(\n  input: string,\n  { alpha }: { alpha?: boolean } = {},\n): RGB | null {\n  let hex = input.trim().replace(/^#/, \"\")\n  if (!/^(?:[\\da-f]{3}|[\\da-f]{4}|[\\da-f]{6}|[\\da-f]{8})$/i.test(hex))\n    return null\n  if (alpha === false && (hex.length === 4 || hex.length === 8)) return null\n  if (hex.length < 5) hex = [...hex].map((c) => c + c).join(\"\")\n  return {\n    r: parseInt(hex.slice(0, 2), 16),\n    g: parseInt(hex.slice(2, 4), 16),\n    b: parseInt(hex.slice(4, 6), 16),\n    a: hex.length === 8 ? parseInt(hex.slice(6), 16) / 255 : 1,\n  }\n}\nfunction rgbToHex(rgb: RGB, alpha = false) {\n  return (\n    \"#\" +\n    [rgb.r, rgb.g, rgb.b, ...(alpha ? [rgb.a * 255] : [])]\n      .map((v) => Math.round(clamp(v, 255)).toString(16).padStart(2, \"0\"))\n      .join(\"\")\n  )\n}\nfunction rgbToHsv({ r, g, b, a }: RGB, hue = 0): HSV {\n  r /= 255\n  g /= 255\n  b /= 255\n  const max = Math.max(r, g, b),\n    min = Math.min(r, g, b),\n    d = max - min\n  const h = !d\n    ? hue\n    : ((max === r\n        ? (g - b) / d\n        : max === g\n          ? (b - r) / d + 2\n          : (r - g) / d + 4) *\n        60 +\n        360) %\n      360\n  return { h, s: max ? d / max : 0, v: max, a }\n}\nfunction hsvToRgb({ h, s, v, a }: HSV): RGB {\n  h = ((h % 360) + 360) % 360\n  s = clamp(s)\n  v = clamp(v)\n  const c = v * s,\n    x = c * (1 - Math.abs(((h / 60) % 2) - 1)),\n    m = v - c\n  const [r, g, b] =\n    h < 60\n      ? [c, x, 0]\n      : h < 120\n        ? [x, c, 0]\n        : h < 180\n          ? [0, c, x]\n          : h < 240\n            ? [0, x, c]\n            : h < 300\n              ? [x, 0, c]\n              : [c, 0, x]\n  return { r: (r + m) * 255, g: (g + m) * 255, b: (b + m) * 255, a: clamp(a) }\n}\nfunction hsvToHsl({ h, s, v, a }: HSV): HSL {\n  const l = v * (1 - s / 2)\n  return { h, s: l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l), l, a }\n}\nfunction hslToHsv({ h, s, l, a }: HSL): HSV {\n  const v = l + s * Math.min(l, 1 - l)\n  return { h, s: v ? 2 * (1 - l / v) : 0, v, a }\n}\nfunction rgbToHsl(rgb: RGB, hue = 0) {\n  return hsvToHsl(rgbToHsv(rgb, hue))\n}\nfunction hslToRgb(hsl: HSL) {\n  return hsvToRgb(hslToHsv(hsl))\n}\nexport {\n  clamp,\n  parseHex,\n  rgbToHex,\n  rgbToHsv,\n  hsvToRgb,\n  hsvToHsl,\n  hslToHsv,\n  rgbToHsl,\n  hslToRgb,\n}\nexport type { RGB, HSV, HSL }\n",
      "type": "registry:ui",
      "target": "lib/color.ts"
    }
  ],
  "type": "registry:lib"
}
