@xivdyetools/core 2.7.0 → 4.0.1
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/README.md +85 -67
- package/dist/blending/blending.d.ts +22 -0
- package/dist/blending/blending.d.ts.map +1 -0
- package/dist/blending/blending.js +129 -0
- package/dist/blending/blending.js.map +1 -0
- package/dist/blending/conversions.d.ts +53 -0
- package/dist/blending/conversions.d.ts.map +1 -0
- package/dist/blending/conversions.js +256 -0
- package/dist/blending/conversions.js.map +1 -0
- package/dist/blending/index.d.ts +8 -0
- package/dist/blending/index.d.ts.map +1 -0
- package/dist/blending/index.js +3 -0
- package/dist/blending/index.js.map +1 -0
- package/dist/blending/types.d.ts +36 -0
- package/dist/blending/types.d.ts.map +1 -0
- package/dist/blending/types.js +21 -0
- package/dist/blending/types.js.map +1 -0
- package/dist/config/band-calibration.d.ts +68 -0
- package/dist/config/band-calibration.d.ts.map +1 -0
- package/dist/config/band-calibration.js +196 -0
- package/dist/config/band-calibration.js.map +1 -0
- package/dist/config/band-vocabulary.d.ts +82 -0
- package/dist/config/band-vocabulary.d.ts.map +1 -0
- package/dist/config/band-vocabulary.js +117 -0
- package/dist/config/band-vocabulary.js.map +1 -0
- package/dist/config/consolidated-ids.js +2 -2
- package/dist/config/consolidated-ids.js.map +1 -1
- package/dist/config/dye-vocabulary.d.ts +45 -0
- package/dist/config/dye-vocabulary.d.ts.map +1 -0
- package/dist/config/dye-vocabulary.js +58 -0
- package/dist/config/dye-vocabulary.js.map +1 -0
- package/dist/config/facewear.d.ts +24 -0
- package/dist/config/facewear.d.ts.map +1 -0
- package/dist/config/facewear.js +35 -0
- package/dist/config/facewear.js.map +1 -0
- package/dist/config/learn-links.d.ts +70 -0
- package/dist/config/learn-links.d.ts.map +1 -0
- package/dist/config/learn-links.js +171 -0
- package/dist/config/learn-links.js.map +1 -0
- package/dist/config/product-links.d.ts +44 -0
- package/dist/config/product-links.d.ts.map +1 -0
- package/dist/config/product-links.js +44 -0
- package/dist/config/product-links.js.map +1 -0
- package/dist/constants/index.d.ts +14 -1
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +38 -22
- package/dist/constants/index.js.map +1 -1
- package/dist/data/character_colors/race_specific/hair_colors.json +1 -1
- package/dist/data/character_colors/race_specific/skin_colors.json +1 -1
- package/dist/data/dyes.json +1127 -0
- package/dist/data/facewear_colors.json +57 -0
- package/dist/data/locales/de.json +4 -50
- package/dist/data/locales/en.json +4 -50
- package/dist/data/locales/fr.json +4 -50
- package/dist/data/locales/ja.json +4 -50
- package/dist/data/locales/ko.json +4 -50
- package/dist/data/locales/zh.json +4 -50
- package/dist/data/presets.json +59 -301
- package/dist/index.d.ts +156 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +114 -10
- package/dist/index.js.map +1 -1
- package/dist/services/APIService.d.ts +7 -61
- package/dist/services/APIService.d.ts.map +1 -1
- package/dist/services/APIService.js +43 -154
- package/dist/services/APIService.js.map +1 -1
- package/dist/services/CharacterColorService.d.ts +4 -36
- package/dist/services/CharacterColorService.d.ts.map +1 -1
- package/dist/services/CharacterColorService.js +16 -68
- package/dist/services/CharacterColorService.js.map +1 -1
- package/dist/services/ColorService.d.ts +55 -68
- package/dist/services/ColorService.d.ts.map +1 -1
- package/dist/services/ColorService.js +86 -94
- package/dist/services/ColorService.js.map +1 -1
- package/dist/services/DyeService.d.ts +10 -103
- package/dist/services/DyeService.d.ts.map +1 -1
- package/dist/services/DyeService.js +13 -156
- package/dist/services/DyeService.js.map +1 -1
- package/dist/services/LocalizationService.d.ts +1 -33
- package/dist/services/LocalizationService.d.ts.map +1 -1
- package/dist/services/LocalizationService.js +0 -44
- package/dist/services/LocalizationService.js.map +1 -1
- package/dist/services/PaletteService.d.ts +8 -9
- package/dist/services/PaletteService.d.ts.map +1 -1
- package/dist/services/PaletteService.js +2 -21
- package/dist/services/PaletteService.js.map +1 -1
- package/dist/services/PresetService.d.ts +2 -34
- package/dist/services/PresetService.d.ts.map +1 -1
- package/dist/services/PresetService.js +12 -59
- package/dist/services/PresetService.js.map +1 -1
- package/dist/services/chara/chara-models.d.ts +68 -0
- package/dist/services/chara/chara-models.d.ts.map +1 -0
- package/dist/services/chara/chara-models.js +87 -0
- package/dist/services/chara/chara-models.js.map +1 -0
- package/dist/services/chara/chara-parser.d.ts +95 -0
- package/dist/services/chara/chara-parser.d.ts.map +1 -0
- package/dist/services/chara/chara-parser.js +299 -0
- package/dist/services/chara/chara-parser.js.map +1 -0
- package/dist/services/chara/chara-resolver.d.ts +103 -0
- package/dist/services/chara/chara-resolver.d.ts.map +1 -0
- package/dist/services/chara/chara-resolver.js +233 -0
- package/dist/services/chara/chara-resolver.js.map +1 -0
- package/dist/services/color/ColorConverter.d.ts +107 -35
- package/dist/services/color/ColorConverter.d.ts.map +1 -1
- package/dist/services/color/ColorConverter.js +159 -48
- package/dist/services/color/ColorConverter.js.map +1 -1
- package/dist/services/color/ColorManipulator.d.ts +11 -0
- package/dist/services/color/ColorManipulator.d.ts.map +1 -1
- package/dist/services/color/ColorManipulator.js +14 -0
- package/dist/services/color/ColorManipulator.js.map +1 -1
- package/dist/services/color/ColorblindnessSimulator.d.ts +17 -0
- package/dist/services/color/ColorblindnessSimulator.d.ts.map +1 -1
- package/dist/services/color/ColorblindnessSimulator.js +53 -1
- package/dist/services/color/ColorblindnessSimulator.js.map +1 -1
- package/dist/services/color/SpectralMixer.d.ts +0 -34
- package/dist/services/color/SpectralMixer.d.ts.map +1 -1
- package/dist/services/color/SpectralMixer.js +0 -73
- package/dist/services/color/SpectralMixer.js.map +1 -1
- package/dist/services/dye/DyeDatabase.d.ts +0 -21
- package/dist/services/dye/DyeDatabase.d.ts.map +1 -1
- package/dist/services/dye/DyeDatabase.js +78 -103
- package/dist/services/dye/DyeDatabase.js.map +1 -1
- package/dist/services/dye/DyeSearch.d.ts +17 -31
- package/dist/services/dye/DyeSearch.d.ts.map +1 -1
- package/dist/services/dye/DyeSearch.js +31 -67
- package/dist/services/dye/DyeSearch.js.map +1 -1
- package/dist/services/dye/HarmonyGenerator.d.ts +11 -18
- package/dist/services/dye/HarmonyGenerator.d.ts.map +1 -1
- package/dist/services/dye/HarmonyGenerator.js +24 -35
- package/dist/services/dye/HarmonyGenerator.js.map +1 -1
- package/dist/services/localization/LocaleLoader.d.ts.map +1 -1
- package/dist/services/localization/LocaleLoader.js +0 -1
- package/dist/services/localization/LocaleLoader.js.map +1 -1
- package/dist/services/localization/TranslationProvider.d.ts +1 -42
- package/dist/services/localization/TranslationProvider.d.ts.map +1 -1
- package/dist/services/localization/TranslationProvider.js +4 -82
- package/dist/services/localization/TranslationProvider.js.map +1 -1
- package/dist/types/index.d.ts +39 -52
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +50 -10
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +35 -122
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +45 -422
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/kd-tree.d.ts +0 -4
- package/dist/utils/kd-tree.d.ts.map +1 -1
- package/dist/utils/kd-tree.js +0 -6
- package/dist/utils/kd-tree.js.map +1 -1
- package/package.json +19 -10
- package/dist/data/character_colors/index.json +0 -40
- package/dist/data/colors_xiv.json +0 -3538
- package/dist/version.d.ts +0 -11
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -11
- package/dist/version.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chara-resolver.js","sourceRoot":"","sources":["../../../src/services/chara/chara-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,15 +3,33 @@
|
|
|
3
3
|
* Per R-4: Focused class for color format conversions
|
|
4
4
|
* Handles conversions between hex, RGB, and HSV color formats
|
|
5
5
|
*/
|
|
6
|
-
import type { RGB, HSV, HexColor, LAB, OKLAB, OKLCH, LCH, HSL } from '@xivdyetools/types';
|
|
6
|
+
import type { RGB, HSV, HexColor, LAB, OKLAB, OKLCH, LCH, HSL, CMYK } from '@xivdyetools/types';
|
|
7
7
|
/**
|
|
8
8
|
* DeltaE formula for color difference calculations
|
|
9
9
|
* - cie76: Simple Euclidean distance in LAB space (fast)
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
12
|
-
* -
|
|
10
|
+
* - ciede2000: CIEDE2000 formula (perceptually accurate, industry standard)
|
|
11
|
+
* - cie2000: legacy alias for `'ciede2000'` — see {@link normalizeDeltaEFormula}
|
|
12
|
+
* - oklab: OKLAB Euclidean distance (modern, simpler than CIEDE2000, CSS standard)
|
|
13
|
+
*
|
|
14
|
+
* `'ciede2000'` is the canonical spelling: it is the one `MatchingMethod` uses,
|
|
15
|
+
* so a `MatchingMethod` can be handed straight to {@link ColorConverter.getDeltaE}
|
|
16
|
+
* with no translation switch in between (DEAD-037, 2026-08-18 audit).
|
|
17
|
+
*/
|
|
18
|
+
export type DeltaEFormula = 'cie76' | 'cie2000' | 'ciede2000' | 'oklab';
|
|
19
|
+
/**
|
|
20
|
+
* The canonical `DeltaEFormula` spellings, after alias folding.
|
|
13
21
|
*/
|
|
14
|
-
export type
|
|
22
|
+
export type CanonicalDeltaEFormula = Exclude<DeltaEFormula, 'cie2000'>;
|
|
23
|
+
/**
|
|
24
|
+
* Fold the legacy `'cie2000'` spelling onto the canonical `'ciede2000'`.
|
|
25
|
+
*
|
|
26
|
+
* Both name the same CIEDE2000 math and always have; only the spelling ever
|
|
27
|
+
* differed (`DeltaEFormula` said `'cie2000'`, `MatchingMethod` said
|
|
28
|
+
* `'ciede2000'`). This is the single point where that is reconciled — call it
|
|
29
|
+
* at any entry point that accepts a caller-supplied `DeltaEFormula`, never
|
|
30
|
+
* re-derive the mapping with another switch.
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeDeltaEFormula(formula: DeltaEFormula): CanonicalDeltaEFormula;
|
|
15
33
|
/**
|
|
16
34
|
* Configuration for ColorConverter caches
|
|
17
35
|
*/
|
|
@@ -161,6 +179,36 @@ export declare class ColorConverter {
|
|
|
161
179
|
* Static method: Calculate color distance using default instance
|
|
162
180
|
*/
|
|
163
181
|
static getColorDistance(hex1: string, hex2: string): number;
|
|
182
|
+
/**
|
|
183
|
+
* Calculate "redmean" weighted RGB distance between two colors.
|
|
184
|
+
*
|
|
185
|
+
* A low-cost approximation of perceptual distance that weights the RGB
|
|
186
|
+
* channels by the mean red level (https://en.wikipedia.org/wiki/Color_difference#sRGB):
|
|
187
|
+
* r̄ = (R1 + R2) / 2
|
|
188
|
+
* ΔC = √((2 + r̄/256)·ΔR² + 4·ΔG² + (2 + (255 − r̄)/256)·ΔB²)
|
|
189
|
+
*
|
|
190
|
+
* Range: 0 for identical colors, ~765 for white vs black.
|
|
191
|
+
*/
|
|
192
|
+
getRedmeanDistance(hex1: string, hex2: string): number;
|
|
193
|
+
/**
|
|
194
|
+
* Static method: Calculate redmean distance using default instance
|
|
195
|
+
*/
|
|
196
|
+
static getRedmeanDistance(hex1: string, hex2: string): number;
|
|
197
|
+
/**
|
|
198
|
+
* Distinguishability percentage between two colors.
|
|
199
|
+
*
|
|
200
|
+
* This is RGB Euclidean distance rescaled to 0-100:
|
|
201
|
+
* `round(distance / 441.67 × 100)`. It is NOT a separate metric — ranks are
|
|
202
|
+
* always identical to RGB distance, and integer rounding creates ties, so any
|
|
203
|
+
* ordering driven by this value needs a sort fallback (and ties should be
|
|
204
|
+
* badged as ties, never presented as a single answer). Kept for continuity
|
|
205
|
+
* with the Accessibility readout. Not a WCAG standard.
|
|
206
|
+
*/
|
|
207
|
+
getDistinguishabilityPercent(hex1: string, hex2: string): number;
|
|
208
|
+
/**
|
|
209
|
+
* Static method: Distinguishability percentage using default instance
|
|
210
|
+
*/
|
|
211
|
+
static getDistinguishabilityPercent(hex1: string, hex2: string): number;
|
|
164
212
|
/**
|
|
165
213
|
* Convert RGB to CIE LAB color space
|
|
166
214
|
* Per P-1: Cached for performance
|
|
@@ -225,9 +273,9 @@ export declare class ColorConverter {
|
|
|
225
273
|
*
|
|
226
274
|
* Available formulas:
|
|
227
275
|
* - cie76: LAB Euclidean (fast, fair accuracy)
|
|
228
|
-
* -
|
|
229
|
-
*
|
|
230
|
-
* -
|
|
276
|
+
* - ciede2000: CIEDE2000 (industry standard, accurate); `'cie2000'` is a
|
|
277
|
+
* legacy alias for it and produces an identical value
|
|
278
|
+
* - oklab: OKLAB Euclidean (modern, simpler than CIEDE2000, CSS standard)
|
|
231
279
|
*
|
|
232
280
|
* @param hex1 First hex color
|
|
233
281
|
* @param hex2 Second hex color
|
|
@@ -260,33 +308,6 @@ export declare class ColorConverter {
|
|
|
260
308
|
* Static method: Calculate OKLAB Euclidean distance using default instance
|
|
261
309
|
*/
|
|
262
310
|
static getDeltaE_Oklab(hex1: string, hex2: string): number;
|
|
263
|
-
/**
|
|
264
|
-
* Calculate color difference using HyAB (Hybrid) algorithm.
|
|
265
|
-
*
|
|
266
|
-
* HyAB uses taxicab distance for lightness and Euclidean for chroma.
|
|
267
|
-
* Research shows it outperforms both Euclidean AND CIEDE2000 for large
|
|
268
|
-
* color differences (>10 units), making it ideal for palette matching.
|
|
269
|
-
*
|
|
270
|
-
* Formula: ΔE_HyAB = |L₂ - L₁| + √[(a₂-a₁)² + (b₂-b₁)²]
|
|
271
|
-
*
|
|
272
|
-
* Reference: Abasi, Tehran & Fairchild (2019) -
|
|
273
|
-
* "Distance metrics for very large color differences"
|
|
274
|
-
*
|
|
275
|
-
* @param hex1 First color in hex format
|
|
276
|
-
* @param hex2 Second color in hex format
|
|
277
|
-
* @param kL Lightness weight (default 1.0). Higher = prioritize lightness matching.
|
|
278
|
-
* Use kL > 1 for visibility-critical matching (armor, UI).
|
|
279
|
-
* Use kL < 1 to tolerate brightness differences (find vibrant alternatives).
|
|
280
|
-
* @returns Distance value (0 = identical, scale ~0-1.5 for typical colors)
|
|
281
|
-
*
|
|
282
|
-
* @example getDeltaE_HyAB("#FF0000", "#800000") -> ~0.32
|
|
283
|
-
* @example getDeltaE_HyAB("#FF0000", "#800000", 2.0) -> higher (emphasize brightness)
|
|
284
|
-
*/
|
|
285
|
-
getDeltaE_HyAB(hex1: string, hex2: string, kL?: number): number;
|
|
286
|
-
/**
|
|
287
|
-
* Static method: Calculate HyAB distance using default instance
|
|
288
|
-
*/
|
|
289
|
-
static getDeltaE_HyAB(hex1: string, hex2: string, kL?: number): number;
|
|
290
311
|
/**
|
|
291
312
|
* Calculate color difference using OKLCH with customizable L/C/H weights.
|
|
292
313
|
*
|
|
@@ -520,5 +541,56 @@ export declare class ColorConverter {
|
|
|
520
541
|
* Static method: Convert HSL to hex using default instance
|
|
521
542
|
*/
|
|
522
543
|
static hslToHex(h: number, s: number, l: number): HexColor;
|
|
544
|
+
/**
|
|
545
|
+
* Convert RGB to CMYK (Cyan, Magenta, Yellow, Key/Black)
|
|
546
|
+
*
|
|
547
|
+
* Naive device-independent conversion (no ICC profile) — suitable for
|
|
548
|
+
* display/reference values shown alongside HEX/RGB/HSV, not for print
|
|
549
|
+
* production.
|
|
550
|
+
*
|
|
551
|
+
* @param r Red component (0-255)
|
|
552
|
+
* @param g Green component (0-255)
|
|
553
|
+
* @param b Blue component (0-255)
|
|
554
|
+
* @returns CMYK color with c/m/y/k as 0-100 percentages
|
|
555
|
+
*
|
|
556
|
+
* @example rgbToCmyk(255, 0, 0) -> { c: 0, m: 100, y: 100, k: 0 }
|
|
557
|
+
*/
|
|
558
|
+
rgbToCmyk(r: number, g: number, b: number): CMYK;
|
|
559
|
+
/**
|
|
560
|
+
* Static method: Convert RGB to CMYK using default instance
|
|
561
|
+
*/
|
|
562
|
+
static rgbToCmyk(r: number, g: number, b: number): CMYK;
|
|
563
|
+
/**
|
|
564
|
+
* Convert CMYK to RGB
|
|
565
|
+
*
|
|
566
|
+
* @param c Cyan (0-100 percent)
|
|
567
|
+
* @param m Magenta (0-100 percent)
|
|
568
|
+
* @param y Yellow (0-100 percent)
|
|
569
|
+
* @param k Key/Black (0-100 percent)
|
|
570
|
+
* @returns RGB color with values 0-255
|
|
571
|
+
*
|
|
572
|
+
* @example cmykToRgb(0, 100, 100, 0) -> { r: 255, g: 0, b: 0 }
|
|
573
|
+
*/
|
|
574
|
+
cmykToRgb(c: number, m: number, y: number, k: number): RGB;
|
|
575
|
+
/**
|
|
576
|
+
* Static method: Convert CMYK to RGB using default instance
|
|
577
|
+
*/
|
|
578
|
+
static cmykToRgb(c: number, m: number, y: number, k: number): RGB;
|
|
579
|
+
/**
|
|
580
|
+
* Convert hex color to CMYK
|
|
581
|
+
*/
|
|
582
|
+
hexToCmyk(hex: string): CMYK;
|
|
583
|
+
/**
|
|
584
|
+
* Static method: Convert hex to CMYK using default instance
|
|
585
|
+
*/
|
|
586
|
+
static hexToCmyk(hex: string): CMYK;
|
|
587
|
+
/**
|
|
588
|
+
* Convert CMYK to hex color
|
|
589
|
+
*/
|
|
590
|
+
cmykToHex(c: number, m: number, y: number, k: number): HexColor;
|
|
591
|
+
/**
|
|
592
|
+
* Static method: Convert CMYK to hex using default instance
|
|
593
|
+
*/
|
|
594
|
+
static cmykToHex(c: number, m: number, y: number, k: number): HexColor;
|
|
523
595
|
}
|
|
524
596
|
//# sourceMappingURL=ColorConverter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorConverter.d.ts","sourceRoot":"","sources":["../../../src/services/color/ColorConverter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ColorConverter.d.ts","sourceRoot":"","sources":["../../../src/services/color/ColorConverter.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,20 @@
|
|
|
4
4
|
* Handles conversions between hex, RGB, and HSV color formats
|
|
5
5
|
*/
|
|
6
6
|
import { createHexColor, ErrorCode, AppError } from '@xivdyetools/types';
|
|
7
|
-
import { RGB_MIN, RGB_MAX, HUE_MAX } from '../../constants/index.js';
|
|
7
|
+
import { RGB_MIN, RGB_MAX, HUE_MAX, COLOR_DISTANCE_MAX } from '../../constants/index.js';
|
|
8
8
|
import { clamp, round, isValidHexColor, isValidRGB, isValidHSV, LRUCache, } from '../../utils/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Fold the legacy `'cie2000'` spelling onto the canonical `'ciede2000'`.
|
|
11
|
+
*
|
|
12
|
+
* Both name the same CIEDE2000 math and always have; only the spelling ever
|
|
13
|
+
* differed (`DeltaEFormula` said `'cie2000'`, `MatchingMethod` said
|
|
14
|
+
* `'ciede2000'`). This is the single point where that is reconciled — call it
|
|
15
|
+
* at any entry point that accepts a caller-supplied `DeltaEFormula`, never
|
|
16
|
+
* re-derive the mapping with another switch.
|
|
17
|
+
*/
|
|
18
|
+
export function normalizeDeltaEFormula(formula) {
|
|
19
|
+
return formula === 'cie2000' ? 'ciede2000' : formula;
|
|
20
|
+
}
|
|
9
21
|
/**
|
|
10
22
|
* Color format converter with LRU caching
|
|
11
23
|
* Per R-4: Single Responsibility - format conversions only
|
|
@@ -362,6 +374,50 @@ export class ColorConverter {
|
|
|
362
374
|
static getColorDistance(hex1, hex2) {
|
|
363
375
|
return this.getDefault().getColorDistance(hex1, hex2);
|
|
364
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* Calculate "redmean" weighted RGB distance between two colors.
|
|
379
|
+
*
|
|
380
|
+
* A low-cost approximation of perceptual distance that weights the RGB
|
|
381
|
+
* channels by the mean red level (https://en.wikipedia.org/wiki/Color_difference#sRGB):
|
|
382
|
+
* r̄ = (R1 + R2) / 2
|
|
383
|
+
* ΔC = √((2 + r̄/256)·ΔR² + 4·ΔG² + (2 + (255 − r̄)/256)·ΔB²)
|
|
384
|
+
*
|
|
385
|
+
* Range: 0 for identical colors, ~765 for white vs black.
|
|
386
|
+
*/
|
|
387
|
+
getRedmeanDistance(hex1, hex2) {
|
|
388
|
+
const rgb1 = this.hexToRgb(hex1);
|
|
389
|
+
const rgb2 = this.hexToRgb(hex2);
|
|
390
|
+
const rMean = (rgb1.r + rgb2.r) / 2;
|
|
391
|
+
const dr = rgb1.r - rgb2.r;
|
|
392
|
+
const dg = rgb1.g - rgb2.g;
|
|
393
|
+
const db = rgb1.b - rgb2.b;
|
|
394
|
+
return Math.sqrt((2 + rMean / 256) * dr * dr + 4 * dg * dg + (2 + (255 - rMean) / 256) * db * db);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Static method: Calculate redmean distance using default instance
|
|
398
|
+
*/
|
|
399
|
+
static getRedmeanDistance(hex1, hex2) {
|
|
400
|
+
return this.getDefault().getRedmeanDistance(hex1, hex2);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Distinguishability percentage between two colors.
|
|
404
|
+
*
|
|
405
|
+
* This is RGB Euclidean distance rescaled to 0-100:
|
|
406
|
+
* `round(distance / 441.67 × 100)`. It is NOT a separate metric — ranks are
|
|
407
|
+
* always identical to RGB distance, and integer rounding creates ties, so any
|
|
408
|
+
* ordering driven by this value needs a sort fallback (and ties should be
|
|
409
|
+
* badged as ties, never presented as a single answer). Kept for continuity
|
|
410
|
+
* with the Accessibility readout. Not a WCAG standard.
|
|
411
|
+
*/
|
|
412
|
+
getDistinguishabilityPercent(hex1, hex2) {
|
|
413
|
+
return Math.round((this.getColorDistance(hex1, hex2) / COLOR_DISTANCE_MAX) * 100);
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Static method: Distinguishability percentage using default instance
|
|
417
|
+
*/
|
|
418
|
+
static getDistinguishabilityPercent(hex1, hex2) {
|
|
419
|
+
return this.getDefault().getDistinguishabilityPercent(hex1, hex2);
|
|
420
|
+
}
|
|
365
421
|
// ============================================================================
|
|
366
422
|
// LAB Color Space Conversion
|
|
367
423
|
// ============================================================================
|
|
@@ -625,9 +681,9 @@ export class ColorConverter {
|
|
|
625
681
|
*
|
|
626
682
|
* Available formulas:
|
|
627
683
|
* - cie76: LAB Euclidean (fast, fair accuracy)
|
|
628
|
-
* -
|
|
629
|
-
*
|
|
630
|
-
* -
|
|
684
|
+
* - ciede2000: CIEDE2000 (industry standard, accurate); `'cie2000'` is a
|
|
685
|
+
* legacy alias for it and produces an identical value
|
|
686
|
+
* - oklab: OKLAB Euclidean (modern, simpler than CIEDE2000, CSS standard)
|
|
631
687
|
*
|
|
632
688
|
* @param hex1 First hex color
|
|
633
689
|
* @param hex2 Second hex color
|
|
@@ -635,16 +691,14 @@ export class ColorConverter {
|
|
|
635
691
|
* @returns DeltaE value (scale varies by formula)
|
|
636
692
|
*/
|
|
637
693
|
getDeltaE(hex1, hex2, formula = 'cie76') {
|
|
638
|
-
switch (formula) {
|
|
639
|
-
case '
|
|
694
|
+
switch (normalizeDeltaEFormula(formula)) {
|
|
695
|
+
case 'ciede2000': {
|
|
640
696
|
const lab1 = this.hexToLab(hex1);
|
|
641
697
|
const lab2 = this.hexToLab(hex2);
|
|
642
698
|
return this.getDeltaE2000(lab1, lab2);
|
|
643
699
|
}
|
|
644
700
|
case 'oklab':
|
|
645
701
|
return this.getDeltaE_Oklab(hex1, hex2);
|
|
646
|
-
case 'hyab':
|
|
647
|
-
return this.getDeltaE_HyAB(hex1, hex2);
|
|
648
702
|
case 'cie76':
|
|
649
703
|
default: {
|
|
650
704
|
const lab1 = this.hexToLab(hex1);
|
|
@@ -692,45 +746,6 @@ export class ColorConverter {
|
|
|
692
746
|
static getDeltaE_Oklab(hex1, hex2) {
|
|
693
747
|
return this.getDefault().getDeltaE_Oklab(hex1, hex2);
|
|
694
748
|
}
|
|
695
|
-
/**
|
|
696
|
-
* Calculate color difference using HyAB (Hybrid) algorithm.
|
|
697
|
-
*
|
|
698
|
-
* HyAB uses taxicab distance for lightness and Euclidean for chroma.
|
|
699
|
-
* Research shows it outperforms both Euclidean AND CIEDE2000 for large
|
|
700
|
-
* color differences (>10 units), making it ideal for palette matching.
|
|
701
|
-
*
|
|
702
|
-
* Formula: ΔE_HyAB = |L₂ - L₁| + √[(a₂-a₁)² + (b₂-b₁)²]
|
|
703
|
-
*
|
|
704
|
-
* Reference: Abasi, Tehran & Fairchild (2019) -
|
|
705
|
-
* "Distance metrics for very large color differences"
|
|
706
|
-
*
|
|
707
|
-
* @param hex1 First color in hex format
|
|
708
|
-
* @param hex2 Second color in hex format
|
|
709
|
-
* @param kL Lightness weight (default 1.0). Higher = prioritize lightness matching.
|
|
710
|
-
* Use kL > 1 for visibility-critical matching (armor, UI).
|
|
711
|
-
* Use kL < 1 to tolerate brightness differences (find vibrant alternatives).
|
|
712
|
-
* @returns Distance value (0 = identical, scale ~0-1.5 for typical colors)
|
|
713
|
-
*
|
|
714
|
-
* @example getDeltaE_HyAB("#FF0000", "#800000") -> ~0.32
|
|
715
|
-
* @example getDeltaE_HyAB("#FF0000", "#800000", 2.0) -> higher (emphasize brightness)
|
|
716
|
-
*/
|
|
717
|
-
getDeltaE_HyAB(hex1, hex2, kL = 1.0) {
|
|
718
|
-
const lab1 = this.hexToOklab(hex1);
|
|
719
|
-
const lab2 = this.hexToOklab(hex2);
|
|
720
|
-
// Taxicab distance for lightness (weighted)
|
|
721
|
-
const dL = Math.abs(lab2.L - lab1.L) * kL;
|
|
722
|
-
// Euclidean distance for chroma plane
|
|
723
|
-
const da = lab2.a - lab1.a;
|
|
724
|
-
const db = lab2.b - lab1.b;
|
|
725
|
-
const dChroma = Math.sqrt(da * da + db * db);
|
|
726
|
-
return dL + dChroma;
|
|
727
|
-
}
|
|
728
|
-
/**
|
|
729
|
-
* Static method: Calculate HyAB distance using default instance
|
|
730
|
-
*/
|
|
731
|
-
static getDeltaE_HyAB(hex1, hex2, kL = 1.0) {
|
|
732
|
-
return this.getDefault().getDeltaE_HyAB(hex1, hex2, kL);
|
|
733
|
-
}
|
|
734
749
|
/**
|
|
735
750
|
* Calculate color difference using OKLCH with customizable L/C/H weights.
|
|
736
751
|
*
|
|
@@ -790,7 +805,7 @@ export class ColorConverter {
|
|
|
790
805
|
* @internal
|
|
791
806
|
*/
|
|
792
807
|
linearToSrgb(c) {
|
|
793
|
-
const clamped =
|
|
808
|
+
const clamped = clamp(c, 0, 1);
|
|
794
809
|
const srgb = clamped <= 0.0031308 ? clamped * 12.92 : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;
|
|
795
810
|
return Math.round(srgb * 255);
|
|
796
811
|
}
|
|
@@ -1232,5 +1247,101 @@ export class ColorConverter {
|
|
|
1232
1247
|
static hslToHex(h, s, l) {
|
|
1233
1248
|
return this.getDefault().hslToHex(h, s, l);
|
|
1234
1249
|
}
|
|
1250
|
+
/**
|
|
1251
|
+
* Convert RGB to CMYK (Cyan, Magenta, Yellow, Key/Black)
|
|
1252
|
+
*
|
|
1253
|
+
* Naive device-independent conversion (no ICC profile) — suitable for
|
|
1254
|
+
* display/reference values shown alongside HEX/RGB/HSV, not for print
|
|
1255
|
+
* production.
|
|
1256
|
+
*
|
|
1257
|
+
* @param r Red component (0-255)
|
|
1258
|
+
* @param g Green component (0-255)
|
|
1259
|
+
* @param b Blue component (0-255)
|
|
1260
|
+
* @returns CMYK color with c/m/y/k as 0-100 percentages
|
|
1261
|
+
*
|
|
1262
|
+
* @example rgbToCmyk(255, 0, 0) -> { c: 0, m: 100, y: 100, k: 0 }
|
|
1263
|
+
*/
|
|
1264
|
+
rgbToCmyk(r, g, b) {
|
|
1265
|
+
if (!isValidRGB(r, g, b)) {
|
|
1266
|
+
throw new AppError(ErrorCode.INVALID_RGB_VALUE, `Invalid RGB values: r=${r}, g=${g}, b=${b}. Values must be 0-255`, 'error');
|
|
1267
|
+
}
|
|
1268
|
+
const rNorm = r / 255;
|
|
1269
|
+
const gNorm = g / 255;
|
|
1270
|
+
const bNorm = b / 255;
|
|
1271
|
+
const k = 1 - Math.max(rNorm, gNorm, bNorm);
|
|
1272
|
+
// Pure black: avoid division by zero
|
|
1273
|
+
if (k === 1) {
|
|
1274
|
+
return { c: 0, m: 0, y: 0, k: 100 };
|
|
1275
|
+
}
|
|
1276
|
+
const c = (1 - rNorm - k) / (1 - k);
|
|
1277
|
+
const m = (1 - gNorm - k) / (1 - k);
|
|
1278
|
+
const y = (1 - bNorm - k) / (1 - k);
|
|
1279
|
+
return {
|
|
1280
|
+
c: round(c * 100, 2),
|
|
1281
|
+
m: round(m * 100, 2),
|
|
1282
|
+
y: round(y * 100, 2),
|
|
1283
|
+
k: round(k * 100, 2),
|
|
1284
|
+
};
|
|
1285
|
+
}
|
|
1286
|
+
/**
|
|
1287
|
+
* Static method: Convert RGB to CMYK using default instance
|
|
1288
|
+
*/
|
|
1289
|
+
static rgbToCmyk(r, g, b) {
|
|
1290
|
+
return this.getDefault().rgbToCmyk(r, g, b);
|
|
1291
|
+
}
|
|
1292
|
+
/**
|
|
1293
|
+
* Convert CMYK to RGB
|
|
1294
|
+
*
|
|
1295
|
+
* @param c Cyan (0-100 percent)
|
|
1296
|
+
* @param m Magenta (0-100 percent)
|
|
1297
|
+
* @param y Yellow (0-100 percent)
|
|
1298
|
+
* @param k Key/Black (0-100 percent)
|
|
1299
|
+
* @returns RGB color with values 0-255
|
|
1300
|
+
*
|
|
1301
|
+
* @example cmykToRgb(0, 100, 100, 0) -> { r: 255, g: 0, b: 0 }
|
|
1302
|
+
*/
|
|
1303
|
+
cmykToRgb(c, m, y, k) {
|
|
1304
|
+
const cNorm = clamp(c, 0, 100) / 100;
|
|
1305
|
+
const mNorm = clamp(m, 0, 100) / 100;
|
|
1306
|
+
const yNorm = clamp(y, 0, 100) / 100;
|
|
1307
|
+
const kNorm = clamp(k, 0, 100) / 100;
|
|
1308
|
+
return {
|
|
1309
|
+
r: clamp(Math.round(255 * (1 - cNorm) * (1 - kNorm)), RGB_MIN, RGB_MAX),
|
|
1310
|
+
g: clamp(Math.round(255 * (1 - mNorm) * (1 - kNorm)), RGB_MIN, RGB_MAX),
|
|
1311
|
+
b: clamp(Math.round(255 * (1 - yNorm) * (1 - kNorm)), RGB_MIN, RGB_MAX),
|
|
1312
|
+
};
|
|
1313
|
+
}
|
|
1314
|
+
/**
|
|
1315
|
+
* Static method: Convert CMYK to RGB using default instance
|
|
1316
|
+
*/
|
|
1317
|
+
static cmykToRgb(c, m, y, k) {
|
|
1318
|
+
return this.getDefault().cmykToRgb(c, m, y, k);
|
|
1319
|
+
}
|
|
1320
|
+
/**
|
|
1321
|
+
* Convert hex color to CMYK
|
|
1322
|
+
*/
|
|
1323
|
+
hexToCmyk(hex) {
|
|
1324
|
+
const rgb = this.hexToRgb(hex);
|
|
1325
|
+
return this.rgbToCmyk(rgb.r, rgb.g, rgb.b);
|
|
1326
|
+
}
|
|
1327
|
+
/**
|
|
1328
|
+
* Static method: Convert hex to CMYK using default instance
|
|
1329
|
+
*/
|
|
1330
|
+
static hexToCmyk(hex) {
|
|
1331
|
+
return this.getDefault().hexToCmyk(hex);
|
|
1332
|
+
}
|
|
1333
|
+
/**
|
|
1334
|
+
* Convert CMYK to hex color
|
|
1335
|
+
*/
|
|
1336
|
+
cmykToHex(c, m, y, k) {
|
|
1337
|
+
const rgb = this.cmykToRgb(c, m, y, k);
|
|
1338
|
+
return this.rgbToHex(rgb.r, rgb.g, rgb.b);
|
|
1339
|
+
}
|
|
1340
|
+
/**
|
|
1341
|
+
* Static method: Convert CMYK to hex using default instance
|
|
1342
|
+
*/
|
|
1343
|
+
static cmykToHex(c, m, y, k) {
|
|
1344
|
+
return this.getDefault().cmykToHex(c, m, y, k);
|
|
1345
|
+
}
|
|
1235
1346
|
}
|
|
1236
1347
|
//# sourceMappingURL=ColorConverter.js.map
|