@trishchuk/coolors-mcp 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +23 -20
- package/.github/workflows/deploy-docs.yml +6 -3
- package/.github/workflows/release.yml +11 -9
- package/README.md +123 -14
- package/dist/bin/server.js +997 -256
- package/dist/bin/server.js.map +1 -1
- package/dist/{chunk-P3ARRKLS.js → chunk-HOMDMKUY.js} +3 -1
- package/dist/{chunk-P3ARRKLS.js.map → chunk-HOMDMKUY.js.map} +1 -1
- package/dist/{chunk-IQ7NN26V.js → chunk-LHW2ZTOU.js} +14 -2
- package/dist/chunk-LHW2ZTOU.js.map +1 -0
- package/dist/color/index.js +1 -1
- package/dist/coolors-mcp.d.ts +4 -4
- package/dist/coolors-mcp.js +1 -1
- package/eslint.config.ts +13 -0
- package/jsr.json +1 -1
- package/package.json +16 -12
- package/src/bin/server.ts +13 -1
- package/src/color/__tests__/extract-colors.test.ts +20 -30
- package/src/color/apca.ts +105 -0
- package/src/color/color-blindness.ts +109 -0
- package/src/coolors-mcp.ts +1 -1
- package/src/session.ts +10 -2
- package/src/theme/matcher.ts +1 -1
- package/src/theme/refactor.ts +1 -1
- package/src/theme/types.ts +3 -0
- package/src/tools/__tests__/cohesion.test.ts +97 -0
- package/src/tools/__tests__/color-blindness.test.ts +45 -0
- package/src/tools/__tests__/color-conversion.test.ts +38 -0
- package/src/tools/__tests__/contrast-checker.test.ts +56 -0
- package/src/tools/__tests__/palette-export.test.ts +54 -0
- package/src/tools/adjust-color.tool.ts +80 -0
- package/src/tools/cohesion.tools.ts +380 -0
- package/src/tools/color-blindness.tool.ts +168 -0
- package/src/tools/color-conversion.tool.ts +1 -1
- package/src/tools/contrast-checker.tool.ts +53 -14
- package/src/tools/dislike-analyzer.tool.ts +41 -54
- package/src/tools/image-extraction.tools.ts +62 -115
- package/src/tools/index.ts +15 -2
- package/src/tools/palette-export.tool.ts +174 -0
- package/src/tools/palette-with-locks.tool.ts +8 -6
- package/src/types.ts +2 -3
- package/tsconfig.json +12 -2
- package/vitest.config.js +1 -3
- package/.claude/settings.local.json +0 -35
- package/.env +0 -2
- package/.mcp.json +0 -12
- package/CLAUDE.md +0 -201
- package/DOCUMENTATION.md +0 -274
- package/GEMINI.md +0 -54
- package/TOOLS_UK.md +0 -233
- package/demo/content_based_color.png +0 -0
- package/demo/music-player.html +0 -621
- package/demo/podcast-player.html +0 -903
- package/dist/chunk-IQ7NN26V.js.map +0 -1
- package/docs/.vitepress/cache/deps/@braintree_sanitize-url.js +0 -111
- package/docs/.vitepress/cache/deps/@braintree_sanitize-url.js.map +0 -7
- package/docs/.vitepress/cache/deps/_metadata.json +0 -127
- package/docs/.vitepress/cache/deps/chunk-BUSYA2B4.js +0 -12
- package/docs/.vitepress/cache/deps/chunk-BUSYA2B4.js.map +0 -7
- package/docs/.vitepress/cache/deps/chunk-JD3CXNQ6.js +0 -13614
- package/docs/.vitepress/cache/deps/chunk-JD3CXNQ6.js.map +0 -7
- package/docs/.vitepress/cache/deps/chunk-SYPOPCWC.js +0 -10698
- package/docs/.vitepress/cache/deps/chunk-SYPOPCWC.js.map +0 -7
- package/docs/.vitepress/cache/deps/cytoscape-cose-bilkent.js +0 -5609
- package/docs/.vitepress/cache/deps/cytoscape-cose-bilkent.js.map +0 -7
- package/docs/.vitepress/cache/deps/cytoscape.js +0 -36234
- package/docs/.vitepress/cache/deps/cytoscape.js.map +0 -7
- package/docs/.vitepress/cache/deps/dayjs.js +0 -507
- package/docs/.vitepress/cache/deps/dayjs.js.map +0 -7
- package/docs/.vitepress/cache/deps/debug.js +0 -512
- package/docs/.vitepress/cache/deps/debug.js.map +0 -7
- package/docs/.vitepress/cache/deps/package.json +0 -3
- package/docs/.vitepress/cache/deps/prismjs.js +0 -1638
- package/docs/.vitepress/cache/deps/prismjs.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-bash.js +0 -235
- package/docs/.vitepress/cache/deps/prismjs_components_prism-bash.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-javascript.js +0 -173
- package/docs/.vitepress/cache/deps/prismjs_components_prism-javascript.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-json.js +0 -27
- package/docs/.vitepress/cache/deps/prismjs_components_prism-json.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-python.js +0 -72
- package/docs/.vitepress/cache/deps/prismjs_components_prism-python.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-typescript.js +0 -56
- package/docs/.vitepress/cache/deps/prismjs_components_prism-typescript.js.map +0 -7
- package/docs/.vitepress/cache/deps/prismjs_components_prism-yaml.js +0 -107
- package/docs/.vitepress/cache/deps/prismjs_components_prism-yaml.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +0 -5074
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +0 -584
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +0 -1483
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +0 -1779
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +0 -7
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js +0 -2023
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js.map +0 -7
- package/docs/.vitepress/cache/deps/vue.js +0 -344
- package/docs/.vitepress/cache/deps/vue.js.map +0 -7
- package/examples/theme-matching.md +0 -113
- package/mcp-config.json +0 -8
- package/note.md +0 -34
- package/research_results.md +0 -53
- package/src/tools/colors.ts +0 -31
- package/src/tools/registry.ts +0 -142
- package/src/tools/simple-tools.ts +0 -37
|
@@ -722,6 +722,8 @@ var TonalPalette = class _TonalPalette {
|
|
|
722
722
|
this.hue = hue;
|
|
723
723
|
this.chroma = chroma;
|
|
724
724
|
}
|
|
725
|
+
hue;
|
|
726
|
+
chroma;
|
|
725
727
|
/**
|
|
726
728
|
* Get extended tones for more options
|
|
727
729
|
*/
|
|
@@ -1211,4 +1213,4 @@ export {
|
|
|
1211
1213
|
saturate,
|
|
1212
1214
|
toGrayscale
|
|
1213
1215
|
};
|
|
1214
|
-
//# sourceMappingURL=chunk-
|
|
1216
|
+
//# sourceMappingURL=chunk-HOMDMKUY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/color/types.ts","../src/color/conversions.ts","../src/color/hct/hct-solver.ts","../src/color/hct/hct-class.ts","../src/color/dislike/dislike-analyzer.ts","../src/color/hct/harmonization.ts","../src/color/hct/tonal-palette.ts","../src/color/hct/types.ts","../src/color/metrics.ts","../src/color/utils.ts"],"sourcesContent":["/**\n * Color type definitions for various color spaces\n */\n\n/**\n * Supported color formats for parsing\n */\nexport enum ColorFormat {\n HEX = \"hex\",\n HSL = \"hsl\",\n HSV = \"hsv\",\n LAB = \"lab\",\n RGB = \"rgb\",\n XYZ = \"xyz\",\n}\n\n/**\n * Options for color distance calculations\n */\nexport interface ColorDistanceOptions {\n /**\n * Parameters for Delta E 94\n */\n deltaE94?: {\n kC?: number;\n kH?: number;\n kL?: number;\n };\n\n /**\n * Type of distance metric to use\n */\n metric?: \"deltaE2000\" | \"deltaE76\" | \"deltaE94\" | \"euclidean\" | \"weighted\";\n\n /**\n * Weights for weighted RGB distance\n */\n weights?: {\n b?: number;\n g?: number;\n r?: number;\n };\n}\n\n/**\n * Color input type that can be parsed\n */\nexport type ColorInput = HSL | HSV | LAB | RGB | string | XYZ;\n\n/**\n * HCT (Hue, Chroma, Tone) color representation\n */\nexport interface HCT {\n c: number; // Chroma [0, ~150]\n h: number; // Hue [0, 360)\n t: number; // Tone [0, 100]\n}\n\n/**\n * Hexadecimal color representation\n */\nexport type HEX = string;\n\n/**\n * HSL (Hue, Saturation, Lightness) color representation\n * h: [0, 360] degrees\n * s: [0, 100] percentage\n * l: [0, 100] percentage\n */\nexport interface HSL {\n h: number;\n l: number;\n s: number;\n}\n\n/**\n * HSV (Hue, Saturation, Value) color representation\n * Also known as HSB (Hue, Saturation, Brightness)\n * h: [0, 360] degrees\n * s: [0, 100] percentage\n * v: [0, 100] percentage\n */\nexport interface HSV {\n h: number;\n s: number;\n v: number;\n}\n\n/**\n * LAB color space (CIE L*a*b*)\n * L: [0, 100] lightness\n * a: [-128, 127] green-red axis\n * b: [-128, 127] blue-yellow axis\n */\nexport interface LAB {\n a: number;\n b: number;\n l: number;\n}\n\n/**\n * Color parsing result\n */\nexport interface ParsedColor {\n format: ColorFormat;\n value: HSL | HSV | LAB | RGB | XYZ;\n}\n\n/**\n * RGB color representation\n * Values should be in range [0, 255]\n */\nexport interface RGB {\n b: number;\n g: number;\n r: number;\n}\n\n/**\n * XYZ color space (CIE 1931)\n * Reference white: D65 illuminant\n */\nexport interface XYZ {\n x: number;\n y: number;\n z: number;\n}\n\n/**\n * Constants for color space conversions\n */\nexport const ColorConstants = {\n /**\n * D65 illuminant reference white point\n */\n D65: {\n X: 95.047,\n Y: 100.0,\n Z: 108.883,\n },\n\n /**\n * Epsilon for LAB conversion\n */\n EPSILON: 0.008856,\n\n /**\n * Kappa for LAB conversion\n */\n KAPPA: 903.3,\n} as const;\n","/**\n * Color space conversion functions\n */\n\nimport type { HEX, HSL, HSV, LAB, RGB, XYZ } from \"./types.js\";\n\nimport { ColorConstants } from \"./types.js\";\n\n/**\n * Convert ARGB format to RGB\n */\nexport function argbToRgb(argb: number): RGB {\n const r = (argb >> 16) & 0xff;\n const g = (argb >> 8) & 0xff;\n const b = argb & 0xff;\n return { b, g, r };\n}\n\n/**\n * Convert hexadecimal to RGB color\n */\nexport function hexToRgb(hex: HEX): RGB {\n // Remove # if present\n const cleanHex = hex.replace(\"#\", \"\");\n\n // Handle 3-digit hex\n const fullHex =\n cleanHex.length === 3\n ? cleanHex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleanHex;\n\n const num = parseInt(fullHex, 16);\n\n return {\n b: num & 255,\n g: (num >> 8) & 255,\n r: (num >> 16) & 255,\n };\n}\n\n/**\n * Convert HSL to RGB color space\n */\nexport function hslToRgb(hsl: HSL): RGB {\n const h = hsl.h / 360;\n const s = hsl.s / 100;\n const l = hsl.l / 100;\n\n let b: number, g: number, r: number;\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number): 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\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return {\n b: Math.round(b * 255),\n g: Math.round(g * 255),\n r: Math.round(r * 255),\n };\n}\n\n/**\n * Convert HSV to RGB color space\n */\nexport function hsvToRgb(hsv: HSV): RGB {\n const h = hsv.h / 360;\n const s = hsv.s / 100;\n const v = hsv.v / 100;\n\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n\n let b: number, g: number, r: number;\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n default:\n r = 0;\n g = 0;\n b = 0;\n }\n\n return {\n b: Math.round(b * 255),\n g: Math.round(g * 255),\n r: Math.round(r * 255),\n };\n}\n\n/**\n * Convert LAB to RGB color space\n */\nexport function labToRgb(lab: LAB): RGB {\n return xyzToRgb(labToXyz(lab));\n}\n\n/**\n * Convert LAB to XYZ color space\n */\nexport function labToXyz(lab: LAB): XYZ {\n const { D65, EPSILON, KAPPA } = ColorConstants;\n\n const fy = (lab.l + 16) / 116;\n const fx = lab.a / 500 + fy;\n const fz = fy - lab.b / 200;\n\n const x3 = Math.pow(fx, 3);\n const y3 = Math.pow(fy, 3);\n const z3 = Math.pow(fz, 3);\n\n const x = x3 > EPSILON ? x3 : (116 * fx - 16) / KAPPA;\n const y = lab.l > KAPPA * EPSILON ? y3 : lab.l / KAPPA;\n const z = z3 > EPSILON ? z3 : (116 * fz - 16) / KAPPA;\n\n return {\n x: x * D65.X,\n y: y * D65.Y,\n z: z * D65.Z,\n };\n}\n\n/**\n * Parse color string to RGB\n * Supports: hex (#fff, #ffffff), rgb(r,g,b), hsl(h,s,l)\n */\nexport function parseColor(color: string): null | RGB {\n const trimmed = color.trim().toLowerCase();\n\n // Hex color\n if (trimmed.startsWith(\"#\")) {\n try {\n return hexToRgb(trimmed);\n } catch {\n return null;\n }\n }\n\n // RGB color\n const rgbMatch = trimmed.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n return {\n b: parseInt(rgbMatch[3], 10),\n g: parseInt(rgbMatch[2], 10),\n r: parseInt(rgbMatch[1], 10),\n };\n }\n\n // HSL color\n const hslMatch = trimmed.match(/^hsla?\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%/);\n if (hslMatch) {\n return hslToRgb({\n h: parseInt(hslMatch[1], 10),\n l: parseInt(hslMatch[3], 10),\n s: parseInt(hslMatch[2], 10),\n });\n }\n\n return null;\n}\n\n/**\n * Convert RGB to ARGB format (32-bit integer)\n */\nexport function rgbToArgb(rgb: RGB): number {\n const r = Math.round(Math.max(0, Math.min(255, rgb.r)));\n const g = Math.round(Math.max(0, Math.min(255, rgb.g)));\n const b = Math.round(Math.max(0, Math.min(255, rgb.b)));\n // Use >>> 0 to convert to unsigned 32-bit integer\n return ((0xff << 24) | (r << 16) | (g << 8) | b) >>> 0;\n}\n\n/**\n * Convert RGB to hexadecimal color\n */\nexport function rgbToHex(rgb: RGB): HEX {\n const toHex = (n: number): string => {\n const hex = Math.round(Math.max(0, Math.min(255, n))).toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n };\n\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;\n}\n\n/**\n * Convert RGB to HSL color space\n */\nexport function rgbToHsl(rgb: RGB): HSL {\n const r = rgb.r / 255;\n const g = rgb.g / 255;\n const b = rgb.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const diff = max - min;\n\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (diff !== 0) {\n s = l > 0.5 ? diff / (2 - max - min) : diff / (max + min);\n\n switch (max) {\n case b:\n h = ((r - g) / diff + 4) / 6;\n break;\n case g:\n h = ((b - r) / diff + 2) / 6;\n break;\n case r:\n h = ((g - b) / diff + (g < b ? 6 : 0)) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n l: Math.round(l * 100),\n s: Math.round(s * 100),\n };\n}\n\n/**\n * Convert RGB to HSV color space\n */\nexport function rgbToHsv(rgb: RGB): HSV {\n const r = rgb.r / 255;\n const g = rgb.g / 255;\n const b = rgb.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const diff = max - min;\n\n let h = 0;\n const s = max === 0 ? 0 : diff / max;\n const v = max;\n\n if (diff !== 0) {\n switch (max) {\n case b:\n h = ((r - g) / diff + 4) / 6;\n break;\n case g:\n h = ((b - r) / diff + 2) / 6;\n break;\n case r:\n h = ((g - b) / diff + (g < b ? 6 : 0)) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n v: Math.round(v * 100),\n };\n}\n\n/**\n * Convert RGB to LAB color space\n */\nexport function rgbToLab(rgb: RGB): LAB {\n return xyzToLab(rgbToXyz(rgb));\n}\n\n/**\n * Convert RGB to XYZ color space\n * Using sRGB working space and D65 illuminant\n */\nexport function rgbToXyz(rgb: RGB): XYZ {\n let r = rgb.r / 255;\n let g = rgb.g / 255;\n let b = rgb.b / 255;\n\n // Apply gamma correction\n r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n // Multiply by 100 to get standard XYZ values\n r *= 100;\n g *= 100;\n b *= 100;\n\n // Apply transformation matrix (sRGB to XYZ)\n return {\n x: r * 0.4124564 + g * 0.3575761 + b * 0.1804375,\n y: r * 0.2126729 + g * 0.7151522 + b * 0.072175,\n z: r * 0.0193339 + g * 0.119192 + b * 0.9503041,\n };\n}\n\n/**\n * Convert XYZ to LAB color space\n * Using D65 illuminant\n */\nexport function xyzToLab(xyz: XYZ): LAB {\n const { D65, EPSILON, KAPPA } = ColorConstants;\n\n // Normalize by reference white\n const x = xyz.x / D65.X;\n const y = xyz.y / D65.Y;\n const z = xyz.z / D65.Z;\n\n // Apply transformation\n const fx = x > EPSILON ? Math.cbrt(x) : (KAPPA * x + 16) / 116;\n const fy = y > EPSILON ? Math.cbrt(y) : (KAPPA * y + 16) / 116;\n const fz = z > EPSILON ? Math.cbrt(z) : (KAPPA * z + 16) / 116;\n\n return {\n a: 500 * (fx - fy),\n b: 200 * (fy - fz),\n l: 116 * fy - 16,\n };\n}\n\n/**\n * Convert XYZ to RGB color space\n */\nexport function xyzToRgb(xyz: XYZ): RGB {\n // Normalize by 100\n const x = xyz.x / 100;\n const y = xyz.y / 100;\n const z = xyz.z / 100;\n\n // Apply inverse transformation matrix (XYZ to sRGB)\n let r = x * 3.2404542 + y * -1.5371385 + z * -0.4985314;\n let g = x * -0.969266 + y * 1.8760108 + z * 0.041556;\n let b = x * 0.0556434 + y * -0.2040259 + z * 1.0572252;\n\n // Apply inverse gamma correction\n r = r > 0.0031308 ? 1.055 * Math.pow(r, 1 / 2.4) - 0.055 : 12.92 * r;\n g = g > 0.0031308 ? 1.055 * Math.pow(g, 1 / 2.4) - 0.055 : 12.92 * g;\n b = b > 0.0031308 ? 1.055 * Math.pow(b, 1 / 2.4) - 0.055 : 12.92 * b;\n\n return {\n b: Math.round(Math.max(0, Math.min(255, b * 255))),\n g: Math.round(Math.max(0, Math.min(255, g * 255))),\n r: Math.round(Math.max(0, Math.min(255, r * 255))),\n };\n}\n","/**\n * HCT Solver - Converts between HCT and RGB color spaces\n * Based on Material Color Utilities algorithms\n */\n\nimport type { RGB } from \"../types.js\";\nimport type { HCT } from \"./types.js\";\n\nimport { labToXyz, rgbToXyz, xyzToLab, xyzToRgb } from \"../conversions.js\";\n\n/**\n * Create an HCT color from components\n */\nexport function hct(hue: number, chroma: number, tone: number): HCT {\n return {\n c: Math.max(0, chroma),\n h: sanitizeDegrees(hue),\n t: Math.max(0, Math.min(100, tone)),\n };\n}\n\n/**\n * Convert HCT to RGB using iterative solving\n * This is a simplified version of Material's HCT solver\n */\nexport function hctToRgb(hct: HCT): RGB {\n const hue = sanitizeDegrees(hct.h);\n const chroma = Math.max(0, hct.c);\n const tone = Math.max(0, Math.min(100, hct.t));\n\n // Special cases\n if (chroma < 0.0001 || tone < 0.5 || tone > 99.5) {\n const gray = (tone / 100) * 255;\n return { b: gray, g: gray, r: gray };\n }\n\n // Convert tone to L*\n const lstar = tone;\n\n // Use iterative approach to find the right chroma\n let bestRgb: null | RGB = null;\n\n // Binary search for achievable chroma\n let low = 0;\n let high = chroma;\n const epsilon = 0.01;\n\n while (high - low > epsilon) {\n const mid = (low + high) / 2;\n\n // Convert to LAB using approximate chroma\n const a = mid * Math.cos((hue * Math.PI) / 180);\n const b = mid * Math.sin((hue * Math.PI) / 180);\n\n // Convert LAB to XYZ to RGB\n const xyz = labToXyz({ a, b, l: lstar });\n const rgb = xyzToRgb(xyz);\n\n // Check if RGB is in gamut\n if (isInGamut(rgb)) {\n bestRgb = rgb;\n low = mid;\n } else {\n high = mid;\n }\n }\n\n // If we found a valid RGB, use it\n if (bestRgb) {\n return clampRgb(bestRgb);\n }\n\n // Fallback: reduce chroma until in gamut\n for (let c = chroma; c >= 0; c -= 1) {\n const a = c * Math.cos((hue * Math.PI) / 180);\n const b = c * Math.sin((hue * Math.PI) / 180);\n\n const xyz = labToXyz({ a, b, l: lstar });\n const rgb = xyzToRgb(xyz);\n\n if (isInGamut(rgb)) {\n return clampRgb(rgb);\n }\n }\n\n // Final fallback: gray\n const gray = (tone / 100) * 255;\n return { b: gray, g: gray, r: gray };\n}\n\n/**\n * Get maximum chroma for a given hue and tone\n * This is an approximation - actual max varies\n */\nexport function maxChroma(hue: number, tone: number): number {\n // Edge cases\n if (tone <= 0 || tone >= 100) return 0;\n\n // Approximate maximum chroma\n // This varies significantly based on hue and tone\n // Red/magenta hues can achieve higher chroma\n const hueCycle = (hue % 360) / 360;\n const redBoost = Math.sin(hueCycle * Math.PI * 2) * 0.2 + 1;\n\n // Chroma peaks around middle tones\n const toneFactor = Math.sin((tone / 100) * Math.PI);\n\n return toneFactor * 120 * redBoost;\n}\n\n/**\n * Convert RGB to HCT\n */\nexport function rgbToHct(rgb: RGB): HCT {\n // Convert RGB to LAB\n const xyz = rgbToXyz(rgb);\n const lab = xyzToLab(xyz);\n\n // Extract tone from L*\n const tone = lab.l;\n\n // Calculate chroma and hue from a* and b*\n const chroma = Math.sqrt(lab.a * lab.a + lab.b * lab.b);\n let hue = (Math.atan2(lab.b, lab.a) * 180) / Math.PI;\n\n // Ensure hue is positive\n if (hue < 0) {\n hue += 360;\n }\n\n return {\n c: chroma,\n h: sanitizeDegrees(hue),\n t: tone,\n };\n}\n\n/**\n * Clamp RGB values to valid range\n */\nfunction clampRgb(rgb: RGB): RGB {\n return {\n b: Math.round(Math.max(0, Math.min(255, rgb.b))),\n g: Math.round(Math.max(0, Math.min(255, rgb.g))),\n r: Math.round(Math.max(0, Math.min(255, rgb.r))),\n };\n}\n\n/**\n * Check if RGB values are in valid gamut\n */\nfunction isInGamut(rgb: RGB): boolean {\n return (\n rgb.r >= 0 &&\n rgb.r <= 255 &&\n rgb.g >= 0 &&\n rgb.g <= 255 &&\n rgb.b >= 0 &&\n rgb.b <= 255\n );\n}\n\n/**\n * Sanitize degrees to be in [0, 360)\n */\nfunction sanitizeDegrees(degrees: number): number {\n return ((degrees % 360) + 360) % 360;\n}\n","/**\n * HCT Class wrapper for Material Color Utilities compatibility\n */\n\nimport { argbToRgb, rgbToArgb } from \"../conversions.js\";\nimport { hctToRgb, rgbToHct } from \"./hct-solver.js\";\n\n/**\n * HCT class compatible with Material Color Utilities\n */\nexport class Hct {\n get chroma(): number {\n return this._chroma;\n }\n /**\n * Set the chroma of this color. Chroma may decrease because chroma has a\n * different maximum for any given hue and tone.\n * @param newChroma 0 <= newChroma < ?\n */\n set chroma(newChroma: number) {\n const rgb = hctToRgb({ c: newChroma, h: this._hue, t: this._tone });\n this._argb = rgbToArgb(rgb);\n const hct = rgbToHct(rgb);\n this._hue = hct.h;\n this._chroma = hct.c;\n this._tone = hct.t;\n }\n get hue(): number {\n return this._hue;\n }\n /**\n * Set the hue of this color. Chroma may decrease because chroma has a\n * different maximum for any given hue and tone.\n * @param newHue 0 <= newHue < 360; invalid values are corrected.\n */\n set hue(newHue: number) {\n const rgb = hctToRgb({ c: this._chroma, h: newHue, t: this._tone });\n this._argb = rgbToArgb(rgb);\n const hct = rgbToHct(rgb);\n this._hue = hct.h;\n this._chroma = hct.c;\n this._tone = hct.t;\n }\n\n get tone(): number {\n return this._tone;\n }\n\n /**\n * Set the tone of this color. Chroma may decrease because chroma has a\n * different maximum for any given hue and tone.\n * @param newTone 0 <= newTone <= 100; invalid values are corrected.\n */\n set tone(newTone: number) {\n const rgb = hctToRgb({ c: this._chroma, h: this._hue, t: newTone });\n this._argb = rgbToArgb(rgb);\n const hct = rgbToHct(rgb);\n this._hue = hct.h;\n this._chroma = hct.c;\n this._tone = hct.t;\n }\n\n private _argb: number;\n\n private _chroma: number;\n\n private _hue: number;\n\n private _tone: number;\n\n private constructor(argb: number) {\n this._argb = argb;\n const rgb = argbToRgb(argb);\n const hct = rgbToHct(rgb);\n this._hue = hct.h;\n this._chroma = hct.c;\n this._tone = hct.t;\n }\n\n /**\n * Create an HCT color from hue, chroma, and tone.\n * @param hue 0 <= hue < 360; invalid values are corrected.\n * @param chroma 0 <= chroma < ?; Chroma may decrease because chroma has a\n * different maximum for any given hue and tone.\n * @param tone 0 <= tone <= 100; invalid values are corrected.\n * @return HCT representation of a color in default viewing conditions.\n */\n static from(hue: number, chroma: number, tone: number): Hct {\n const rgb = hctToRgb({ c: chroma, h: hue, t: tone });\n const argb = rgbToArgb(rgb);\n return new Hct(argb);\n }\n\n /**\n * Create an HCT color from a color.\n * @param argb ARGB representation of a color.\n * @return HCT representation of a color in default viewing conditions\n */\n static fromInt(argb: number): Hct {\n return new Hct(argb);\n }\n\n /**\n * @return ARGB representation of an HCT color.\n */\n toInt(): number {\n return this._argb;\n }\n}\n","import { Hct } from \"../hct/hct-class.js\";\n\n/**\n * Check and/or fix universally disliked colors.\n *\n * Color science studies of color preference indicate universal distaste for\n * dark yellow-greens, and also show this is correlated to distaste for\n * biological waste and rotting food.\n *\n * See Palmer and Schloss, 2010 or Schloss and Palmer's Chapter 21 in Handbook\n * of Color Psychology (2015).\n */\nexport class DislikeAnalyzer {\n /**\n * Analyze a batch of colors and return statistics\n * @param colors Array of HCT colors\n * @return Statistics about disliked colors\n */\n static analyzeBatch(colors: Hct[]): {\n disliked: number;\n dislikedIndices: number[];\n percentage: number;\n total: number;\n } {\n const dislikedIndices: number[] = [];\n\n colors.forEach((color, index) => {\n if (DislikeAnalyzer.isDisliked(color)) {\n dislikedIndices.push(index);\n }\n });\n\n return {\n disliked: dislikedIndices.length,\n dislikedIndices,\n percentage: (dislikedIndices.length / colors.length) * 100,\n total: colors.length,\n };\n }\n\n /**\n * Fix all disliked colors in a batch\n * @param colors Array of HCT colors\n * @return Array with disliked colors fixed\n */\n static fixBatch(colors: Hct[]): Hct[] {\n return colors.map((color) => DislikeAnalyzer.fixIfDisliked(color));\n }\n\n /**\n * If a color is disliked, lighten it to make it likable.\n *\n * @param hct A color to be judged.\n * @return A new color if the original color is disliked, or the original\n * color if it is acceptable.\n */\n static fixIfDisliked(hct: Hct): Hct {\n if (DislikeAnalyzer.isDisliked(hct)) {\n return Hct.from(hct.hue, hct.chroma, 70.0);\n }\n\n return hct;\n }\n\n /**\n * Fix a hex color if it's disliked\n * @param hex Hex color string\n * @return Fixed hex color or original if not disliked\n */\n static fixIfDislikedHex(hex: string): string {\n const argb = parseInt(hex.replace(\"#\", \"\"), 16) | 0xff000000;\n const hct = Hct.fromInt(argb);\n const fixed = DislikeAnalyzer.fixIfDisliked(hct);\n\n if (fixed === hct) {\n return hex;\n }\n\n const fixedArgb = fixed.toInt();\n const r = (fixedArgb >> 16) & 0xff;\n const g = (fixedArgb >> 8) & 0xff;\n const b = fixedArgb & 0xff;\n\n return \"#\" + [r, g, b].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n /**\n * Returns true if a color is disliked.\n *\n * @param hct A color to be judged.\n * @return Whether the color is disliked.\n *\n * Disliked is defined as a dark yellow-green that is not neutral.\n * Specifically: hue 90-111°, chroma > 16, tone < 65\n */\n static isDisliked(hct: Hct): boolean {\n const huePasses =\n Math.round(hct.hue) >= 90.0 && Math.round(hct.hue) <= 111.0;\n const chromaPasses = Math.round(hct.chroma) > 16.0;\n const tonePasses = Math.round(hct.tone) < 65.0;\n\n return huePasses && chromaPasses && tonePasses;\n }\n\n /**\n * Check if a color is in the \"bile zone\" - universally disliked colors\n * @param hex Hex color string\n * @return Whether the color is disliked\n */\n static isDislikedHex(hex: string): boolean {\n const hct = Hct.fromInt(parseInt(hex.replace(\"#\", \"\"), 16) | 0xff000000);\n return DislikeAnalyzer.isDisliked(hct);\n }\n}\n","/**\n * Color Harmonization\n * Algorithms to blend and harmonize colors based on Material Design principles\n */\n\nimport type { RGB } from \"../types.js\";\n\nimport { hct, hctToRgb, rgbToHct } from \"./hct-solver.js\";\n\n/**\n * Temperature-based color adjustment\n * Warmer (positive) or cooler (negative) adjustment\n */\nexport function adjustTemperature(color: RGB, amount: number): RGB {\n const hctColor = rgbToHct(color);\n\n // Warm colors: red-orange-yellow (0-60, 300-360)\n // Cool colors: green-blue-purple (60-300)\n const isWarm = hctColor.h <= 60 || hctColor.h >= 300;\n\n let newHue: number;\n if (amount > 0) {\n // Make warmer - shift toward orange (30 degrees)\n newHue = isWarm\n ? circularInterpolate(hctColor.h, 30, Math.min(amount, 1))\n : circularInterpolate(hctColor.h, 30, Math.min(amount * 2, 1));\n } else {\n // Make cooler - shift toward blue (210 degrees)\n newHue = !isWarm\n ? circularInterpolate(hctColor.h, 210, Math.min(-amount, 1))\n : circularInterpolate(hctColor.h, 210, Math.min(-amount * 2, 1));\n }\n\n return hctToRgb(hct(newHue, hctColor.c, hctColor.t));\n}\n\n/**\n * Find analogous colors (adjacent on color wheel)\n */\nexport function analogous(\n color: RGB,\n angle: number = 30,\n count: number = 2,\n): RGB[] {\n const hctColor = rgbToHct(color);\n const colors: RGB[] = [];\n\n for (let i = 1; i <= count; i++) {\n // Add colors on both sides\n colors.push(\n hctToRgb(\n hct(\n sanitizeDegreesDouble(hctColor.h + angle * i),\n hctColor.c,\n hctColor.t,\n ),\n ),\n );\n\n colors.push(\n hctToRgb(\n hct(\n sanitizeDegreesDouble(hctColor.h - angle * i),\n hctColor.c,\n hctColor.t,\n ),\n ),\n );\n }\n\n return colors;\n}\n\n/**\n * Blend two colors in HCT space\n * More perceptually uniform than RGB blending\n */\nexport function blend(from: RGB, to: RGB, amount: number): RGB {\n const fromHct = rgbToHct(from);\n const toHct = rgbToHct(to);\n\n // Interpolate in HCT space\n const h = circularInterpolate(fromHct.h, toHct.h, amount);\n const c = fromHct.c + (toHct.c - fromHct.c) * amount;\n const t = fromHct.t + (toHct.t - fromHct.t) * amount;\n\n return hctToRgb(hct(h, c, t));\n}\n\n/**\n * Create a double complementary (rectangle) scheme\n */\nexport function doubleComplementary(\n color1: RGB,\n color2: RGB,\n): [RGB, RGB, RGB, RGB] {\n const hct1 = rgbToHct(color1);\n const hct2 = rgbToHct(color2);\n\n return [\n color1,\n color2,\n hctToRgb(hct((hct1.h + 180) % 360, hct1.c, hct1.t)),\n hctToRgb(hct((hct2.h + 180) % 360, hct2.c, hct2.t)),\n ];\n}\n\n/**\n * Create a gradient between two colors\n */\nexport function gradient(from: RGB, to: RGB, steps: number): RGB[] {\n const colors: RGB[] = [];\n\n for (let i = 0; i < steps; i++) {\n const amount = i / (steps - 1);\n colors.push(blend(from, to, amount));\n }\n\n return colors;\n}\n\n/**\n * Harmonize a color with a target, making them work better together\n * Based on Material's blend algorithm\n */\nexport function harmonize(design: RGB, source: RGB, factor: number = 0.5): RGB {\n const fromHct = rgbToHct(design);\n const toHct = rgbToHct(source);\n\n const diffDegrees = differenceDegrees(fromHct.h, toHct.h);\n const rotationDegrees = Math.min(diffDegrees * factor, 15);\n const outputHue = sanitizeDegreesDouble(\n fromHct.h + rotationDegrees * rotationDirection(fromHct.h, toHct.h),\n );\n\n return hctToRgb(hct(outputHue, fromHct.c, fromHct.t));\n}\n\n/**\n * Find split-complementary colors\n */\nexport function splitComplementary(\n color: RGB,\n angle: number = 30,\n): [RGB, RGB, RGB] {\n const hctColor = rgbToHct(color);\n const complement = (hctColor.h + 180) % 360;\n\n return [\n color,\n hctToRgb(\n hct(sanitizeDegreesDouble(complement - angle), hctColor.c, hctColor.t),\n ),\n hctToRgb(\n hct(sanitizeDegreesDouble(complement + angle), hctColor.c, hctColor.t),\n ),\n ];\n}\n\n/**\n * Find tetradic (square) colors - four colors evenly spaced\n */\nexport function tetradic(color: RGB): [RGB, RGB, RGB, RGB] {\n const hctColor = rgbToHct(color);\n\n return [\n color,\n hctToRgb(hct((hctColor.h + 90) % 360, hctColor.c, hctColor.t)),\n hctToRgb(hct((hctColor.h + 180) % 360, hctColor.c, hctColor.t)),\n hctToRgb(hct((hctColor.h + 270) % 360, hctColor.c, hctColor.t)),\n ];\n}\n\n// Helper functions\n\nfunction circularInterpolate(from: number, to: number, amount: number): number {\n const difference = to - from;\n const distance = Math.abs(difference);\n\n if (distance > 180) {\n // Take the shorter path around the circle\n if (difference > 0) {\n from += 360;\n } else {\n to += 360;\n }\n }\n\n return sanitizeDegreesDouble(from + (to - from) * amount);\n}\n\nfunction differenceDegrees(a: number, b: number): number {\n return Math.abs(((a - b + 180) % 360) - 180);\n}\n\nfunction rotationDirection(from: number, to: number): number {\n const difference = to - from;\n const normalized = ((difference + 180) % 360) - 180;\n return normalized >= 0 ? 1 : -1;\n}\n\nfunction sanitizeDegreesDouble(degrees: number): number {\n return ((degrees % 360) + 360) % 360;\n}\n","/**\n * Tonal Palette Generator\n * Creates Material Design 3 tonal palettes from HCT colors\n */\n\nimport type { RGB } from \"../types.js\";\nimport type { HCT } from \"./types.js\";\n\nimport { hct, hctToRgb, rgbToHct } from \"./hct-solver.js\";\n\n/**\n * Standard Material 3 tone values\n */\nexport const MATERIAL_TONES = [\n 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99, 100,\n] as const;\n\n/**\n * Extended tone values for more granularity\n */\nexport const EXTENDED_TONES = [\n 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 92,\n 94, 96, 98, 99, 100,\n] as const;\n\n/**\n * Material 3 Core Palette\n * Contains all the tonal palettes needed for a complete theme\n */\nexport interface CorePalette {\n /** Error color palette */\n error: TonalPalette;\n /** Neutral color palette (grays) */\n neutral: TonalPalette;\n /** Neutral variant palette (slightly tinted grays) */\n neutralVariant: TonalPalette;\n /** Primary color palette */\n primary: TonalPalette;\n /** Secondary color palette */\n secondary: TonalPalette;\n /** Tertiary color palette */\n tertiary: TonalPalette;\n}\n\n/**\n * A tonal palette - variations of a single color at different tones\n */\nexport class TonalPalette {\n /**\n * Get extended tones for more options\n */\n get extendedTones(): Record<number, RGB> {\n const tones: Record<number, RGB> = {};\n for (const t of EXTENDED_TONES) {\n tones[t] = this.tone(t);\n }\n return tones;\n }\n\n /**\n * Get all Material 3 standard tones\n */\n get materialTones(): Record<number, RGB> {\n const tones: Record<number, RGB> = {};\n for (const t of MATERIAL_TONES) {\n tones[t] = this.tone(t);\n }\n return tones;\n }\n\n private cache = new Map<number, RGB>();\n\n constructor(\n public readonly hue: number,\n public readonly chroma: number,\n ) {}\n\n /**\n * Create a tonal palette from an HCT color\n */\n static fromHct(color: HCT): TonalPalette {\n return new TonalPalette(color.h, color.c);\n }\n\n /**\n * Create a tonal palette from an RGB color\n */\n static fromRgb(rgb: RGB): TonalPalette {\n const hctColor = rgbToHct(rgb);\n return new TonalPalette(hctColor.h, hctColor.c);\n }\n\n /**\n * Get the color at a specific tone\n */\n tone(tone: number): RGB {\n // Check cache first\n if (this.cache.has(tone)) {\n return this.cache.get(tone)!;\n }\n\n // Generate and cache\n const color = hctToRgb(hct(this.hue, this.chroma, tone));\n this.cache.set(tone, color);\n return color;\n }\n}\n\n/**\n * Generate an analogous palette (adjacent hues)\n */\nexport function analogousPalette(\n source: RGB,\n count: number = 5,\n hueShift: number = 30,\n): TonalPalette[] {\n const sourceHct = rgbToHct(source);\n const palettes: TonalPalette[] = [];\n\n const startHue = sourceHct.h - hueShift * Math.floor(count / 2);\n\n for (let i = 0; i < count; i++) {\n const hue = (startHue + i * hueShift + 360) % 360;\n palettes.push(new TonalPalette(hue, sourceHct.c));\n }\n\n return palettes;\n}\n\n/**\n * Generate a complementary palette\n */\nexport function complementaryPalette(\n source: RGB,\n): [TonalPalette, TonalPalette] {\n const sourceHct = rgbToHct(source);\n\n return [\n new TonalPalette(sourceHct.h, sourceHct.c),\n new TonalPalette((sourceHct.h + 180) % 360, sourceHct.c),\n ];\n}\n\n/**\n * Generate a complete Material 3 core palette from a source color\n */\nexport function corePaletteFromRgb(source: RGB): CorePalette {\n const sourceHct = rgbToHct(source);\n\n // Primary uses the source color\n const primary = new TonalPalette(sourceHct.h, Math.max(48, sourceHct.c));\n\n // Secondary is shifted in hue and reduced chroma\n const secondary = new TonalPalette(\n sourceHct.h,\n Math.max(16, sourceHct.c / 3),\n );\n\n // Tertiary shifts hue by 60 degrees\n const tertiary = new TonalPalette(\n (sourceHct.h + 60) % 360,\n Math.max(24, sourceHct.c / 2),\n );\n\n // Error is always red-ish\n const error = new TonalPalette(25, 84);\n\n // Neutral has very low chroma\n const neutral = new TonalPalette(sourceHct.h, Math.min(4, sourceHct.c / 12));\n\n // Neutral variant has slightly more chroma\n const neutralVariant = new TonalPalette(\n sourceHct.h,\n Math.min(8, sourceHct.c / 6),\n );\n\n return {\n error,\n neutral,\n neutralVariant,\n primary,\n secondary,\n tertiary,\n };\n}\n\n/**\n * Generate a monochromatic palette (single hue, varying tones)\n */\nexport function monochromaticPalette(\n source: RGB,\n tones: readonly number[] = MATERIAL_TONES,\n): RGB[] {\n const palette = TonalPalette.fromRgb(source);\n return tones.map((t) => palette.tone(t));\n}\n\n/**\n * Generate a triadic palette (three colors evenly spaced)\n */\nexport function triadicPalette(\n source: RGB,\n): [TonalPalette, TonalPalette, TonalPalette] {\n const sourceHct = rgbToHct(source);\n\n return [\n new TonalPalette(sourceHct.h, sourceHct.c),\n new TonalPalette((sourceHct.h + 120) % 360, sourceHct.c),\n new TonalPalette((sourceHct.h + 240) % 360, sourceHct.c),\n ];\n}\n","/**\n * HCT (Hue, Chroma, Tone) color space types\n * Based on Material Color Utilities\n */\n\n/**\n * CAM16 color appearance model\n * Predicts color appearance under different viewing conditions\n */\nexport interface CAM16 {\n /** Chroma composition */\n astar: number;\n /** Brightness composition */\n bstar: number;\n /** Chroma */\n chroma: number;\n /** Hue angle */\n hue: number;\n /** Lightness */\n j: number;\n /** Hue composition */\n jstar: number;\n /** Colorfulness */\n m: number;\n /** Brightness */\n q: number;\n /** Saturation */\n s: number;\n}\n\n/**\n * HCT color representation\n * A perceptually accurate color space that combines:\n * - Hue from CAM16\n * - Chroma from CAM16\n * - Tone (Lightness) from L* (LAB)\n */\nexport interface HCT {\n /** Chroma (colorfulness) [0, ~150] - actual max varies by hue and tone */\n c: number;\n /** Hue angle in degrees [0, 360) */\n h: number;\n /** Tone (lightness) [0, 100] */\n t: number;\n}\n\n/**\n * Viewing conditions for CAM16\n * Describes the environment in which colors are viewed\n */\nexport interface ViewingConditions {\n /** Background luminance ratio */\n aw: number;\n /** Base exponential nonlinearity */\n c: number;\n /** Degree of adaptation */\n fl: number;\n /** Luminance level adaptation factor */\n flRoot: number;\n /** Adapting luminance */\n n: number;\n /** Luminance level adaptation factor */\n nbb: number;\n /** Chromatic induction factor */\n nc: number;\n /** Chromatic induction factor */\n ncb: number;\n /** Achromatic response for white */\n rgbD: [number, number, number];\n /** Surround factor */\n z: number;\n}\n\n/**\n * Standard viewing conditions\n */\nexport const STANDARD_CONDITIONS: ViewingConditions = {\n aw: 29.98,\n c: 0.69,\n fl: 0.388,\n flRoot: 0.789,\n n: 0.184,\n nbb: 1.017,\n nc: 1.0,\n ncb: 1.017,\n rgbD: [1.021, 0.986, 0.934],\n z: 1.909,\n};\n","/**\n * Color distance metrics for calculating perceptual differences between colors\n */\n\nimport type { ColorDistanceOptions, LAB, RGB } from \"./types.js\";\n\nimport { rgbToLab } from \"./conversions.js\";\n\n/**\n * Determine if two colors are perceptually similar\n * Uses Delta E 2000 with a threshold\n */\nexport function areColorsSimilar(\n color1: RGB,\n color2: RGB,\n threshold: number = 2.3, // JND (Just Noticeable Difference)\n): boolean {\n const distance = colorDistance(color1, color2, { metric: \"deltaE2000\" });\n return distance <= threshold;\n}\n\n/**\n * Calculate color distance between two RGB colors using specified metric\n */\nexport function colorDistance(\n color1: RGB,\n color2: RGB,\n options?: ColorDistanceOptions,\n): number {\n const metric = options?.metric ?? \"deltaE2000\";\n\n switch (metric) {\n case \"deltaE76\": {\n const lab1 = rgbToLab(color1);\n const lab2 = rgbToLab(color2);\n return deltaE76(lab1, lab2);\n }\n\n case \"deltaE94\": {\n const lab1 = rgbToLab(color1);\n const lab2 = rgbToLab(color2);\n return deltaE94(lab1, lab2, options?.deltaE94);\n }\n\n case \"euclidean\":\n return euclideanDistance(color1, color2);\n\n case \"weighted\":\n return weightedRgbDistance(color1, color2, options?.weights);\n\n case \"deltaE2000\":\n default: {\n const lab1 = rgbToLab(color1);\n const lab2 = rgbToLab(color2);\n return deltaE2000(lab1, lab2);\n }\n }\n}\n\n/**\n * Calculate Delta E CIE2000 (ΔE*00)\n * Most accurate perceptual color difference formula\n */\nexport function deltaE2000(lab1: LAB, lab2: LAB): number {\n const deg2rad = (deg: number) => deg * (Math.PI / 180);\n const rad2deg = (rad: number) => rad * (180 / Math.PI);\n\n // Weight factors\n const kL = 1;\n const kC = 1;\n const kH = 1;\n\n // Calculate C' and h'\n const C1 = Math.sqrt(lab1.a * lab1.a + lab1.b * lab1.b);\n const C2 = Math.sqrt(lab2.a * lab2.a + lab2.b * lab2.b);\n const Cbar = (C1 + C2) / 2;\n\n const G =\n 0.5 *\n (1 - Math.sqrt(Math.pow(Cbar, 7) / (Math.pow(Cbar, 7) + Math.pow(25, 7))));\n\n const a1p = lab1.a * (1 + G);\n const a2p = lab2.a * (1 + G);\n\n const C1p = Math.sqrt(a1p * a1p + lab1.b * lab1.b);\n const C2p = Math.sqrt(a2p * a2p + lab2.b * lab2.b);\n\n let h1p = Math.atan2(lab1.b, a1p);\n let h2p = Math.atan2(lab2.b, a2p);\n\n if (h1p < 0) h1p += 2 * Math.PI;\n if (h2p < 0) h2p += 2 * Math.PI;\n\n h1p = rad2deg(h1p);\n h2p = rad2deg(h2p);\n\n // Calculate deltas\n const dLp = lab2.l - lab1.l;\n const dCp = C2p - C1p;\n\n let dhp = h2p - h1p;\n if (dhp > 180) dhp -= 360;\n if (dhp < -180) dhp += 360;\n\n const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin(deg2rad(dhp) / 2);\n\n // Calculate averages\n const Lbar = (lab1.l + lab2.l) / 2;\n const Cpbar = (C1p + C2p) / 2;\n\n let hpbar = (h1p + h2p) / 2;\n if (Math.abs(h1p - h2p) > 180) {\n if (h1p + h2p < 360) {\n hpbar += 180;\n } else {\n hpbar -= 180;\n }\n }\n\n // Calculate T\n const T =\n 1 -\n 0.17 * Math.cos(deg2rad(hpbar - 30)) +\n 0.24 * Math.cos(deg2rad(2 * hpbar)) +\n 0.32 * Math.cos(deg2rad(3 * hpbar + 6)) -\n 0.2 * Math.cos(deg2rad(4 * hpbar - 63));\n\n // Calculate rotation term\n const dTheta = 30 * Math.exp(-Math.pow((hpbar - 275) / 25, 2));\n const RC =\n 2 * Math.sqrt(Math.pow(Cpbar, 7) / (Math.pow(Cpbar, 7) + Math.pow(25, 7)));\n const RT = -RC * Math.sin(2 * deg2rad(dTheta));\n\n // Calculate weighting functions\n const SL =\n 1 +\n (0.015 * Math.pow(Lbar - 50, 2)) / Math.sqrt(20 + Math.pow(Lbar - 50, 2));\n const SC = 1 + 0.045 * Cpbar;\n const SH = 1 + 0.015 * Cpbar * T;\n\n // Calculate final Delta E 2000\n const dLpKlSl = dLp / (kL * SL);\n const dCpKcSc = dCp / (kC * SC);\n const dHpKhSh = dHp / (kH * SH);\n\n return Math.sqrt(\n dLpKlSl * dLpKlSl +\n dCpKcSc * dCpKcSc +\n dHpKhSh * dHpKhSh +\n RT * dCpKcSc * dHpKhSh,\n );\n}\n\n/**\n * Calculate Delta E CIE76 (ΔE*ab)\n * Original CIE color difference formula\n */\nexport function deltaE76(lab1: LAB, lab2: LAB): number {\n const dL = lab1.l - lab2.l;\n const da = lab1.a - lab2.a;\n const db = lab1.b - lab2.b;\n\n return Math.sqrt(dL * dL + da * da + db * db);\n}\n\n/**\n * Calculate Delta E CIE94 (ΔE*94)\n * Improved perceptual uniformity over CIE76\n */\nexport function deltaE94(\n lab1: LAB,\n lab2: LAB,\n options?: { kC?: number; kH?: number; kL?: number },\n): number {\n // Default values for graphic arts\n const kL = options?.kL ?? 1;\n const kC = options?.kC ?? 1;\n const kH = options?.kH ?? 1;\n\n const dL = lab1.l - lab2.l;\n const da = lab1.a - lab2.a;\n const db = lab1.b - lab2.b;\n\n const C1 = Math.sqrt(lab1.a * lab1.a + lab1.b * lab1.b);\n const C2 = Math.sqrt(lab2.a * lab2.a + lab2.b * lab2.b);\n const dC = C1 - C2;\n\n const dH2 = da * da + db * db - dC * dC;\n const dH = dH2 > 0 ? Math.sqrt(dH2) : 0;\n\n const SL = 1;\n const SC = 1 + 0.045 * C1;\n const SH = 1 + 0.015 * C1;\n\n const dLKlSl = dL / (kL * SL);\n const dCKcSc = dC / (kC * SC);\n const dHKhSh = dH / (kH * SH);\n\n return Math.sqrt(dLKlSl * dLKlSl + dCKcSc * dCKcSc + dHKhSh * dHKhSh);\n}\n\n/**\n * Calculate Euclidean distance between two RGB colors\n * Simple but not perceptually uniform\n */\nexport function euclideanDistance(color1: RGB, color2: RGB): number {\n const dr = color1.r - color2.r;\n const dg = color1.g - color2.g;\n const db = color1.b - color2.b;\n\n return Math.sqrt(dr * dr + dg * dg + db * db);\n}\n\n/**\n * Find the most different color from a set of colors\n */\nexport function findMostDifferentColor(\n baseColor: RGB,\n colors: RGB[],\n options?: ColorDistanceOptions,\n): null | RGB {\n if (colors.length === 0) return null;\n\n let maxDistance = -Infinity;\n let mostDifferent = colors[0];\n\n for (const color of colors) {\n const distance = colorDistance(baseColor, color, options);\n if (distance > maxDistance) {\n maxDistance = distance;\n mostDifferent = color;\n }\n }\n\n return mostDifferent;\n}\n\n/**\n * Find the most similar color from a set of colors\n */\nexport function findMostSimilarColor(\n baseColor: RGB,\n colors: RGB[],\n options?: ColorDistanceOptions,\n): null | RGB {\n if (colors.length === 0) return null;\n\n let minDistance = Infinity;\n let mostSimilar = colors[0];\n\n for (const color of colors) {\n const distance = colorDistance(baseColor, color, options);\n if (distance < minDistance) {\n minDistance = distance;\n mostSimilar = color;\n }\n }\n\n return mostSimilar;\n}\n\n/**\n * Calculate weighted RGB distance\n * Better approximation of perceptual difference than simple Euclidean\n */\nexport function weightedRgbDistance(\n color1: RGB,\n color2: RGB,\n weights?: { b?: number; g?: number; r?: number },\n): number {\n // Default weights based on human eye sensitivity\n const wr = weights?.r ?? 0.3;\n const wg = weights?.g ?? 0.59;\n const wb = weights?.b ?? 0.11;\n\n const dr = (color1.r - color2.r) * wr;\n const dg = (color1.g - color2.g) * wg;\n const db = (color1.b - color2.b) * wb;\n\n return Math.sqrt(dr * dr + dg * dg + db * db);\n}\n","/**\n * Utility functions for color manipulation and validation\n */\n\nimport type { HSL, HSV, RGB } from \"./types.js\";\n\nimport { parseColor, rgbToHex, rgbToHsl, rgbToHsv } from \"./conversions.js\";\n\n/**\n * Clamp HSL values to valid range\n */\nexport function clampHsl(hsl: HSL): HSL {\n return {\n h: clamp(hsl.h, 0, 360),\n l: clamp(hsl.l, 0, 100),\n s: clamp(hsl.s, 0, 100),\n };\n}\n\n/**\n * Clamp HSV values to valid range\n */\nexport function clampHsv(hsv: HSV): HSV {\n return {\n h: clamp(hsv.h, 0, 360),\n s: clamp(hsv.s, 0, 100),\n v: clamp(hsv.v, 0, 100),\n };\n}\n\n/**\n * Clamp RGB values to valid range\n */\nexport function clampRgb(rgb: RGB): RGB {\n return {\n b: clamp(rgb.b, 0, 255),\n g: clamp(rgb.g, 0, 255),\n r: clamp(rgb.r, 0, 255),\n };\n}\n\n/**\n * Darken a color by a percentage\n * @param rgb The color to darken\n * @param amount Amount to darken (0-100)\n */\nexport function darken(rgb: RGB, amount: number): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.l = clamp(hsl.l - amount, 0, 100);\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Desaturate a color by a percentage\n * @param rgb The color to desaturate\n * @param amount Amount to desaturate (0-100)\n */\nexport function desaturate(rgb: RGB, amount: number): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.s = clamp(hsl.s - amount, 0, 100);\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Format color to various string representations\n */\nexport function formatColor(\n rgb: RGB,\n format: \"hex\" | \"hsl\" | \"hsv\" | \"rgb\" = \"hex\",\n): string {\n switch (format) {\n case \"hex\":\n return rgbToHex(rgb);\n case \"hsl\":\n return formatHsl(rgbToHsl(rgb));\n case \"hsv\": {\n const hsv = rgbToHsv(rgb);\n return `hsv(${hsv.h}, ${hsv.s}%, ${hsv.v}%)`;\n }\n case \"rgb\":\n return formatRgb(rgb);\n default:\n return rgbToHex(rgb);\n }\n}\n\n/**\n * Format HSL color to string\n */\nexport function formatHsl(hsl: HSL, alpha?: number): string {\n if (alpha !== undefined) {\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${alpha})`;\n }\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n}\n\n/**\n * Format RGB color to string\n */\nexport function formatRgb(rgb: RGB, alpha?: number): string {\n if (alpha !== undefined) {\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n}\n\n/**\n * Get complementary color (opposite on color wheel)\n */\nexport function getComplementary(rgb: RGB): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.h = (hsl.h + 180) % 360;\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Calculate contrast ratio between two colors\n * Based on WCAG 2.0 formula\n */\nexport function getContrastRatio(color1: RGB, color2: RGB): number {\n const lum1 = getLuminance(color1);\n const lum2 = getLuminance(color2);\n\n const lighter = Math.max(lum1, lum2);\n const darker = Math.min(lum1, lum2);\n\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Calculate relative luminance of an RGB color\n * Based on WCAG 2.0 formula\n */\nexport function getLuminance(rgb: RGB): number {\n const rsRGB = rgb.r / 255;\n const gsRGB = rgb.g / 255;\n const bsRGB = rgb.b / 255;\n\n const r =\n rsRGB <= 0.03928 ? rsRGB / 12.92 : Math.pow((rsRGB + 0.055) / 1.055, 2.4);\n const g =\n gsRGB <= 0.03928 ? gsRGB / 12.92 : Math.pow((gsRGB + 0.055) / 1.055, 2.4);\n const b =\n bsRGB <= 0.03928 ? bsRGB / 12.92 : Math.pow((bsRGB + 0.055) / 1.055, 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Invert a color\n */\nexport function invertColor(rgb: RGB): RGB {\n return {\n b: 255 - rgb.b,\n g: 255 - rgb.g,\n r: 255 - rgb.r,\n };\n}\n\n/**\n * Check if a color is considered \"dark\"\n * Based on luminance threshold\n */\nexport function isDark(rgb: RGB, threshold: number = 0.5): boolean {\n return getLuminance(rgb) < threshold;\n}\n\n/**\n * Check if a color is considered \"light\"\n * Based on luminance threshold\n */\nexport function isLight(rgb: RGB, threshold: number = 0.5): boolean {\n return getLuminance(rgb) >= threshold;\n}\n\n/**\n * Validate hexadecimal color string\n */\nexport function isValidHex(hex: string): boolean {\n const cleanHex = hex.replace(\"#\", \"\");\n return /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(cleanHex);\n}\n\n/**\n * Validate HSL color values\n */\nexport function isValidHsl(hsl: HSL): boolean {\n return (\n hsl.h >= 0 &&\n hsl.h <= 360 &&\n hsl.s >= 0 &&\n hsl.s <= 100 &&\n hsl.l >= 0 &&\n hsl.l <= 100\n );\n}\n\n/**\n * Validate HSV color values\n */\nexport function isValidHsv(hsv: HSV): boolean {\n return (\n hsv.h >= 0 &&\n hsv.h <= 360 &&\n hsv.s >= 0 &&\n hsv.s <= 100 &&\n hsv.v >= 0 &&\n hsv.v <= 100\n );\n}\n\n/**\n * Validate RGB color values\n */\nexport function isValidRgb(rgb: RGB): boolean {\n return (\n rgb.r >= 0 &&\n rgb.r <= 255 &&\n rgb.g >= 0 &&\n rgb.g <= 255 &&\n rgb.b >= 0 &&\n rgb.b <= 255\n );\n}\n\n/**\n * Lighten a color by a percentage\n * @param rgb The color to lighten\n * @param amount Amount to lighten (0-100)\n */\nexport function lighten(rgb: RGB, amount: number): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.l = clamp(hsl.l + amount, 0, 100);\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Check if contrast meets WCAG AA standard\n * Normal text: 4.5:1, Large text: 3:1\n */\nexport function meetsContrastAA(\n color1: RGB,\n color2: RGB,\n largeText: boolean = false,\n): boolean {\n const ratio = getContrastRatio(color1, color2);\n return largeText ? ratio >= 3 : ratio >= 4.5;\n}\n\n/**\n * Check if contrast meets WCAG AAA standard\n * Normal text: 7:1, Large text: 4.5:1\n */\nexport function meetsContrastAAA(\n color1: RGB,\n color2: RGB,\n largeText: boolean = false,\n): boolean {\n const ratio = getContrastRatio(color1, color2);\n return largeText ? ratio >= 4.5 : ratio >= 7;\n}\n\n/**\n * Mix two colors together\n * @param color1 First color\n * @param color2 Second color\n * @param weight Weight of the first color (0-1)\n */\nexport function mixColors(color1: RGB, color2: RGB, weight: number = 0.5): RGB {\n const w = clamp(weight, 0, 1);\n const w2 = 1 - w;\n\n return {\n b: Math.round(color1.b * w + color2.b * w2),\n g: Math.round(color1.g * w + color2.g * w2),\n r: Math.round(color1.r * w + color2.r * w2),\n };\n}\n\n/**\n * Generate a random RGB color\n */\nexport function randomColor(): RGB {\n return {\n b: Math.floor(Math.random() * 256),\n g: Math.floor(Math.random() * 256),\n r: Math.floor(Math.random() * 256),\n };\n}\n\n/**\n * Saturate a color by a percentage\n * @param rgb The color to saturate\n * @param amount Amount to saturate (0-100)\n */\nexport function saturate(rgb: RGB, amount: number): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.s = clamp(hsl.s + amount, 0, 100);\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Convert color to grayscale\n */\nexport function toGrayscale(rgb: RGB): RGB {\n const gray = Math.round(0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b);\n return { b: gray, g: gray, r: gray };\n}\n\n/**\n * Clamp a number between min and max values\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n"],"mappings":"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","names":["ColorFormat","p","q","hct","gray","hct","hct","clampRgb"]}
|
|
1
|
+
{"version":3,"sources":["../src/color/types.ts","../src/color/conversions.ts","../src/color/hct/hct-solver.ts","../src/color/hct/hct-class.ts","../src/color/dislike/dislike-analyzer.ts","../src/color/hct/harmonization.ts","../src/color/hct/tonal-palette.ts","../src/color/hct/types.ts","../src/color/metrics.ts","../src/color/utils.ts"],"sourcesContent":["/**\n * Color type definitions for various color spaces\n */\n\n/**\n * Supported color formats for parsing\n */\nexport enum ColorFormat {\n HEX = \"hex\",\n HSL = \"hsl\",\n HSV = \"hsv\",\n LAB = \"lab\",\n RGB = \"rgb\",\n XYZ = \"xyz\",\n}\n\n/**\n * Options for color distance calculations\n */\nexport interface ColorDistanceOptions {\n /**\n * Parameters for Delta E 94\n */\n deltaE94?: {\n kC?: number;\n kH?: number;\n kL?: number;\n };\n\n /**\n * Type of distance metric to use\n */\n metric?: \"deltaE2000\" | \"deltaE76\" | \"deltaE94\" | \"euclidean\" | \"weighted\";\n\n /**\n * Weights for weighted RGB distance\n */\n weights?: {\n b?: number;\n g?: number;\n r?: number;\n };\n}\n\n/**\n * Color input type that can be parsed\n */\nexport type ColorInput = HSL | HSV | LAB | RGB | string | XYZ;\n\n/**\n * HCT (Hue, Chroma, Tone) color representation\n */\nexport interface HCT {\n c: number; // Chroma [0, ~150]\n h: number; // Hue [0, 360)\n t: number; // Tone [0, 100]\n}\n\n/**\n * Hexadecimal color representation\n */\nexport type HEX = string;\n\n/**\n * HSL (Hue, Saturation, Lightness) color representation\n * h: [0, 360] degrees\n * s: [0, 100] percentage\n * l: [0, 100] percentage\n */\nexport interface HSL {\n h: number;\n l: number;\n s: number;\n}\n\n/**\n * HSV (Hue, Saturation, Value) color representation\n * Also known as HSB (Hue, Saturation, Brightness)\n * h: [0, 360] degrees\n * s: [0, 100] percentage\n * v: [0, 100] percentage\n */\nexport interface HSV {\n h: number;\n s: number;\n v: number;\n}\n\n/**\n * LAB color space (CIE L*a*b*)\n * L: [0, 100] lightness\n * a: [-128, 127] green-red axis\n * b: [-128, 127] blue-yellow axis\n */\nexport interface LAB {\n a: number;\n b: number;\n l: number;\n}\n\n/**\n * Color parsing result\n */\nexport interface ParsedColor {\n format: ColorFormat;\n value: HSL | HSV | LAB | RGB | XYZ;\n}\n\n/**\n * RGB color representation\n * Values should be in range [0, 255]\n */\nexport interface RGB {\n b: number;\n g: number;\n r: number;\n}\n\n/**\n * XYZ color space (CIE 1931)\n * Reference white: D65 illuminant\n */\nexport interface XYZ {\n x: number;\n y: number;\n z: number;\n}\n\n/**\n * Constants for color space conversions\n */\nexport const ColorConstants = {\n /**\n * D65 illuminant reference white point\n */\n D65: {\n X: 95.047,\n Y: 100.0,\n Z: 108.883,\n },\n\n /**\n * Epsilon for LAB conversion\n */\n EPSILON: 0.008856,\n\n /**\n * Kappa for LAB conversion\n */\n KAPPA: 903.3,\n} as const;\n","/**\n * Color space conversion functions\n */\n\nimport type { HEX, HSL, HSV, LAB, RGB, XYZ } from \"./types.js\";\n\nimport { ColorConstants } from \"./types.js\";\n\n/**\n * Convert ARGB format to RGB\n */\nexport function argbToRgb(argb: number): RGB {\n const r = (argb >> 16) & 0xff;\n const g = (argb >> 8) & 0xff;\n const b = argb & 0xff;\n return { b, g, r };\n}\n\n/**\n * Convert hexadecimal to RGB color\n */\nexport function hexToRgb(hex: HEX): RGB {\n // Remove # if present\n const cleanHex = hex.replace(\"#\", \"\");\n\n // Handle 3-digit hex\n const fullHex =\n cleanHex.length === 3\n ? cleanHex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : cleanHex;\n\n const num = parseInt(fullHex, 16);\n\n return {\n b: num & 255,\n g: (num >> 8) & 255,\n r: (num >> 16) & 255,\n };\n}\n\n/**\n * Convert HSL to RGB color space\n */\nexport function hslToRgb(hsl: HSL): RGB {\n const h = hsl.h / 360;\n const s = hsl.s / 100;\n const l = hsl.l / 100;\n\n let b: number, g: number, r: number;\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number): 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\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return {\n b: Math.round(b * 255),\n g: Math.round(g * 255),\n r: Math.round(r * 255),\n };\n}\n\n/**\n * Convert HSV to RGB color space\n */\nexport function hsvToRgb(hsv: HSV): RGB {\n const h = hsv.h / 360;\n const s = hsv.s / 100;\n const v = hsv.v / 100;\n\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n\n let b: number, g: number, r: number;\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n default:\n r = 0;\n g = 0;\n b = 0;\n }\n\n return {\n b: Math.round(b * 255),\n g: Math.round(g * 255),\n r: Math.round(r * 255),\n };\n}\n\n/**\n * Convert LAB to RGB color space\n */\nexport function labToRgb(lab: LAB): RGB {\n return xyzToRgb(labToXyz(lab));\n}\n\n/**\n * Convert LAB to XYZ color space\n */\nexport function labToXyz(lab: LAB): XYZ {\n const { D65, EPSILON, KAPPA } = ColorConstants;\n\n const fy = (lab.l + 16) / 116;\n const fx = lab.a / 500 + fy;\n const fz = fy - lab.b / 200;\n\n const x3 = Math.pow(fx, 3);\n const y3 = Math.pow(fy, 3);\n const z3 = Math.pow(fz, 3);\n\n const x = x3 > EPSILON ? x3 : (116 * fx - 16) / KAPPA;\n const y = lab.l > KAPPA * EPSILON ? y3 : lab.l / KAPPA;\n const z = z3 > EPSILON ? z3 : (116 * fz - 16) / KAPPA;\n\n return {\n x: x * D65.X,\n y: y * D65.Y,\n z: z * D65.Z,\n };\n}\n\n/**\n * Parse color string to RGB\n * Supports: hex (#fff, #ffffff), rgb(r,g,b), hsl(h,s,l)\n */\nexport function parseColor(color: string): null | RGB {\n const trimmed = color.trim().toLowerCase();\n\n // Hex color\n if (trimmed.startsWith(\"#\")) {\n try {\n return hexToRgb(trimmed);\n } catch {\n return null;\n }\n }\n\n // RGB color\n const rgbMatch = trimmed.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbMatch) {\n return {\n b: parseInt(rgbMatch[3], 10),\n g: parseInt(rgbMatch[2], 10),\n r: parseInt(rgbMatch[1], 10),\n };\n }\n\n // HSL color\n const hslMatch = trimmed.match(/^hsla?\\((\\d+),\\s*(\\d+)%,\\s*(\\d+)%/);\n if (hslMatch) {\n return hslToRgb({\n h: parseInt(hslMatch[1], 10),\n l: parseInt(hslMatch[3], 10),\n s: parseInt(hslMatch[2], 10),\n });\n }\n\n return null;\n}\n\n/**\n * Convert RGB to ARGB format (32-bit integer)\n */\nexport function rgbToArgb(rgb: RGB): number {\n const r = Math.round(Math.max(0, Math.min(255, rgb.r)));\n const g = Math.round(Math.max(0, Math.min(255, rgb.g)));\n const b = Math.round(Math.max(0, Math.min(255, rgb.b)));\n // Use >>> 0 to convert to unsigned 32-bit integer\n return ((0xff << 24) | (r << 16) | (g << 8) | b) >>> 0;\n}\n\n/**\n * Convert RGB to hexadecimal color\n */\nexport function rgbToHex(rgb: RGB): HEX {\n const toHex = (n: number): string => {\n const hex = Math.round(Math.max(0, Math.min(255, n))).toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n };\n\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;\n}\n\n/**\n * Convert RGB to HSL color space\n */\nexport function rgbToHsl(rgb: RGB): HSL {\n const r = rgb.r / 255;\n const g = rgb.g / 255;\n const b = rgb.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const diff = max - min;\n\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (diff !== 0) {\n s = l > 0.5 ? diff / (2 - max - min) : diff / (max + min);\n\n switch (max) {\n case b:\n h = ((r - g) / diff + 4) / 6;\n break;\n case g:\n h = ((b - r) / diff + 2) / 6;\n break;\n case r:\n h = ((g - b) / diff + (g < b ? 6 : 0)) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n l: Math.round(l * 100),\n s: Math.round(s * 100),\n };\n}\n\n/**\n * Convert RGB to HSV color space\n */\nexport function rgbToHsv(rgb: RGB): HSV {\n const r = rgb.r / 255;\n const g = rgb.g / 255;\n const b = rgb.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const diff = max - min;\n\n let h = 0;\n const s = max === 0 ? 0 : diff / max;\n const v = max;\n\n if (diff !== 0) {\n switch (max) {\n case b:\n h = ((r - g) / diff + 4) / 6;\n break;\n case g:\n h = ((b - r) / diff + 2) / 6;\n break;\n case r:\n h = ((g - b) / diff + (g < b ? 6 : 0)) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n v: Math.round(v * 100),\n };\n}\n\n/**\n * Convert RGB to LAB color space\n */\nexport function rgbToLab(rgb: RGB): LAB {\n return xyzToLab(rgbToXyz(rgb));\n}\n\n/**\n * Convert RGB to XYZ color space\n * Using sRGB working space and D65 illuminant\n */\nexport function rgbToXyz(rgb: RGB): XYZ {\n let r = rgb.r / 255;\n let g = rgb.g / 255;\n let b = rgb.b / 255;\n\n // Apply gamma correction\n r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n // Multiply by 100 to get standard XYZ values\n r *= 100;\n g *= 100;\n b *= 100;\n\n // Apply transformation matrix (sRGB to XYZ)\n return {\n x: r * 0.4124564 + g * 0.3575761 + b * 0.1804375,\n y: r * 0.2126729 + g * 0.7151522 + b * 0.072175,\n z: r * 0.0193339 + g * 0.119192 + b * 0.9503041,\n };\n}\n\n/**\n * Convert XYZ to LAB color space\n * Using D65 illuminant\n */\nexport function xyzToLab(xyz: XYZ): LAB {\n const { D65, EPSILON, KAPPA } = ColorConstants;\n\n // Normalize by reference white\n const x = xyz.x / D65.X;\n const y = xyz.y / D65.Y;\n const z = xyz.z / D65.Z;\n\n // Apply transformation\n const fx = x > EPSILON ? Math.cbrt(x) : (KAPPA * x + 16) / 116;\n const fy = y > EPSILON ? Math.cbrt(y) : (KAPPA * y + 16) / 116;\n const fz = z > EPSILON ? Math.cbrt(z) : (KAPPA * z + 16) / 116;\n\n return {\n a: 500 * (fx - fy),\n b: 200 * (fy - fz),\n l: 116 * fy - 16,\n };\n}\n\n/**\n * Convert XYZ to RGB color space\n */\nexport function xyzToRgb(xyz: XYZ): RGB {\n // Normalize by 100\n const x = xyz.x / 100;\n const y = xyz.y / 100;\n const z = xyz.z / 100;\n\n // Apply inverse transformation matrix (XYZ to sRGB)\n let r = x * 3.2404542 + y * -1.5371385 + z * -0.4985314;\n let g = x * -0.969266 + y * 1.8760108 + z * 0.041556;\n let b = x * 0.0556434 + y * -0.2040259 + z * 1.0572252;\n\n // Apply inverse gamma correction\n r = r > 0.0031308 ? 1.055 * Math.pow(r, 1 / 2.4) - 0.055 : 12.92 * r;\n g = g > 0.0031308 ? 1.055 * Math.pow(g, 1 / 2.4) - 0.055 : 12.92 * g;\n b = b > 0.0031308 ? 1.055 * Math.pow(b, 1 / 2.4) - 0.055 : 12.92 * b;\n\n return {\n b: Math.round(Math.max(0, Math.min(255, b * 255))),\n g: Math.round(Math.max(0, Math.min(255, g * 255))),\n r: Math.round(Math.max(0, Math.min(255, r * 255))),\n };\n}\n","/**\n * HCT Solver - Converts between HCT and RGB color spaces\n * Based on Material Color Utilities algorithms\n */\n\nimport type { RGB } from \"../types.js\";\nimport type { HCT } from \"./types.js\";\n\nimport { labToXyz, rgbToXyz, xyzToLab, xyzToRgb } from \"../conversions.js\";\n\n/**\n * Create an HCT color from components\n */\nexport function hct(hue: number, chroma: number, tone: number): HCT {\n return {\n c: Math.max(0, chroma),\n h: sanitizeDegrees(hue),\n t: Math.max(0, Math.min(100, tone)),\n };\n}\n\n/**\n * Convert HCT to RGB using iterative solving\n * This is a simplified version of Material's HCT solver\n */\nexport function hctToRgb(hct: HCT): RGB {\n const hue = sanitizeDegrees(hct.h);\n const chroma = Math.max(0, hct.c);\n const tone = Math.max(0, Math.min(100, hct.t));\n\n // Special cases\n if (chroma < 0.0001 || tone < 0.5 || tone > 99.5) {\n const gray = (tone / 100) * 255;\n return { b: gray, g: gray, r: gray };\n }\n\n // Convert tone to L*\n const lstar = tone;\n\n // Use iterative approach to find the right chroma\n let bestRgb: null | RGB = null;\n\n // Binary search for achievable chroma\n let low = 0;\n let high = chroma;\n const epsilon = 0.01;\n\n while (high - low > epsilon) {\n const mid = (low + high) / 2;\n\n // Convert to LAB using approximate chroma\n const a = mid * Math.cos((hue * Math.PI) / 180);\n const b = mid * Math.sin((hue * Math.PI) / 180);\n\n // Convert LAB to XYZ to RGB\n const xyz = labToXyz({ a, b, l: lstar });\n const rgb = xyzToRgb(xyz);\n\n // Check if RGB is in gamut\n if (isInGamut(rgb)) {\n bestRgb = rgb;\n low = mid;\n } else {\n high = mid;\n }\n }\n\n // If we found a valid RGB, use it\n if (bestRgb) {\n return clampRgb(bestRgb);\n }\n\n // Fallback: reduce chroma until in gamut\n for (let c = chroma; c >= 0; c -= 1) {\n const a = c * Math.cos((hue * Math.PI) / 180);\n const b = c * Math.sin((hue * Math.PI) / 180);\n\n const xyz = labToXyz({ a, b, l: lstar });\n const rgb = xyzToRgb(xyz);\n\n if (isInGamut(rgb)) {\n return clampRgb(rgb);\n }\n }\n\n // Final fallback: gray\n const gray = (tone / 100) * 255;\n return { b: gray, g: gray, r: gray };\n}\n\n/**\n * Get maximum chroma for a given hue and tone\n * This is an approximation - actual max varies\n */\nexport function maxChroma(hue: number, tone: number): number {\n // Edge cases\n if (tone <= 0 || tone >= 100) return 0;\n\n // Approximate maximum chroma\n // This varies significantly based on hue and tone\n // Red/magenta hues can achieve higher chroma\n const hueCycle = (hue % 360) / 360;\n const redBoost = Math.sin(hueCycle * Math.PI * 2) * 0.2 + 1;\n\n // Chroma peaks around middle tones\n const toneFactor = Math.sin((tone / 100) * Math.PI);\n\n return toneFactor * 120 * redBoost;\n}\n\n/**\n * Convert RGB to HCT\n */\nexport function rgbToHct(rgb: RGB): HCT {\n // Convert RGB to LAB\n const xyz = rgbToXyz(rgb);\n const lab = xyzToLab(xyz);\n\n // Extract tone from L*\n const tone = lab.l;\n\n // Calculate chroma and hue from a* and b*\n const chroma = Math.sqrt(lab.a * lab.a + lab.b * lab.b);\n let hue = (Math.atan2(lab.b, lab.a) * 180) / Math.PI;\n\n // Ensure hue is positive\n if (hue < 0) {\n hue += 360;\n }\n\n return {\n c: chroma,\n h: sanitizeDegrees(hue),\n t: tone,\n };\n}\n\n/**\n * Clamp RGB values to valid range\n */\nfunction clampRgb(rgb: RGB): RGB {\n return {\n b: Math.round(Math.max(0, Math.min(255, rgb.b))),\n g: Math.round(Math.max(0, Math.min(255, rgb.g))),\n r: Math.round(Math.max(0, Math.min(255, rgb.r))),\n };\n}\n\n/**\n * Check if RGB values are in valid gamut\n */\nfunction isInGamut(rgb: RGB): boolean {\n return (\n rgb.r >= 0 &&\n rgb.r <= 255 &&\n rgb.g >= 0 &&\n rgb.g <= 255 &&\n rgb.b >= 0 &&\n rgb.b <= 255\n );\n}\n\n/**\n * Sanitize degrees to be in [0, 360)\n */\nfunction sanitizeDegrees(degrees: number): number {\n return ((degrees % 360) + 360) % 360;\n}\n","/**\n * HCT Class wrapper for Material Color Utilities compatibility\n */\n\nimport { argbToRgb, rgbToArgb } from \"../conversions.js\";\nimport { hctToRgb, rgbToHct } from \"./hct-solver.js\";\n\n/**\n * HCT class compatible with Material Color Utilities\n */\nexport class Hct {\n get chroma(): number {\n return this._chroma;\n }\n /**\n * Set the chroma of this color. Chroma may decrease because chroma has a\n * different maximum for any given hue and tone.\n * @param newChroma 0 <= newChroma < ?\n */\n set chroma(newChroma: number) {\n const rgb = hctToRgb({ c: newChroma, h: this._hue, t: this._tone });\n this._argb = rgbToArgb(rgb);\n const hct = rgbToHct(rgb);\n this._hue = hct.h;\n this._chroma = hct.c;\n this._tone = hct.t;\n }\n get hue(): number {\n return this._hue;\n }\n /**\n * Set the hue of this color. Chroma may decrease because chroma has a\n * different maximum for any given hue and tone.\n * @param newHue 0 <= newHue < 360; invalid values are corrected.\n */\n set hue(newHue: number) {\n const rgb = hctToRgb({ c: this._chroma, h: newHue, t: this._tone });\n this._argb = rgbToArgb(rgb);\n const hct = rgbToHct(rgb);\n this._hue = hct.h;\n this._chroma = hct.c;\n this._tone = hct.t;\n }\n\n get tone(): number {\n return this._tone;\n }\n\n /**\n * Set the tone of this color. Chroma may decrease because chroma has a\n * different maximum for any given hue and tone.\n * @param newTone 0 <= newTone <= 100; invalid values are corrected.\n */\n set tone(newTone: number) {\n const rgb = hctToRgb({ c: this._chroma, h: this._hue, t: newTone });\n this._argb = rgbToArgb(rgb);\n const hct = rgbToHct(rgb);\n this._hue = hct.h;\n this._chroma = hct.c;\n this._tone = hct.t;\n }\n\n private _argb: number;\n\n private _chroma: number;\n\n private _hue: number;\n\n private _tone: number;\n\n private constructor(argb: number) {\n this._argb = argb;\n const rgb = argbToRgb(argb);\n const hct = rgbToHct(rgb);\n this._hue = hct.h;\n this._chroma = hct.c;\n this._tone = hct.t;\n }\n\n /**\n * Create an HCT color from hue, chroma, and tone.\n * @param hue 0 <= hue < 360; invalid values are corrected.\n * @param chroma 0 <= chroma < ?; Chroma may decrease because chroma has a\n * different maximum for any given hue and tone.\n * @param tone 0 <= tone <= 100; invalid values are corrected.\n * @return HCT representation of a color in default viewing conditions.\n */\n static from(hue: number, chroma: number, tone: number): Hct {\n const rgb = hctToRgb({ c: chroma, h: hue, t: tone });\n const argb = rgbToArgb(rgb);\n return new Hct(argb);\n }\n\n /**\n * Create an HCT color from a color.\n * @param argb ARGB representation of a color.\n * @return HCT representation of a color in default viewing conditions\n */\n static fromInt(argb: number): Hct {\n return new Hct(argb);\n }\n\n /**\n * @return ARGB representation of an HCT color.\n */\n toInt(): number {\n return this._argb;\n }\n}\n","import { Hct } from \"../hct/hct-class.js\";\n\n/**\n * Check and/or fix universally disliked colors.\n *\n * Color science studies of color preference indicate universal distaste for\n * dark yellow-greens, and also show this is correlated to distaste for\n * biological waste and rotting food.\n *\n * See Palmer and Schloss, 2010 or Schloss and Palmer's Chapter 21 in Handbook\n * of Color Psychology (2015).\n */\nexport class DislikeAnalyzer {\n /**\n * Analyze a batch of colors and return statistics\n * @param colors Array of HCT colors\n * @return Statistics about disliked colors\n */\n static analyzeBatch(colors: Hct[]): {\n disliked: number;\n dislikedIndices: number[];\n percentage: number;\n total: number;\n } {\n const dislikedIndices: number[] = [];\n\n colors.forEach((color, index) => {\n if (DislikeAnalyzer.isDisliked(color)) {\n dislikedIndices.push(index);\n }\n });\n\n return {\n disliked: dislikedIndices.length,\n dislikedIndices,\n percentage: (dislikedIndices.length / colors.length) * 100,\n total: colors.length,\n };\n }\n\n /**\n * Fix all disliked colors in a batch\n * @param colors Array of HCT colors\n * @return Array with disliked colors fixed\n */\n static fixBatch(colors: Hct[]): Hct[] {\n return colors.map((color) => DislikeAnalyzer.fixIfDisliked(color));\n }\n\n /**\n * If a color is disliked, lighten it to make it likable.\n *\n * @param hct A color to be judged.\n * @return A new color if the original color is disliked, or the original\n * color if it is acceptable.\n */\n static fixIfDisliked(hct: Hct): Hct {\n if (DislikeAnalyzer.isDisliked(hct)) {\n return Hct.from(hct.hue, hct.chroma, 70.0);\n }\n\n return hct;\n }\n\n /**\n * Fix a hex color if it's disliked\n * @param hex Hex color string\n * @return Fixed hex color or original if not disliked\n */\n static fixIfDislikedHex(hex: string): string {\n const argb = parseInt(hex.replace(\"#\", \"\"), 16) | 0xff000000;\n const hct = Hct.fromInt(argb);\n const fixed = DislikeAnalyzer.fixIfDisliked(hct);\n\n if (fixed === hct) {\n return hex;\n }\n\n const fixedArgb = fixed.toInt();\n const r = (fixedArgb >> 16) & 0xff;\n const g = (fixedArgb >> 8) & 0xff;\n const b = fixedArgb & 0xff;\n\n return \"#\" + [r, g, b].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n /**\n * Returns true if a color is disliked.\n *\n * @param hct A color to be judged.\n * @return Whether the color is disliked.\n *\n * Disliked is defined as a dark yellow-green that is not neutral.\n * Specifically: hue 90-111°, chroma > 16, tone < 65\n */\n static isDisliked(hct: Hct): boolean {\n const huePasses =\n Math.round(hct.hue) >= 90.0 && Math.round(hct.hue) <= 111.0;\n const chromaPasses = Math.round(hct.chroma) > 16.0;\n const tonePasses = Math.round(hct.tone) < 65.0;\n\n return huePasses && chromaPasses && tonePasses;\n }\n\n /**\n * Check if a color is in the \"bile zone\" - universally disliked colors\n * @param hex Hex color string\n * @return Whether the color is disliked\n */\n static isDislikedHex(hex: string): boolean {\n const hct = Hct.fromInt(parseInt(hex.replace(\"#\", \"\"), 16) | 0xff000000);\n return DislikeAnalyzer.isDisliked(hct);\n }\n}\n","/**\n * Color Harmonization\n * Algorithms to blend and harmonize colors based on Material Design principles\n */\n\nimport type { RGB } from \"../types.js\";\n\nimport { hct, hctToRgb, rgbToHct } from \"./hct-solver.js\";\n\n/**\n * Temperature-based color adjustment\n * Warmer (positive) or cooler (negative) adjustment\n */\nexport function adjustTemperature(color: RGB, amount: number): RGB {\n const hctColor = rgbToHct(color);\n\n // Warm colors: red-orange-yellow (0-60, 300-360)\n // Cool colors: green-blue-purple (60-300)\n const isWarm = hctColor.h <= 60 || hctColor.h >= 300;\n\n let newHue: number;\n if (amount > 0) {\n // Make warmer - shift toward orange (30 degrees)\n newHue = isWarm\n ? circularInterpolate(hctColor.h, 30, Math.min(amount, 1))\n : circularInterpolate(hctColor.h, 30, Math.min(amount * 2, 1));\n } else {\n // Make cooler - shift toward blue (210 degrees)\n newHue = !isWarm\n ? circularInterpolate(hctColor.h, 210, Math.min(-amount, 1))\n : circularInterpolate(hctColor.h, 210, Math.min(-amount * 2, 1));\n }\n\n return hctToRgb(hct(newHue, hctColor.c, hctColor.t));\n}\n\n/**\n * Find analogous colors (adjacent on color wheel)\n */\nexport function analogous(\n color: RGB,\n angle: number = 30,\n count: number = 2,\n): RGB[] {\n const hctColor = rgbToHct(color);\n const colors: RGB[] = [];\n\n for (let i = 1; i <= count; i++) {\n // Add colors on both sides\n colors.push(\n hctToRgb(\n hct(\n sanitizeDegreesDouble(hctColor.h + angle * i),\n hctColor.c,\n hctColor.t,\n ),\n ),\n );\n\n colors.push(\n hctToRgb(\n hct(\n sanitizeDegreesDouble(hctColor.h - angle * i),\n hctColor.c,\n hctColor.t,\n ),\n ),\n );\n }\n\n return colors;\n}\n\n/**\n * Blend two colors in HCT space\n * More perceptually uniform than RGB blending\n */\nexport function blend(from: RGB, to: RGB, amount: number): RGB {\n const fromHct = rgbToHct(from);\n const toHct = rgbToHct(to);\n\n // Interpolate in HCT space\n const h = circularInterpolate(fromHct.h, toHct.h, amount);\n const c = fromHct.c + (toHct.c - fromHct.c) * amount;\n const t = fromHct.t + (toHct.t - fromHct.t) * amount;\n\n return hctToRgb(hct(h, c, t));\n}\n\n/**\n * Create a double complementary (rectangle) scheme\n */\nexport function doubleComplementary(\n color1: RGB,\n color2: RGB,\n): [RGB, RGB, RGB, RGB] {\n const hct1 = rgbToHct(color1);\n const hct2 = rgbToHct(color2);\n\n return [\n color1,\n color2,\n hctToRgb(hct((hct1.h + 180) % 360, hct1.c, hct1.t)),\n hctToRgb(hct((hct2.h + 180) % 360, hct2.c, hct2.t)),\n ];\n}\n\n/**\n * Create a gradient between two colors\n */\nexport function gradient(from: RGB, to: RGB, steps: number): RGB[] {\n const colors: RGB[] = [];\n\n for (let i = 0; i < steps; i++) {\n const amount = i / (steps - 1);\n colors.push(blend(from, to, amount));\n }\n\n return colors;\n}\n\n/**\n * Harmonize a color with a target, making them work better together\n * Based on Material's blend algorithm\n */\nexport function harmonize(design: RGB, source: RGB, factor: number = 0.5): RGB {\n const fromHct = rgbToHct(design);\n const toHct = rgbToHct(source);\n\n const diffDegrees = differenceDegrees(fromHct.h, toHct.h);\n const rotationDegrees = Math.min(diffDegrees * factor, 15);\n const outputHue = sanitizeDegreesDouble(\n fromHct.h + rotationDegrees * rotationDirection(fromHct.h, toHct.h),\n );\n\n return hctToRgb(hct(outputHue, fromHct.c, fromHct.t));\n}\n\n/**\n * Find split-complementary colors\n */\nexport function splitComplementary(\n color: RGB,\n angle: number = 30,\n): [RGB, RGB, RGB] {\n const hctColor = rgbToHct(color);\n const complement = (hctColor.h + 180) % 360;\n\n return [\n color,\n hctToRgb(\n hct(sanitizeDegreesDouble(complement - angle), hctColor.c, hctColor.t),\n ),\n hctToRgb(\n hct(sanitizeDegreesDouble(complement + angle), hctColor.c, hctColor.t),\n ),\n ];\n}\n\n/**\n * Find tetradic (square) colors - four colors evenly spaced\n */\nexport function tetradic(color: RGB): [RGB, RGB, RGB, RGB] {\n const hctColor = rgbToHct(color);\n\n return [\n color,\n hctToRgb(hct((hctColor.h + 90) % 360, hctColor.c, hctColor.t)),\n hctToRgb(hct((hctColor.h + 180) % 360, hctColor.c, hctColor.t)),\n hctToRgb(hct((hctColor.h + 270) % 360, hctColor.c, hctColor.t)),\n ];\n}\n\n// Helper functions\n\nfunction circularInterpolate(from: number, to: number, amount: number): number {\n const difference = to - from;\n const distance = Math.abs(difference);\n\n if (distance > 180) {\n // Take the shorter path around the circle\n if (difference > 0) {\n from += 360;\n } else {\n to += 360;\n }\n }\n\n return sanitizeDegreesDouble(from + (to - from) * amount);\n}\n\nfunction differenceDegrees(a: number, b: number): number {\n return Math.abs(((a - b + 180) % 360) - 180);\n}\n\nfunction rotationDirection(from: number, to: number): number {\n const difference = to - from;\n const normalized = ((difference + 180) % 360) - 180;\n return normalized >= 0 ? 1 : -1;\n}\n\nfunction sanitizeDegreesDouble(degrees: number): number {\n return ((degrees % 360) + 360) % 360;\n}\n","/**\n * Tonal Palette Generator\n * Creates Material Design 3 tonal palettes from HCT colors\n */\n\nimport type { RGB } from \"../types.js\";\nimport type { HCT } from \"./types.js\";\n\nimport { hct, hctToRgb, rgbToHct } from \"./hct-solver.js\";\n\n/**\n * Standard Material 3 tone values\n */\nexport const MATERIAL_TONES = [\n 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99, 100,\n] as const;\n\n/**\n * Extended tone values for more granularity\n */\nexport const EXTENDED_TONES = [\n 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 92,\n 94, 96, 98, 99, 100,\n] as const;\n\n/**\n * Material 3 Core Palette\n * Contains all the tonal palettes needed for a complete theme\n */\nexport interface CorePalette {\n /** Error color palette */\n error: TonalPalette;\n /** Neutral color palette (grays) */\n neutral: TonalPalette;\n /** Neutral variant palette (slightly tinted grays) */\n neutralVariant: TonalPalette;\n /** Primary color palette */\n primary: TonalPalette;\n /** Secondary color palette */\n secondary: TonalPalette;\n /** Tertiary color palette */\n tertiary: TonalPalette;\n}\n\n/**\n * A tonal palette - variations of a single color at different tones\n */\nexport class TonalPalette {\n /**\n * Get extended tones for more options\n */\n get extendedTones(): Record<number, RGB> {\n const tones: Record<number, RGB> = {};\n for (const t of EXTENDED_TONES) {\n tones[t] = this.tone(t);\n }\n return tones;\n }\n\n /**\n * Get all Material 3 standard tones\n */\n get materialTones(): Record<number, RGB> {\n const tones: Record<number, RGB> = {};\n for (const t of MATERIAL_TONES) {\n tones[t] = this.tone(t);\n }\n return tones;\n }\n\n private cache = new Map<number, RGB>();\n\n constructor(\n public readonly hue: number,\n public readonly chroma: number,\n ) {}\n\n /**\n * Create a tonal palette from an HCT color\n */\n static fromHct(color: HCT): TonalPalette {\n return new TonalPalette(color.h, color.c);\n }\n\n /**\n * Create a tonal palette from an RGB color\n */\n static fromRgb(rgb: RGB): TonalPalette {\n const hctColor = rgbToHct(rgb);\n return new TonalPalette(hctColor.h, hctColor.c);\n }\n\n /**\n * Get the color at a specific tone\n */\n tone(tone: number): RGB {\n // Check cache first\n if (this.cache.has(tone)) {\n return this.cache.get(tone)!;\n }\n\n // Generate and cache\n const color = hctToRgb(hct(this.hue, this.chroma, tone));\n this.cache.set(tone, color);\n return color;\n }\n}\n\n/**\n * Generate an analogous palette (adjacent hues)\n */\nexport function analogousPalette(\n source: RGB,\n count: number = 5,\n hueShift: number = 30,\n): TonalPalette[] {\n const sourceHct = rgbToHct(source);\n const palettes: TonalPalette[] = [];\n\n const startHue = sourceHct.h - hueShift * Math.floor(count / 2);\n\n for (let i = 0; i < count; i++) {\n const hue = (startHue + i * hueShift + 360) % 360;\n palettes.push(new TonalPalette(hue, sourceHct.c));\n }\n\n return palettes;\n}\n\n/**\n * Generate a complementary palette\n */\nexport function complementaryPalette(\n source: RGB,\n): [TonalPalette, TonalPalette] {\n const sourceHct = rgbToHct(source);\n\n return [\n new TonalPalette(sourceHct.h, sourceHct.c),\n new TonalPalette((sourceHct.h + 180) % 360, sourceHct.c),\n ];\n}\n\n/**\n * Generate a complete Material 3 core palette from a source color\n */\nexport function corePaletteFromRgb(source: RGB): CorePalette {\n const sourceHct = rgbToHct(source);\n\n // Primary uses the source color\n const primary = new TonalPalette(sourceHct.h, Math.max(48, sourceHct.c));\n\n // Secondary is shifted in hue and reduced chroma\n const secondary = new TonalPalette(\n sourceHct.h,\n Math.max(16, sourceHct.c / 3),\n );\n\n // Tertiary shifts hue by 60 degrees\n const tertiary = new TonalPalette(\n (sourceHct.h + 60) % 360,\n Math.max(24, sourceHct.c / 2),\n );\n\n // Error is always red-ish\n const error = new TonalPalette(25, 84);\n\n // Neutral has very low chroma\n const neutral = new TonalPalette(sourceHct.h, Math.min(4, sourceHct.c / 12));\n\n // Neutral variant has slightly more chroma\n const neutralVariant = new TonalPalette(\n sourceHct.h,\n Math.min(8, sourceHct.c / 6),\n );\n\n return {\n error,\n neutral,\n neutralVariant,\n primary,\n secondary,\n tertiary,\n };\n}\n\n/**\n * Generate a monochromatic palette (single hue, varying tones)\n */\nexport function monochromaticPalette(\n source: RGB,\n tones: readonly number[] = MATERIAL_TONES,\n): RGB[] {\n const palette = TonalPalette.fromRgb(source);\n return tones.map((t) => palette.tone(t));\n}\n\n/**\n * Generate a triadic palette (three colors evenly spaced)\n */\nexport function triadicPalette(\n source: RGB,\n): [TonalPalette, TonalPalette, TonalPalette] {\n const sourceHct = rgbToHct(source);\n\n return [\n new TonalPalette(sourceHct.h, sourceHct.c),\n new TonalPalette((sourceHct.h + 120) % 360, sourceHct.c),\n new TonalPalette((sourceHct.h + 240) % 360, sourceHct.c),\n ];\n}\n","/**\n * HCT (Hue, Chroma, Tone) color space types\n * Based on Material Color Utilities\n */\n\n/**\n * CAM16 color appearance model\n * Predicts color appearance under different viewing conditions\n */\nexport interface CAM16 {\n /** Chroma composition */\n astar: number;\n /** Brightness composition */\n bstar: number;\n /** Chroma */\n chroma: number;\n /** Hue angle */\n hue: number;\n /** Lightness */\n j: number;\n /** Hue composition */\n jstar: number;\n /** Colorfulness */\n m: number;\n /** Brightness */\n q: number;\n /** Saturation */\n s: number;\n}\n\n/**\n * HCT color representation\n * A perceptually accurate color space that combines:\n * - Hue from CAM16\n * - Chroma from CAM16\n * - Tone (Lightness) from L* (LAB)\n */\nexport interface HCT {\n /** Chroma (colorfulness) [0, ~150] - actual max varies by hue and tone */\n c: number;\n /** Hue angle in degrees [0, 360) */\n h: number;\n /** Tone (lightness) [0, 100] */\n t: number;\n}\n\n/**\n * Viewing conditions for CAM16\n * Describes the environment in which colors are viewed\n */\nexport interface ViewingConditions {\n /** Background luminance ratio */\n aw: number;\n /** Base exponential nonlinearity */\n c: number;\n /** Degree of adaptation */\n fl: number;\n /** Luminance level adaptation factor */\n flRoot: number;\n /** Adapting luminance */\n n: number;\n /** Luminance level adaptation factor */\n nbb: number;\n /** Chromatic induction factor */\n nc: number;\n /** Chromatic induction factor */\n ncb: number;\n /** Achromatic response for white */\n rgbD: [number, number, number];\n /** Surround factor */\n z: number;\n}\n\n/**\n * Standard viewing conditions\n */\nexport const STANDARD_CONDITIONS: ViewingConditions = {\n aw: 29.98,\n c: 0.69,\n fl: 0.388,\n flRoot: 0.789,\n n: 0.184,\n nbb: 1.017,\n nc: 1.0,\n ncb: 1.017,\n rgbD: [1.021, 0.986, 0.934],\n z: 1.909,\n};\n","/**\n * Color distance metrics for calculating perceptual differences between colors\n */\n\nimport type { ColorDistanceOptions, LAB, RGB } from \"./types.js\";\n\nimport { rgbToLab } from \"./conversions.js\";\n\n/**\n * Determine if two colors are perceptually similar\n * Uses Delta E 2000 with a threshold\n */\nexport function areColorsSimilar(\n color1: RGB,\n color2: RGB,\n threshold: number = 2.3, // JND (Just Noticeable Difference)\n): boolean {\n const distance = colorDistance(color1, color2, { metric: \"deltaE2000\" });\n return distance <= threshold;\n}\n\n/**\n * Calculate color distance between two RGB colors using specified metric\n */\nexport function colorDistance(\n color1: RGB,\n color2: RGB,\n options?: ColorDistanceOptions,\n): number {\n const metric = options?.metric ?? \"deltaE2000\";\n\n switch (metric) {\n case \"deltaE76\": {\n const lab1 = rgbToLab(color1);\n const lab2 = rgbToLab(color2);\n return deltaE76(lab1, lab2);\n }\n\n case \"deltaE94\": {\n const lab1 = rgbToLab(color1);\n const lab2 = rgbToLab(color2);\n return deltaE94(lab1, lab2, options?.deltaE94);\n }\n\n case \"euclidean\":\n return euclideanDistance(color1, color2);\n\n case \"weighted\":\n return weightedRgbDistance(color1, color2, options?.weights);\n\n case \"deltaE2000\":\n default: {\n const lab1 = rgbToLab(color1);\n const lab2 = rgbToLab(color2);\n return deltaE2000(lab1, lab2);\n }\n }\n}\n\n/**\n * Calculate Delta E CIE2000 (ΔE*00)\n * Most accurate perceptual color difference formula\n */\nexport function deltaE2000(lab1: LAB, lab2: LAB): number {\n const deg2rad = (deg: number) => deg * (Math.PI / 180);\n const rad2deg = (rad: number) => rad * (180 / Math.PI);\n\n // Weight factors\n const kL = 1;\n const kC = 1;\n const kH = 1;\n\n // Calculate C' and h'\n const C1 = Math.sqrt(lab1.a * lab1.a + lab1.b * lab1.b);\n const C2 = Math.sqrt(lab2.a * lab2.a + lab2.b * lab2.b);\n const Cbar = (C1 + C2) / 2;\n\n const G =\n 0.5 *\n (1 - Math.sqrt(Math.pow(Cbar, 7) / (Math.pow(Cbar, 7) + Math.pow(25, 7))));\n\n const a1p = lab1.a * (1 + G);\n const a2p = lab2.a * (1 + G);\n\n const C1p = Math.sqrt(a1p * a1p + lab1.b * lab1.b);\n const C2p = Math.sqrt(a2p * a2p + lab2.b * lab2.b);\n\n let h1p = Math.atan2(lab1.b, a1p);\n let h2p = Math.atan2(lab2.b, a2p);\n\n if (h1p < 0) h1p += 2 * Math.PI;\n if (h2p < 0) h2p += 2 * Math.PI;\n\n h1p = rad2deg(h1p);\n h2p = rad2deg(h2p);\n\n // Calculate deltas\n const dLp = lab2.l - lab1.l;\n const dCp = C2p - C1p;\n\n let dhp = h2p - h1p;\n if (dhp > 180) dhp -= 360;\n if (dhp < -180) dhp += 360;\n\n const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin(deg2rad(dhp) / 2);\n\n // Calculate averages\n const Lbar = (lab1.l + lab2.l) / 2;\n const Cpbar = (C1p + C2p) / 2;\n\n let hpbar = (h1p + h2p) / 2;\n if (Math.abs(h1p - h2p) > 180) {\n if (h1p + h2p < 360) {\n hpbar += 180;\n } else {\n hpbar -= 180;\n }\n }\n\n // Calculate T\n const T =\n 1 -\n 0.17 * Math.cos(deg2rad(hpbar - 30)) +\n 0.24 * Math.cos(deg2rad(2 * hpbar)) +\n 0.32 * Math.cos(deg2rad(3 * hpbar + 6)) -\n 0.2 * Math.cos(deg2rad(4 * hpbar - 63));\n\n // Calculate rotation term\n const dTheta = 30 * Math.exp(-Math.pow((hpbar - 275) / 25, 2));\n const RC =\n 2 * Math.sqrt(Math.pow(Cpbar, 7) / (Math.pow(Cpbar, 7) + Math.pow(25, 7)));\n const RT = -RC * Math.sin(2 * deg2rad(dTheta));\n\n // Calculate weighting functions\n const SL =\n 1 +\n (0.015 * Math.pow(Lbar - 50, 2)) / Math.sqrt(20 + Math.pow(Lbar - 50, 2));\n const SC = 1 + 0.045 * Cpbar;\n const SH = 1 + 0.015 * Cpbar * T;\n\n // Calculate final Delta E 2000\n const dLpKlSl = dLp / (kL * SL);\n const dCpKcSc = dCp / (kC * SC);\n const dHpKhSh = dHp / (kH * SH);\n\n return Math.sqrt(\n dLpKlSl * dLpKlSl +\n dCpKcSc * dCpKcSc +\n dHpKhSh * dHpKhSh +\n RT * dCpKcSc * dHpKhSh,\n );\n}\n\n/**\n * Calculate Delta E CIE76 (ΔE*ab)\n * Original CIE color difference formula\n */\nexport function deltaE76(lab1: LAB, lab2: LAB): number {\n const dL = lab1.l - lab2.l;\n const da = lab1.a - lab2.a;\n const db = lab1.b - lab2.b;\n\n return Math.sqrt(dL * dL + da * da + db * db);\n}\n\n/**\n * Calculate Delta E CIE94 (ΔE*94)\n * Improved perceptual uniformity over CIE76\n */\nexport function deltaE94(\n lab1: LAB,\n lab2: LAB,\n options?: { kC?: number; kH?: number; kL?: number },\n): number {\n // Default values for graphic arts\n const kL = options?.kL ?? 1;\n const kC = options?.kC ?? 1;\n const kH = options?.kH ?? 1;\n\n const dL = lab1.l - lab2.l;\n const da = lab1.a - lab2.a;\n const db = lab1.b - lab2.b;\n\n const C1 = Math.sqrt(lab1.a * lab1.a + lab1.b * lab1.b);\n const C2 = Math.sqrt(lab2.a * lab2.a + lab2.b * lab2.b);\n const dC = C1 - C2;\n\n const dH2 = da * da + db * db - dC * dC;\n const dH = dH2 > 0 ? Math.sqrt(dH2) : 0;\n\n const SL = 1;\n const SC = 1 + 0.045 * C1;\n const SH = 1 + 0.015 * C1;\n\n const dLKlSl = dL / (kL * SL);\n const dCKcSc = dC / (kC * SC);\n const dHKhSh = dH / (kH * SH);\n\n return Math.sqrt(dLKlSl * dLKlSl + dCKcSc * dCKcSc + dHKhSh * dHKhSh);\n}\n\n/**\n * Calculate Euclidean distance between two RGB colors\n * Simple but not perceptually uniform\n */\nexport function euclideanDistance(color1: RGB, color2: RGB): number {\n const dr = color1.r - color2.r;\n const dg = color1.g - color2.g;\n const db = color1.b - color2.b;\n\n return Math.sqrt(dr * dr + dg * dg + db * db);\n}\n\n/**\n * Find the most different color from a set of colors\n */\nexport function findMostDifferentColor(\n baseColor: RGB,\n colors: RGB[],\n options?: ColorDistanceOptions,\n): null | RGB {\n if (colors.length === 0) return null;\n\n let maxDistance = -Infinity;\n let mostDifferent = colors[0];\n\n for (const color of colors) {\n const distance = colorDistance(baseColor, color, options);\n if (distance > maxDistance) {\n maxDistance = distance;\n mostDifferent = color;\n }\n }\n\n return mostDifferent;\n}\n\n/**\n * Find the most similar color from a set of colors\n */\nexport function findMostSimilarColor(\n baseColor: RGB,\n colors: RGB[],\n options?: ColorDistanceOptions,\n): null | RGB {\n if (colors.length === 0) return null;\n\n let minDistance = Infinity;\n let mostSimilar = colors[0];\n\n for (const color of colors) {\n const distance = colorDistance(baseColor, color, options);\n if (distance < minDistance) {\n minDistance = distance;\n mostSimilar = color;\n }\n }\n\n return mostSimilar;\n}\n\n/**\n * Calculate weighted RGB distance\n * Better approximation of perceptual difference than simple Euclidean\n */\nexport function weightedRgbDistance(\n color1: RGB,\n color2: RGB,\n weights?: { b?: number; g?: number; r?: number },\n): number {\n // Default weights based on human eye sensitivity\n const wr = weights?.r ?? 0.3;\n const wg = weights?.g ?? 0.59;\n const wb = weights?.b ?? 0.11;\n\n const dr = (color1.r - color2.r) * wr;\n const dg = (color1.g - color2.g) * wg;\n const db = (color1.b - color2.b) * wb;\n\n return Math.sqrt(dr * dr + dg * dg + db * db);\n}\n","/**\n * Utility functions for color manipulation and validation\n */\n\nimport type { HSL, HSV, RGB } from \"./types.js\";\n\nimport { parseColor, rgbToHex, rgbToHsl, rgbToHsv } from \"./conversions.js\";\n\n/**\n * Clamp HSL values to valid range\n */\nexport function clampHsl(hsl: HSL): HSL {\n return {\n h: clamp(hsl.h, 0, 360),\n l: clamp(hsl.l, 0, 100),\n s: clamp(hsl.s, 0, 100),\n };\n}\n\n/**\n * Clamp HSV values to valid range\n */\nexport function clampHsv(hsv: HSV): HSV {\n return {\n h: clamp(hsv.h, 0, 360),\n s: clamp(hsv.s, 0, 100),\n v: clamp(hsv.v, 0, 100),\n };\n}\n\n/**\n * Clamp RGB values to valid range\n */\nexport function clampRgb(rgb: RGB): RGB {\n return {\n b: clamp(rgb.b, 0, 255),\n g: clamp(rgb.g, 0, 255),\n r: clamp(rgb.r, 0, 255),\n };\n}\n\n/**\n * Darken a color by a percentage\n * @param rgb The color to darken\n * @param amount Amount to darken (0-100)\n */\nexport function darken(rgb: RGB, amount: number): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.l = clamp(hsl.l - amount, 0, 100);\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Desaturate a color by a percentage\n * @param rgb The color to desaturate\n * @param amount Amount to desaturate (0-100)\n */\nexport function desaturate(rgb: RGB, amount: number): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.s = clamp(hsl.s - amount, 0, 100);\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Format color to various string representations\n */\nexport function formatColor(\n rgb: RGB,\n format: \"hex\" | \"hsl\" | \"hsv\" | \"rgb\" = \"hex\",\n): string {\n switch (format) {\n case \"hex\":\n return rgbToHex(rgb);\n case \"hsl\":\n return formatHsl(rgbToHsl(rgb));\n case \"hsv\": {\n const hsv = rgbToHsv(rgb);\n return `hsv(${hsv.h}, ${hsv.s}%, ${hsv.v}%)`;\n }\n case \"rgb\":\n return formatRgb(rgb);\n default:\n return rgbToHex(rgb);\n }\n}\n\n/**\n * Format HSL color to string\n */\nexport function formatHsl(hsl: HSL, alpha?: number): string {\n if (alpha !== undefined) {\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${alpha})`;\n }\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n}\n\n/**\n * Format RGB color to string\n */\nexport function formatRgb(rgb: RGB, alpha?: number): string {\n if (alpha !== undefined) {\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n}\n\n/**\n * Get complementary color (opposite on color wheel)\n */\nexport function getComplementary(rgb: RGB): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.h = (hsl.h + 180) % 360;\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Calculate contrast ratio between two colors\n * Based on WCAG 2.0 formula\n */\nexport function getContrastRatio(color1: RGB, color2: RGB): number {\n const lum1 = getLuminance(color1);\n const lum2 = getLuminance(color2);\n\n const lighter = Math.max(lum1, lum2);\n const darker = Math.min(lum1, lum2);\n\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Calculate relative luminance of an RGB color\n * Based on WCAG 2.0 formula\n */\nexport function getLuminance(rgb: RGB): number {\n const rsRGB = rgb.r / 255;\n const gsRGB = rgb.g / 255;\n const bsRGB = rgb.b / 255;\n\n const r =\n rsRGB <= 0.03928 ? rsRGB / 12.92 : Math.pow((rsRGB + 0.055) / 1.055, 2.4);\n const g =\n gsRGB <= 0.03928 ? gsRGB / 12.92 : Math.pow((gsRGB + 0.055) / 1.055, 2.4);\n const b =\n bsRGB <= 0.03928 ? bsRGB / 12.92 : Math.pow((bsRGB + 0.055) / 1.055, 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Invert a color\n */\nexport function invertColor(rgb: RGB): RGB {\n return {\n b: 255 - rgb.b,\n g: 255 - rgb.g,\n r: 255 - rgb.r,\n };\n}\n\n/**\n * Check if a color is considered \"dark\"\n * Based on luminance threshold\n */\nexport function isDark(rgb: RGB, threshold: number = 0.5): boolean {\n return getLuminance(rgb) < threshold;\n}\n\n/**\n * Check if a color is considered \"light\"\n * Based on luminance threshold\n */\nexport function isLight(rgb: RGB, threshold: number = 0.5): boolean {\n return getLuminance(rgb) >= threshold;\n}\n\n/**\n * Validate hexadecimal color string\n */\nexport function isValidHex(hex: string): boolean {\n const cleanHex = hex.replace(\"#\", \"\");\n return /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(cleanHex);\n}\n\n/**\n * Validate HSL color values\n */\nexport function isValidHsl(hsl: HSL): boolean {\n return (\n hsl.h >= 0 &&\n hsl.h <= 360 &&\n hsl.s >= 0 &&\n hsl.s <= 100 &&\n hsl.l >= 0 &&\n hsl.l <= 100\n );\n}\n\n/**\n * Validate HSV color values\n */\nexport function isValidHsv(hsv: HSV): boolean {\n return (\n hsv.h >= 0 &&\n hsv.h <= 360 &&\n hsv.s >= 0 &&\n hsv.s <= 100 &&\n hsv.v >= 0 &&\n hsv.v <= 100\n );\n}\n\n/**\n * Validate RGB color values\n */\nexport function isValidRgb(rgb: RGB): boolean {\n return (\n rgb.r >= 0 &&\n rgb.r <= 255 &&\n rgb.g >= 0 &&\n rgb.g <= 255 &&\n rgb.b >= 0 &&\n rgb.b <= 255\n );\n}\n\n/**\n * Lighten a color by a percentage\n * @param rgb The color to lighten\n * @param amount Amount to lighten (0-100)\n */\nexport function lighten(rgb: RGB, amount: number): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.l = clamp(hsl.l + amount, 0, 100);\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Check if contrast meets WCAG AA standard\n * Normal text: 4.5:1, Large text: 3:1\n */\nexport function meetsContrastAA(\n color1: RGB,\n color2: RGB,\n largeText: boolean = false,\n): boolean {\n const ratio = getContrastRatio(color1, color2);\n return largeText ? ratio >= 3 : ratio >= 4.5;\n}\n\n/**\n * Check if contrast meets WCAG AAA standard\n * Normal text: 7:1, Large text: 4.5:1\n */\nexport function meetsContrastAAA(\n color1: RGB,\n color2: RGB,\n largeText: boolean = false,\n): boolean {\n const ratio = getContrastRatio(color1, color2);\n return largeText ? ratio >= 4.5 : ratio >= 7;\n}\n\n/**\n * Mix two colors together\n * @param color1 First color\n * @param color2 Second color\n * @param weight Weight of the first color (0-1)\n */\nexport function mixColors(color1: RGB, color2: RGB, weight: number = 0.5): RGB {\n const w = clamp(weight, 0, 1);\n const w2 = 1 - w;\n\n return {\n b: Math.round(color1.b * w + color2.b * w2),\n g: Math.round(color1.g * w + color2.g * w2),\n r: Math.round(color1.r * w + color2.r * w2),\n };\n}\n\n/**\n * Generate a random RGB color\n */\nexport function randomColor(): RGB {\n return {\n b: Math.floor(Math.random() * 256),\n g: Math.floor(Math.random() * 256),\n r: Math.floor(Math.random() * 256),\n };\n}\n\n/**\n * Saturate a color by a percentage\n * @param rgb The color to saturate\n * @param amount Amount to saturate (0-100)\n */\nexport function saturate(rgb: RGB, amount: number): RGB {\n const hsl = rgbToHsl(rgb);\n hsl.s = clamp(hsl.s + amount, 0, 100);\n return parseColor(formatHsl(hsl)) || rgb;\n}\n\n/**\n * Convert color to grayscale\n */\nexport function toGrayscale(rgb: RGB): RGB {\n const gray = Math.round(0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b);\n return { b: gray, g: gray, r: gray };\n}\n\n/**\n * Clamp a number between min and max values\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n"],"mappings":"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","names":["ColorFormat","p","q","hct","gray","hct","hct","clampRgb"]}
|
|
@@ -74,9 +74,20 @@ var CoolorsMCPSession = class extends EventEmitter {
|
|
|
74
74
|
}
|
|
75
75
|
args = parsed.value;
|
|
76
76
|
}
|
|
77
|
+
const noop = () => {
|
|
78
|
+
};
|
|
79
|
+
const context = {
|
|
80
|
+
client: { version: this.#server.getClientVersion() },
|
|
81
|
+
log: { debug: noop, error: noop, info: noop, warn: noop },
|
|
82
|
+
reportProgress: async () => {
|
|
83
|
+
},
|
|
84
|
+
session: void 0,
|
|
85
|
+
streamContent: async () => {
|
|
86
|
+
}
|
|
87
|
+
};
|
|
77
88
|
const result = await tool.execute(
|
|
78
89
|
args,
|
|
79
|
-
|
|
90
|
+
context
|
|
80
91
|
);
|
|
81
92
|
if (typeof result === "string") {
|
|
82
93
|
return {
|
|
@@ -94,6 +105,7 @@ var CoolorsMcp = class extends EventEmitter2 {
|
|
|
94
105
|
super();
|
|
95
106
|
this.options = options;
|
|
96
107
|
}
|
|
108
|
+
options;
|
|
97
109
|
#sessions = [];
|
|
98
110
|
#tools = [];
|
|
99
111
|
addTool(tool) {
|
|
@@ -111,4 +123,4 @@ var CoolorsMcp = class extends EventEmitter2 {
|
|
|
111
123
|
export {
|
|
112
124
|
CoolorsMcp
|
|
113
125
|
};
|
|
114
|
-
//# sourceMappingURL=chunk-
|
|
126
|
+
//# sourceMappingURL=chunk-LHW2ZTOU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/coolors-mcp.ts","../src/session.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { EventEmitter } from \"node:events\";\nimport { StrictEventEmitter } from \"strict-event-emitter-types\";\n\nimport { CoolorsMCPSession } from \"./session.js\";\nimport {\n CoolorsMCPEvents,\n CoolorsMCPSessionAuth,\n ServerOptions,\n Tool,\n ToolParameters,\n} from \"./types.js\";\n\nexport class CoolorsMcp extends (EventEmitter as {\n new (): StrictEventEmitter<EventEmitter, CoolorsMCPEvents>;\n}) {\n #sessions: CoolorsMCPSession[] = [];\n #tools: Tool<CoolorsMCPSessionAuth>[] = [];\n\n constructor(public options: ServerOptions<CoolorsMCPSessionAuth>) {\n super();\n }\n\n public addTool<Params extends ToolParameters>(\n tool: Tool<CoolorsMCPSessionAuth, Params>,\n ) {\n this.#tools.push(tool as unknown as Tool<CoolorsMCPSessionAuth>);\n }\n\n public async start() {\n const transport = new StdioServerTransport();\n const session = new CoolorsMCPSession(this.options, this.#tools);\n this.#sessions.push(session);\n await session.connect(transport);\n this.emit(\"connect\", { session });\n }\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport {\n CallToolRequestSchema,\n ErrorCode,\n ListToolsRequestSchema,\n McpError,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { EventEmitter } from \"node:events\";\nimport { StrictEventEmitter } from \"strict-event-emitter-types\";\nimport { toJsonSchema } from \"xsschema\";\n\nimport {\n CoolorsMCPSessionAuth,\n CoolorsMCPSessionEvents,\n ServerOptions,\n Tool,\n} from \"./types.js\";\n\nexport class CoolorsMCPSession extends (EventEmitter as {\n new (): StrictEventEmitter<EventEmitter, CoolorsMCPSessionEvents>;\n}) {\n #server: Server;\n #tools: Tool<CoolorsMCPSessionAuth>[];\n\n constructor(\n options: ServerOptions<CoolorsMCPSessionAuth>,\n tools: Tool<CoolorsMCPSessionAuth>[],\n ) {\n super();\n this.#server = new Server(\n { name: options.name, version: options.version },\n { capabilities: { tools: {} } },\n );\n this.#tools = tools;\n this.setupToolHandlers();\n }\n\n public async connect(transport: Transport) {\n await this.#server.connect(transport);\n this.emit(\"ready\");\n }\n\n private setupToolHandlers() {\n this.#server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: await Promise.all(\n this.#tools.map(async (tool) => {\n return {\n annotations: tool.annotations,\n description: tool.description,\n inputSchema: tool.parameters\n ? await toJsonSchema(tool.parameters)\n : {\n additionalProperties: false,\n properties: {},\n type: \"object\",\n },\n name: tool.name,\n };\n }),\n ),\n };\n });\n\n this.#server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = this.#tools.find(\n (tool) => tool.name === request.params.name,\n );\n\n if (!tool) {\n throw new McpError(\n ErrorCode.MethodNotFound,\n `Unknown tool: ${request.params.name}`,\n );\n }\n\n let args: unknown = undefined;\n\n if (tool.parameters) {\n const parsed = await tool.parameters[\"~standard\"].validate(\n request.params.arguments,\n );\n\n if (parsed.issues) {\n const friendlyErrors = parsed.issues\n .map((issue) => {\n const path = issue.path?.join(\".\") || \"root\";\n return `${path}: ${issue.message}`;\n })\n .join(\", \");\n\n throw new McpError(\n ErrorCode.InvalidParams,\n `Tool '${request.params.name}' parameter validation failed: ${friendlyErrors}. Please check the parameter types and values according to the tool's schema.`,\n );\n }\n\n args = parsed.value;\n }\n\n const noop = () => {};\n const context = {\n client: { version: this.#server.getClientVersion() },\n log: { debug: noop, error: noop, info: noop, warn: noop },\n reportProgress: async () => {},\n session: undefined,\n streamContent: async () => {},\n };\n const result = await tool.execute(\n args as Parameters<typeof tool.execute>[0],\n context as Parameters<typeof tool.execute>[1],\n );\n\n if (typeof result === \"string\") {\n return {\n content: [{ text: result, type: \"text\" }],\n };\n }\n\n return result;\n });\n }\n}\n"],"mappings":"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","names":["EventEmitter","tool","EventEmitter"]}
|
package/dist/color/index.js
CHANGED
package/dist/coolors-mcp.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
2
|
import { StrictEventEmitter } from 'strict-event-emitter-types';
|
|
3
3
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
4
4
|
import { StandardSchemaV1 } from '@standard-schema/spec';
|
|
@@ -29,10 +29,10 @@ type Context<T extends CoolorsMCPSessionAuth> = {
|
|
|
29
29
|
};
|
|
30
30
|
type CoolorsMCPEvents = {
|
|
31
31
|
connect: (event: {
|
|
32
|
-
session:
|
|
32
|
+
session: unknown;
|
|
33
33
|
}) => void;
|
|
34
34
|
disconnect: (event: {
|
|
35
|
-
session:
|
|
35
|
+
session: unknown;
|
|
36
36
|
}) => void;
|
|
37
37
|
};
|
|
38
38
|
type CoolorsMCPSessionAuth = Record<string, unknown> | undefined;
|
|
@@ -108,7 +108,7 @@ type Tool<T extends CoolorsMCPSessionAuth, Params extends ToolParameters = ToolP
|
|
|
108
108
|
} & ToolAnnotations;
|
|
109
109
|
canAccess?: (auth: T) => boolean;
|
|
110
110
|
description?: string;
|
|
111
|
-
execute: (args: StandardSchemaV1.InferOutput<Params>, context: Context<T>) => Promise<AudioContent | ContentResult | ImageContent | ResourceContent | ResourceLink | string | TextContent
|
|
111
|
+
execute: (args: StandardSchemaV1.InferOutput<Params>, context: Context<T>) => Promise<AudioContent | ContentResult | ImageContent | ResourceContent | ResourceLink | string | TextContent>;
|
|
112
112
|
name: string;
|
|
113
113
|
parameters?: Params;
|
|
114
114
|
timeoutMs?: number;
|
package/dist/coolors-mcp.js
CHANGED
package/eslint.config.ts
CHANGED
|
@@ -11,4 +11,17 @@ export default tseslint.config(
|
|
|
11
11
|
{
|
|
12
12
|
ignores: ["**/*.js", "dist/**"],
|
|
13
13
|
},
|
|
14
|
+
{
|
|
15
|
+
// Vendored Material Color Utilities use the "declare-then-assign-in-loop"
|
|
16
|
+
// pattern liberally; that conflicts with ESLint 10's new no-useless-assignment.
|
|
17
|
+
files: [
|
|
18
|
+
"src/color/quantize/**",
|
|
19
|
+
"src/color/utils/color_utils.ts",
|
|
20
|
+
"src/color/hct/**",
|
|
21
|
+
"src/color/score/**",
|
|
22
|
+
],
|
|
23
|
+
rules: {
|
|
24
|
+
"no-useless-assignment": "off",
|
|
25
|
+
},
|
|
26
|
+
},
|
|
14
27
|
);
|
package/jsr.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trishchuk/coolors-mcp",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"main": "dist/CoolorsMCP.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsup",
|
|
@@ -34,6 +34,12 @@
|
|
|
34
34
|
"image-extraction"
|
|
35
35
|
],
|
|
36
36
|
"type": "module",
|
|
37
|
+
"packageManager": "pnpm@10.30.3",
|
|
38
|
+
"pnpm": {
|
|
39
|
+
"onlyBuiltDependencies": [
|
|
40
|
+
"esbuild"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
37
43
|
"author": "Taras Trishchuk <x51xxx@gmail.com>",
|
|
38
44
|
"license": "MIT",
|
|
39
45
|
"description": "Advanced color operations MCP server with Material Design 3 support, CSS theme matching, image color extraction, and accessibility compliance. Features HCT color space for perceptually accurate operations.",
|
|
@@ -42,18 +48,16 @@
|
|
|
42
48
|
"dependencies": {
|
|
43
49
|
"@modelcontextprotocol/sdk": "^1.17.2",
|
|
44
50
|
"@standard-schema/spec": "^1.0.0",
|
|
45
|
-
"culori": "^4.0.2",
|
|
46
51
|
"execa": "^9.6.0",
|
|
47
52
|
"file-type": "^21.0.0",
|
|
48
53
|
"fuse.js": "^7.1.0",
|
|
49
|
-
"mcp-proxy": "^
|
|
54
|
+
"mcp-proxy": "^6.5.1",
|
|
50
55
|
"strict-event-emitter-types": "^2.0.0",
|
|
51
|
-
"undici": "^
|
|
56
|
+
"undici": "^8.3.0",
|
|
52
57
|
"uri-templates": "^0.2.0",
|
|
53
58
|
"xsschema": "0.3.5",
|
|
54
59
|
"yargs": "^18.0.0",
|
|
55
|
-
"zod": "^
|
|
56
|
-
"zod-to-json-schema": "^3.24.6"
|
|
60
|
+
"zod": "^4.4.3"
|
|
57
61
|
},
|
|
58
62
|
"repository": {
|
|
59
63
|
"type": "git",
|
|
@@ -76,7 +80,7 @@
|
|
|
76
80
|
]
|
|
77
81
|
},
|
|
78
82
|
"devDependencies": {
|
|
79
|
-
"@eslint/js": "^
|
|
83
|
+
"@eslint/js": "^10.0.1",
|
|
80
84
|
"@modelcontextprotocol/inspector": "^0.16.2",
|
|
81
85
|
"@sebbo2002/semantic-release-jsr": "^3.0.1",
|
|
82
86
|
"@tsconfig/node22": "^22.0.2",
|
|
@@ -84,9 +88,9 @@
|
|
|
84
88
|
"@types/uri-templates": "^0.1.34",
|
|
85
89
|
"@types/yargs": "^17.0.33",
|
|
86
90
|
"@valibot/to-json-schema": "^1.3.0",
|
|
87
|
-
"@wong2/mcp-cli": "^
|
|
91
|
+
"@wong2/mcp-cli": "^2.0.0",
|
|
88
92
|
"arktype": "^2.1.20",
|
|
89
|
-
"eslint": "^
|
|
93
|
+
"eslint": "^10.4.0",
|
|
90
94
|
"eslint-config-prettier": "^10.1.8",
|
|
91
95
|
"eslint-plugin-perfectionist": "^4.15.0",
|
|
92
96
|
"eslint-plugin-prettier": "^5.5.4",
|
|
@@ -95,14 +99,14 @@
|
|
|
95
99
|
"jiti": "^2.5.1",
|
|
96
100
|
"jsr": "^0.13.5",
|
|
97
101
|
"prettier": "^3.6.2",
|
|
98
|
-
"semantic-release": "^
|
|
102
|
+
"semantic-release": "^25.0.3",
|
|
99
103
|
"tsup": "^8.5.0",
|
|
100
|
-
"typescript": "^
|
|
104
|
+
"typescript": "^6.0.3",
|
|
101
105
|
"typescript-eslint": "^8.39.0",
|
|
102
106
|
"valibot": "^1.1.0",
|
|
103
107
|
"vitepress": "^1.6.4",
|
|
104
108
|
"vitepress-plugin-mermaid": "^2.0.17",
|
|
105
|
-
"vitest": "^
|
|
109
|
+
"vitest": "^4.1.7"
|
|
106
110
|
},
|
|
107
111
|
"tsup": {
|
|
108
112
|
"entry": [
|