omni-color 0.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/LICENSE +7 -0
- package/README.md +1042 -0
- package/dist/__test__/color-interop.test.d.ts +1 -0
- package/dist/__test__/color-interop.test.js +82 -0
- package/dist/__test__/comparison_culori.test.d.ts +1 -0
- package/dist/__test__/comparison_culori.test.js +169 -0
- package/dist/__test__/interop-chroma.test.d.ts +1 -0
- package/dist/__test__/interop-chroma.test.js +676 -0
- package/dist/__test__/interop-tinycolor.test.d.ts +1 -0
- package/dist/__test__/interop-tinycolor.test.js +499 -0
- package/dist/color/__test__/baseColor.test.d.ts +2 -0
- package/dist/color/__test__/baseColor.test.d.ts.map +1 -0
- package/dist/color/__test__/baseColor.test.js +34 -0
- package/dist/color/__test__/baseColor.test.js.map +1 -0
- package/dist/color/__test__/blank.d.ts +1 -0
- package/dist/color/__test__/blank.js +3 -0
- package/dist/color/__test__/color.test.d.ts +1 -0
- package/dist/color/__test__/color.test.js +1073 -0
- package/dist/color/__test__/colorSpaces.test.d.ts +1 -0
- package/dist/color/__test__/colorSpaces.test.js +69 -0
- package/dist/color/__test__/combinations.test.d.ts +1 -0
- package/dist/color/__test__/combinations.test.js +665 -0
- package/dist/color/__test__/conversions.test.d.ts +1 -0
- package/dist/color/__test__/conversions.test.js +719 -0
- package/dist/color/__test__/deltaE.test.d.ts +1 -0
- package/dist/color/__test__/deltaE.test.js +120 -0
- package/dist/color/__test__/formats.test.d.ts +1 -0
- package/dist/color/__test__/formats.test.js +514 -0
- package/dist/color/__test__/gradients.test.d.ts +1 -0
- package/dist/color/__test__/gradients.test.js +414 -0
- package/dist/color/__test__/harmonies.test.d.ts +1 -0
- package/dist/color/__test__/harmonies.test.js +676 -0
- package/dist/color/__test__/manipulations.test.d.ts +1 -0
- package/dist/color/__test__/manipulations.test.js +264 -0
- package/dist/color/__test__/names.test.d.ts +1 -0
- package/dist/color/__test__/names.test.js +67 -0
- package/dist/color/__test__/parse.test.d.ts +1 -0
- package/dist/color/__test__/parse.test.js +256 -0
- package/dist/color/__test__/random.test.d.ts +1 -0
- package/dist/color/__test__/random.test.js +262 -0
- package/dist/color/__test__/readability.test.d.ts +1 -0
- package/dist/color/__test__/readability.test.js +2596 -0
- package/dist/color/__test__/srgb.test.d.ts +1 -0
- package/dist/color/__test__/srgb.test.js +43 -0
- package/dist/color/__test__/swatch.test.d.ts +1 -0
- package/dist/color/__test__/swatch.test.js +267 -0
- package/dist/color/__test__/temperature.test.d.ts +1 -0
- package/dist/color/__test__/temperature.test.js +223 -0
- package/dist/color/__test__/utils.test.d.ts +1 -0
- package/dist/color/__test__/utils.test.js +409 -0
- package/dist/color/__test__/validations.test.d.ts +1 -0
- package/dist/color/__test__/validations.test.js +239 -0
- package/dist/color/color.constants.d.ts +4 -0
- package/dist/color/color.constants.d.ts.map +1 -0
- package/dist/color/color.constants.js +152 -0
- package/dist/color/color.constants.js.map +1 -0
- package/dist/color/color.consts.d.ts +4 -0
- package/dist/color/color.consts.js +152 -0
- package/dist/color/color.d.ts +788 -0
- package/dist/color/color.d.ts.map +1 -0
- package/dist/color/color.helpers.d.ts +6 -0
- package/dist/color/color.helpers.js +4 -0
- package/dist/color/color.js +919 -0
- package/dist/color/color.js.map +1 -0
- package/dist/color/colorSpaces.d.ts +15 -0
- package/dist/color/colorSpaces.js +127 -0
- package/dist/color/combinations.d.ts +45 -0
- package/dist/color/combinations.js +562 -0
- package/dist/color/conversions.d.ts +16 -0
- package/dist/color/conversions.d.ts.map +1 -0
- package/dist/color/conversions.js +705 -0
- package/dist/color/conversions.js.map +1 -0
- package/dist/color/deltaE.d.ts +59 -0
- package/dist/color/deltaE.js +110 -0
- package/dist/color/formats.d.ts +128 -0
- package/dist/color/formats.d.ts.map +1 -0
- package/dist/color/formats.js +153 -0
- package/dist/color/formats.js.map +1 -0
- package/dist/color/gradients.d.ts +49 -0
- package/dist/color/gradients.js +672 -0
- package/dist/color/harmonies.d.ts +18 -0
- package/dist/color/harmonies.js +128 -0
- package/dist/color/manipulations.d.ts +29 -0
- package/dist/color/manipulations.js +106 -0
- package/dist/color/names.d.ts +38 -0
- package/dist/color/names.js +108 -0
- package/dist/color/parse.d.ts +2 -0
- package/dist/color/parse.js +437 -0
- package/dist/color/random.d.ts +30 -0
- package/dist/color/random.js +65 -0
- package/dist/color/readability.d.ts +53 -0
- package/dist/color/readability.js +284 -0
- package/dist/color/srgb.d.ts +8 -0
- package/dist/color/srgb.js +33 -0
- package/dist/color/swatch.d.ts +49 -0
- package/dist/color/swatch.js +118 -0
- package/dist/color/temperature.d.ts +26 -0
- package/dist/color/temperature.js +141 -0
- package/dist/color/utils.d.ts +49 -0
- package/dist/color/utils.d.ts.map +1 -0
- package/dist/color/utils.js +104 -0
- package/dist/color/utils.js.map +1 -0
- package/dist/color/validations.d.ts +2 -0
- package/dist/color/validations.d.ts.map +1 -0
- package/dist/color/validations.js +178 -0
- package/dist/color/validations.js.map +1 -0
- package/dist/demo/src/AppFooter.d.ts +1 -0
- package/dist/demo/src/AppFooter.js +4 -0
- package/dist/demo/src/AppHeader.d.ts +5 -0
- package/dist/demo/src/AppHeader.js +6 -0
- package/dist/demo/src/components/Card.d.ts +9 -0
- package/dist/demo/src/components/Card.js +9 -0
- package/dist/demo/src/components/Chip.d.ts +21 -0
- package/dist/demo/src/components/Chip.js +23 -0
- package/dist/demo/src/components/ColorBox.d.ts +16 -0
- package/dist/demo/src/components/ColorBox.js +45 -0
- package/dist/demo/src/components/ColorInfoCard.d.ts +7 -0
- package/dist/demo/src/components/ColorInfoCard.js +50 -0
- package/dist/demo/src/components/ExpandableCodeSnippet.d.ts +5 -0
- package/dist/demo/src/components/ExpandableCodeSnippet.js +17 -0
- package/dist/demo/src/components/Icon.d.ts +11 -0
- package/dist/demo/src/components/Icon.js +50 -0
- package/dist/demo/src/components/Icon.types.d.ts +14 -0
- package/dist/demo/src/components/Icon.types.js +15 -0
- package/dist/demo/src/components/SectionContainer.d.ts +10 -0
- package/dist/demo/src/components/SectionContainer.js +12 -0
- package/dist/demo/src/components/VSpace.d.ts +5 -0
- package/dist/demo/src/components/VSpace.js +4 -0
- package/dist/demo/src/components/inputs/Checkbox.d.ts +7 -0
- package/dist/demo/src/components/inputs/Checkbox.js +4 -0
- package/dist/demo/src/components/inputs/InputGroup.d.ts +6 -0
- package/dist/demo/src/components/inputs/InputGroup.js +4 -0
- package/dist/demo/src/components/inputs/NumberInput.d.ts +10 -0
- package/dist/demo/src/components/inputs/NumberInput.js +8 -0
- package/dist/demo/src/components/inputs/Select.d.ts +12 -0
- package/dist/demo/src/components/inputs/Select.js +6 -0
- package/dist/demo/src/components/inputs/Slider.d.ts +10 -0
- package/dist/demo/src/components/inputs/Slider.js +4 -0
- package/dist/demo/src/components/utils.d.ts +17 -0
- package/dist/demo/src/components/utils.js +24 -0
- package/dist/demo/src/demo/ColorDemo.d.ts +1 -0
- package/dist/demo/src/demo/ColorDemo.js +45 -0
- package/dist/demo/src/demo/ColorHarmonyDemo.d.ts +6 -0
- package/dist/demo/src/demo/ColorHarmonyDemo.js +18 -0
- package/dist/demo/src/demo/ColorInfo.d.ts +6 -0
- package/dist/demo/src/demo/ColorInfo.js +14 -0
- package/dist/demo/src/demo/ColorInput.d.ts +7 -0
- package/dist/demo/src/demo/ColorInput.js +58 -0
- package/dist/demo/src/demo/ColorManipulationDemo.d.ts +6 -0
- package/dist/demo/src/demo/ColorManipulationDemo.js +63 -0
- package/dist/demo/src/demo/ColorSwatch.d.ts +13 -0
- package/dist/demo/src/demo/ColorSwatch.js +15 -0
- package/dist/demo/src/demo/ReadabilityDemo.d.ts +6 -0
- package/dist/demo/src/demo/ReadabilityDemo.js +24 -0
- package/dist/demo/src/demo/combinations/AverageColorsOptionInputs.d.ts +7 -0
- package/dist/demo/src/demo/combinations/AverageColorsOptionInputs.js +7 -0
- package/dist/demo/src/demo/combinations/BlendColorsOptionInputs.d.ts +7 -0
- package/dist/demo/src/demo/combinations/BlendColorsOptionInputs.js +13 -0
- package/dist/demo/src/demo/combinations/ColorCombinationDemo.d.ts +6 -0
- package/dist/demo/src/demo/combinations/ColorCombinationDemo.js +78 -0
- package/dist/demo/src/demo/combinations/MixColorsOptionInputs.d.ts +7 -0
- package/dist/demo/src/demo/combinations/MixColorsOptionInputs.js +10 -0
- package/dist/demo/src/demo/combinations/colorCombinationDemo.consts.d.ts +4 -0
- package/dist/demo/src/demo/combinations/colorCombinationDemo.consts.js +12 -0
- package/dist/demo/src/demo/gradients/GradientOptionInputs.d.ts +10 -0
- package/dist/demo/src/demo/gradients/GradientOptionInputs.js +42 -0
- package/dist/demo/src/demo/gradients/GradientThroughCard.d.ts +6 -0
- package/dist/demo/src/demo/gradients/GradientThroughCard.js +50 -0
- package/dist/demo/src/demo/gradients/GradientToCard.d.ts +6 -0
- package/dist/demo/src/demo/gradients/GradientToCard.js +54 -0
- package/dist/demo/src/demo/gradients/GradientsDemo.d.ts +6 -0
- package/dist/demo/src/demo/gradients/GradientsDemo.js +6 -0
- package/dist/demo/src/demo/gradients/gradientOptions.consts.d.ts +3 -0
- package/dist/demo/src/demo/gradients/gradientOptions.consts.js +16 -0
- package/dist/demo/src/demo/palette/ColorPaletteDemo.d.ts +6 -0
- package/dist/demo/src/demo/palette/ColorPaletteDemo.js +26 -0
- package/dist/demo/src/demo/palette/PaletteGenerationOptions.d.ts +8 -0
- package/dist/demo/src/demo/palette/PaletteGenerationOptions.js +53 -0
- package/dist/demo/src/demo/palette/PaletteHarmonyOptions.d.ts +7 -0
- package/dist/demo/src/demo/palette/PaletteHarmonyOptions.js +5 -0
- package/dist/demo/src/main.d.ts +1 -0
- package/dist/demo/src/main.js +14 -0
- package/dist/demo/src/pages/DemoPage.d.ts +1 -0
- package/dist/demo/src/pages/DemoPage.js +28 -0
- package/dist/demo/src/pages/PlaygroundPage.d.ts +1 -0
- package/dist/demo/src/pages/PlaygroundPage.js +24 -0
- package/dist/demo/src/playground/Playground.d.ts +1 -0
- package/dist/demo/src/playground/Playground.js +42 -0
- package/dist/demo/src/playground/playgroundUtils.d.ts +16 -0
- package/dist/demo/src/playground/playgroundUtils.js +202 -0
- package/dist/demo/src/seo/PageHead.d.ts +9 -0
- package/dist/demo/src/seo/PageHead.js +76 -0
- package/dist/demo/src/seo/StructuredData.d.ts +6 -0
- package/dist/demo/src/seo/StructuredData.js +13 -0
- package/dist/demo/src/toast/ToastProvider.d.ts +2 -0
- package/dist/demo/src/toast/ToastProvider.js +62 -0
- package/dist/demo/src/toast/index.d.ts +2 -0
- package/dist/demo/src/toast/index.js +2 -0
- package/dist/demo/src/toast/toastBus.d.ts +13 -0
- package/dist/demo/src/toast/toastBus.js +27 -0
- package/dist/index.d.ts +1233 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5235 -0
- package/dist/index.js.map +1 -0
- package/dist/palette/__test__/palette.test.d.ts +1 -0
- package/dist/palette/__test__/palette.test.js +397 -0
- package/dist/palette/palette.d.ts +41 -0
- package/dist/palette/palette.js +126 -0
- package/dist/src/__test__/interop-chroma.test.d.ts +1 -0
- package/dist/src/__test__/interop-chroma.test.js +673 -0
- package/dist/src/__test__/interop-tinycolor.test.d.ts +1 -0
- package/dist/src/__test__/interop-tinycolor.test.js +499 -0
- package/dist/src/color/__test__/color.test.d.ts +1 -0
- package/dist/src/color/__test__/color.test.js +1071 -0
- package/dist/src/color/__test__/colorSpaces.test.d.ts +1 -0
- package/dist/src/color/__test__/colorSpaces.test.js +69 -0
- package/dist/src/color/__test__/combinations.test.d.ts +1 -0
- package/dist/src/color/__test__/combinations.test.js +665 -0
- package/dist/src/color/__test__/conversions.test.d.ts +1 -0
- package/dist/src/color/__test__/conversions.test.js +719 -0
- package/dist/src/color/__test__/deltaE.test.d.ts +1 -0
- package/dist/src/color/__test__/deltaE.test.js +120 -0
- package/dist/src/color/__test__/formats.test.d.ts +1 -0
- package/dist/src/color/__test__/formats.test.js +470 -0
- package/dist/src/color/__test__/gradients.test.d.ts +1 -0
- package/dist/src/color/__test__/gradients.test.js +414 -0
- package/dist/src/color/__test__/harmonies.test.d.ts +1 -0
- package/dist/src/color/__test__/harmonies.test.js +734 -0
- package/dist/src/color/__test__/manipulations.test.d.ts +1 -0
- package/dist/src/color/__test__/manipulations.test.js +264 -0
- package/dist/src/color/__test__/names.test.d.ts +1 -0
- package/dist/src/color/__test__/names.test.js +67 -0
- package/dist/src/color/__test__/parse.test.d.ts +1 -0
- package/dist/src/color/__test__/parse.test.js +251 -0
- package/dist/src/color/__test__/random.test.d.ts +1 -0
- package/dist/src/color/__test__/random.test.js +262 -0
- package/dist/src/color/__test__/readability.test.d.ts +1 -0
- package/dist/src/color/__test__/readability.test.js +2596 -0
- package/dist/src/color/__test__/swatch.test.d.ts +1 -0
- package/dist/src/color/__test__/swatch.test.js +267 -0
- package/dist/src/color/__test__/temperature.test.d.ts +1 -0
- package/dist/src/color/__test__/temperature.test.js +223 -0
- package/dist/src/color/__test__/utils.test.d.ts +1 -0
- package/dist/src/color/__test__/utils.test.js +409 -0
- package/dist/src/color/__test__/validations.test.d.ts +1 -0
- package/dist/src/color/__test__/validations.test.js +239 -0
- package/dist/src/color/color.consts.d.ts +4 -0
- package/dist/src/color/color.consts.js +152 -0
- package/dist/src/color/color.d.ts +775 -0
- package/dist/src/color/color.js +903 -0
- package/dist/src/color/colorSpaces.d.ts +15 -0
- package/dist/src/color/colorSpaces.js +127 -0
- package/dist/src/color/combinations.d.ts +45 -0
- package/dist/src/color/combinations.js +557 -0
- package/dist/src/color/conversions.d.ts +16 -0
- package/dist/src/color/conversions.js +705 -0
- package/dist/src/color/deltaE.d.ts +59 -0
- package/dist/src/color/deltaE.js +110 -0
- package/dist/src/color/formats.d.ts +126 -0
- package/dist/src/color/formats.js +150 -0
- package/dist/src/color/gradients.d.ts +49 -0
- package/dist/src/color/gradients.js +673 -0
- package/dist/src/color/harmonies.d.ts +18 -0
- package/dist/src/color/harmonies.js +129 -0
- package/dist/src/color/manipulations.d.ts +29 -0
- package/dist/src/color/manipulations.js +107 -0
- package/dist/src/color/names.d.ts +38 -0
- package/dist/src/color/names.js +108 -0
- package/dist/src/color/parse.d.ts +2 -0
- package/dist/src/color/parse.js +438 -0
- package/dist/src/color/random.d.ts +30 -0
- package/dist/src/color/random.js +65 -0
- package/dist/src/color/readability.d.ts +53 -0
- package/dist/src/color/readability.js +284 -0
- package/dist/src/color/swatch.d.ts +49 -0
- package/dist/src/color/swatch.js +117 -0
- package/dist/src/color/temperature.d.ts +26 -0
- package/dist/src/color/temperature.js +142 -0
- package/dist/src/color/utils.d.ts +57 -0
- package/dist/src/color/utils.js +142 -0
- package/dist/src/color/validations.d.ts +2 -0
- package/dist/src/color/validations.js +178 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.js +2 -0
- package/dist/src/palette/__test__/palette.test.d.ts +1 -0
- package/dist/src/palette/__test__/palette.test.js +397 -0
- package/dist/src/palette/palette.d.ts +41 -0
- package/dist/src/palette/palette.js +127 -0
- package/dist/src/utils.d.ts +20 -0
- package/dist/src/utils.js +42 -0
- package/dist/utils.d.ts +20 -0
- package/dist/utils.js +42 -0
- package/package.json +96 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import chroma from 'chroma-js';
|
|
2
|
+
import { Color } from '../index';
|
|
3
|
+
describe('Color interoperability with chroma-js', () => {
|
|
4
|
+
describe('parses and normalizes inputs the same way', () => {
|
|
5
|
+
it('matches chroma-js hex and rgb outputs across formats', () => {
|
|
6
|
+
const baseHex = new Color('#336699');
|
|
7
|
+
const baseHexChroma = chroma('#336699');
|
|
8
|
+
expect(baseHex.toHex()).toBe(baseHexChroma.hex().toLowerCase());
|
|
9
|
+
expect(baseHex.toRGB()).toEqual({
|
|
10
|
+
r: baseHexChroma.rgb()[0],
|
|
11
|
+
g: baseHexChroma.rgb()[1],
|
|
12
|
+
b: baseHexChroma.rgb()[2],
|
|
13
|
+
});
|
|
14
|
+
const namedColor = new Color('rebeccapurple');
|
|
15
|
+
const namedColorChroma = chroma('rebeccapurple');
|
|
16
|
+
expect(namedColor.toHex()).toBe(namedColorChroma.hex().toLowerCase());
|
|
17
|
+
expect(namedColor.toRGB()).toEqual({
|
|
18
|
+
r: namedColorChroma.rgb()[0],
|
|
19
|
+
g: namedColorChroma.rgb()[1],
|
|
20
|
+
b: namedColorChroma.rgb()[2],
|
|
21
|
+
});
|
|
22
|
+
const hslStringColor = new Color('hsl(210, 50%, 40%)');
|
|
23
|
+
const hslStringChroma = chroma('hsl(210, 50%, 40%)');
|
|
24
|
+
expect(hslStringColor.toHex()).toBe(hslStringChroma.hex().toLowerCase());
|
|
25
|
+
expect(hslStringColor.toRGB()).toEqual({
|
|
26
|
+
r: hslStringChroma.rgb()[0],
|
|
27
|
+
g: hslStringChroma.rgb()[1],
|
|
28
|
+
b: hslStringChroma.rgb()[2],
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('handles alpha channels similarly', () => {
|
|
33
|
+
it('keeps alpha values aligned for hex8 and rgba inputs', () => {
|
|
34
|
+
const hexWithAlpha = new Color('#1e90ff80');
|
|
35
|
+
const hexWithAlphaChroma = chroma('#1e90ff80');
|
|
36
|
+
expect(hexWithAlpha.toHex8()).toBe(hexWithAlphaChroma.hex('rgba').toLowerCase());
|
|
37
|
+
expect(hexWithAlpha.toRGBA()).toEqual({
|
|
38
|
+
r: hexWithAlphaChroma.rgba()[0],
|
|
39
|
+
g: hexWithAlphaChroma.rgba()[1],
|
|
40
|
+
b: hexWithAlphaChroma.rgba()[2],
|
|
41
|
+
a: expect.closeTo(hexWithAlphaChroma.rgba()[3], 2),
|
|
42
|
+
});
|
|
43
|
+
const rgbaStringColor = new Color('rgba(12, 200, 180, 0.35)');
|
|
44
|
+
const rgbaStringChroma = chroma('rgba(12, 200, 180, 0.35)');
|
|
45
|
+
expect(rgbaStringColor.toHex8()).toBe(rgbaStringChroma.hex('rgba').toLowerCase());
|
|
46
|
+
expect(rgbaStringColor.toRGBA()).toEqual({
|
|
47
|
+
r: rgbaStringChroma.rgba()[0],
|
|
48
|
+
g: rgbaStringChroma.rgba()[1],
|
|
49
|
+
b: rgbaStringChroma.rgba()[2],
|
|
50
|
+
a: expect.closeTo(rgbaStringChroma.rgba()[3], 2),
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('agrees on HSL and HSV math', () => {
|
|
55
|
+
it('matches hue, saturation, and lightness/brightness values', () => {
|
|
56
|
+
const vividOrange = new Color('#ff7f0e');
|
|
57
|
+
const vividOrangeChroma = chroma('#ff7f0e');
|
|
58
|
+
const vividOrangeHsl = vividOrangeChroma.hsl();
|
|
59
|
+
const vividOrangeHslFromOmniColor = vividOrange.toHSL();
|
|
60
|
+
expect(vividOrangeHslFromOmniColor.h).toBeCloseTo(vividOrangeHsl[0], 0);
|
|
61
|
+
expect(vividOrangeHslFromOmniColor.s).toBeCloseTo(vividOrangeHsl[1] * 100, 0);
|
|
62
|
+
expect(vividOrangeHslFromOmniColor.l).toBeCloseTo(vividOrangeHsl[2] * 100, 0);
|
|
63
|
+
const vividOrangeHsv = vividOrangeChroma.hsv();
|
|
64
|
+
const vividOrangeHsvFromOmniColor = vividOrange.toHSV();
|
|
65
|
+
expect(vividOrangeHsvFromOmniColor.h).toBeCloseTo(vividOrangeHsv[0], 0);
|
|
66
|
+
expect(vividOrangeHsvFromOmniColor.s).toBeCloseTo(vividOrangeHsv[1] * 100, 0);
|
|
67
|
+
expect(vividOrangeHsvFromOmniColor.v).toBeCloseTo(vividOrangeHsv[2] * 100, 0);
|
|
68
|
+
const mutedTeal = new Color('rgb(32, 160, 150)');
|
|
69
|
+
const mutedTealChroma = chroma('rgb(32, 160, 150)');
|
|
70
|
+
const mutedTealHsl = mutedTealChroma.hsl();
|
|
71
|
+
const mutedTealHslFromOmniColor = mutedTeal.toHSL();
|
|
72
|
+
expect(mutedTealHslFromOmniColor.h).toBeCloseTo(mutedTealHsl[0], 0);
|
|
73
|
+
expect(mutedTealHslFromOmniColor.s).toBeCloseTo(mutedTealHsl[1] * 100, 0);
|
|
74
|
+
expect(mutedTealHslFromOmniColor.l).toBeCloseTo(mutedTealHsl[2] * 100, 0);
|
|
75
|
+
const mutedTealHsv = mutedTealChroma.hsv();
|
|
76
|
+
const mutedTealHsvFromOmniColor = mutedTeal.toHSV();
|
|
77
|
+
expect(mutedTealHsvFromOmniColor.h).toBeCloseTo(mutedTealHsv[0], 0);
|
|
78
|
+
expect(mutedTealHsvFromOmniColor.s).toBeCloseTo(mutedTealHsv[1] * 100, 0);
|
|
79
|
+
expect(mutedTealHsvFromOmniColor.v).toBeCloseTo(mutedTealHsv[2] * 100, 0);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { converter, differenceCie76, differenceCie94, differenceCiede2000, formatHex8, parse, wcagContrast, } from 'culori';
|
|
2
|
+
import { Color } from '../color/color';
|
|
3
|
+
const culoriToRgb = converter('rgb');
|
|
4
|
+
const culoriToHsl = converter('hsl');
|
|
5
|
+
const culoriToHsv = converter('hsv');
|
|
6
|
+
const culoriToLab = converter('lab');
|
|
7
|
+
const culoriToLch = converter('lch');
|
|
8
|
+
const culoriToOklch = converter('oklch');
|
|
9
|
+
const TEST_COLORS = [
|
|
10
|
+
'#ff0000',
|
|
11
|
+
'#00ff00',
|
|
12
|
+
'#0000ff',
|
|
13
|
+
'#000000',
|
|
14
|
+
'#ffffff',
|
|
15
|
+
'#808080',
|
|
16
|
+
'#f0f8ff', // aliceblue
|
|
17
|
+
'#ff1493', // deeppink
|
|
18
|
+
'#00ced1', // darkturquoise
|
|
19
|
+
'rgba(255, 0, 0, 0.5)',
|
|
20
|
+
'hsla(120, 100%, 50%, 0.3)',
|
|
21
|
+
'#12345678',
|
|
22
|
+
{ r: 100, g: 150, b: 200 },
|
|
23
|
+
{ h: 200, s: 50, l: 50 },
|
|
24
|
+
{ l: 50, a: 10, b: -10 },
|
|
25
|
+
{ l: 0.5, c: 0.1, h: 180, alpha: 1 }, // OKLCH-like object
|
|
26
|
+
];
|
|
27
|
+
// Helper to handle hue being undefined in culori for grayscale
|
|
28
|
+
const fixHue = (h) => (h === undefined || isNaN(h) ? 0 : h);
|
|
29
|
+
function parseOrThrow(input) {
|
|
30
|
+
const result = parse(input);
|
|
31
|
+
if (!result) {
|
|
32
|
+
throw new Error(`Culori failed to parse: ${input}`);
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
// TODO: unskip and fix these tests
|
|
37
|
+
describe.skip('Cross-check with Culori', () => {
|
|
38
|
+
describe('Conversions', () => {
|
|
39
|
+
TEST_COLORS.forEach((input) => {
|
|
40
|
+
const omni = new Color(input);
|
|
41
|
+
const sourceHex8 = omni.toHex8();
|
|
42
|
+
const culoriColor = parseOrThrow(sourceHex8);
|
|
43
|
+
describe(`Input: ${JSON.stringify(input)} (Hex8: ${sourceHex8})`, () => {
|
|
44
|
+
it('matches RGB', () => {
|
|
45
|
+
const omniRgb = omni.toRGB();
|
|
46
|
+
const culoriRgb = culoriToRgb(culoriColor);
|
|
47
|
+
expect(omniRgb.r).toBeCloseTo(culoriRgb.r * 255, 0);
|
|
48
|
+
expect(omniRgb.g).toBeCloseTo(culoriRgb.g * 255, 0);
|
|
49
|
+
expect(omniRgb.b).toBeCloseTo(culoriRgb.b * 255, 0);
|
|
50
|
+
const omniAlpha = omni.getAlpha();
|
|
51
|
+
const culoriAlpha = culoriRgb.alpha ?? 1;
|
|
52
|
+
expect(omniAlpha).toBeCloseTo(culoriAlpha, 2);
|
|
53
|
+
});
|
|
54
|
+
it('matches HEX', () => {
|
|
55
|
+
const omniHex8 = omni.toHex8();
|
|
56
|
+
const culoriHex8 = formatHex8(culoriColor);
|
|
57
|
+
expect(omniHex8).toBe(culoriHex8);
|
|
58
|
+
});
|
|
59
|
+
it('matches HSL', () => {
|
|
60
|
+
const omniHsl = omni.toHSL();
|
|
61
|
+
const culoriHsl = culoriToHsl(culoriColor);
|
|
62
|
+
const ch = fixHue(culoriHsl.h);
|
|
63
|
+
if (omniHsl.s > 1) {
|
|
64
|
+
const diff = Math.abs(omniHsl.h - ch);
|
|
65
|
+
const diffWrapped = Math.min(diff, 360 - diff);
|
|
66
|
+
expect(diffWrapped).toBeLessThan(2);
|
|
67
|
+
}
|
|
68
|
+
expect(omniHsl.s).toBeCloseTo(culoriHsl.s * 100, 0);
|
|
69
|
+
expect(omniHsl.l).toBeCloseTo(culoriHsl.l * 100, 0);
|
|
70
|
+
});
|
|
71
|
+
it('matches HSV', () => {
|
|
72
|
+
const omniHsv = omni.toHSV();
|
|
73
|
+
const culoriHsv = culoriToHsv(culoriColor);
|
|
74
|
+
const ch = fixHue(culoriHsv.h);
|
|
75
|
+
if (omniHsv.s > 1) {
|
|
76
|
+
const diff = Math.abs(omniHsv.h - ch);
|
|
77
|
+
const diffWrapped = Math.min(diff, 360 - diff);
|
|
78
|
+
expect(diffWrapped).toBeLessThan(2);
|
|
79
|
+
}
|
|
80
|
+
expect(omniHsv.s).toBeCloseTo(culoriHsv.s * 100, 0);
|
|
81
|
+
expect(omniHsv.v).toBeCloseTo(culoriHsv.v * 100, 0);
|
|
82
|
+
});
|
|
83
|
+
it('matches Lab', () => {
|
|
84
|
+
const omniLab = omni.toLAB();
|
|
85
|
+
const culoriLab = culoriToLab(culoriColor);
|
|
86
|
+
expect(omniLab.l).toBeCloseTo(culoriLab.l, 1);
|
|
87
|
+
expect(omniLab.a).toBeCloseTo(culoriLab.a, 1);
|
|
88
|
+
expect(omniLab.b).toBeCloseTo(culoriLab.b, 1);
|
|
89
|
+
});
|
|
90
|
+
it('matches LCH', () => {
|
|
91
|
+
const omniLch = omni.toLCH();
|
|
92
|
+
const culoriLch = culoriToLch(culoriColor);
|
|
93
|
+
expect(omniLch.l).toBeCloseTo(culoriLch.l, 1);
|
|
94
|
+
expect(omniLch.c).toBeCloseTo(culoriLch.c, 1);
|
|
95
|
+
if (omniLch.c > 1) {
|
|
96
|
+
const ch = fixHue(culoriLch.h);
|
|
97
|
+
const diff = Math.abs(omniLch.h - ch);
|
|
98
|
+
const diffWrapped = Math.min(diff, 360 - diff);
|
|
99
|
+
expect(diffWrapped).toBeLessThan(2);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
it('matches OKLCH', () => {
|
|
103
|
+
const omniOklch = omni.toOKLCH();
|
|
104
|
+
const culoriOklch = culoriToOklch(culoriColor);
|
|
105
|
+
expect(omniOklch.l).toBeCloseTo(culoriOklch.l, 3);
|
|
106
|
+
expect(omniOklch.c).toBeCloseTo(culoriOklch.c, 3);
|
|
107
|
+
if (omniOklch.c > 0.01) {
|
|
108
|
+
const ch = fixHue(culoriOklch.h);
|
|
109
|
+
const diff = Math.abs(omniOklch.h - ch);
|
|
110
|
+
const diffWrapped = Math.min(diff, 360 - diff);
|
|
111
|
+
expect(diffWrapped).toBeLessThan(2);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('DeltaE', () => {
|
|
118
|
+
// Pairs to compare
|
|
119
|
+
const pairs = [
|
|
120
|
+
['#ff0000', '#ff0000'],
|
|
121
|
+
['#ff0000', '#ff0100'],
|
|
122
|
+
['#ff0000', '#00ff00'],
|
|
123
|
+
['#000000', '#ffffff'],
|
|
124
|
+
['#123456', '#654321'],
|
|
125
|
+
];
|
|
126
|
+
pairs.forEach(([c1, c2]) => {
|
|
127
|
+
const color1 = new Color(c1);
|
|
128
|
+
const color2 = new Color(c2);
|
|
129
|
+
const culori1 = parseOrThrow(color1.toHex8());
|
|
130
|
+
const culori2 = parseOrThrow(color2.toHex8());
|
|
131
|
+
describe(`${c1} vs ${c2}`, () => {
|
|
132
|
+
it('matches CIE76', () => {
|
|
133
|
+
const omniVal = color1.differenceFrom(color2, { method: 'CIE76' });
|
|
134
|
+
const culoriVal = differenceCie76()(culori1, culori2);
|
|
135
|
+
expect(omniVal).toBeCloseTo(culoriVal, 1);
|
|
136
|
+
});
|
|
137
|
+
it('matches CIE94', () => {
|
|
138
|
+
const omniVal = color1.differenceFrom(color2, { method: 'CIE94' });
|
|
139
|
+
const culoriVal = differenceCie94()(culori1, culori2);
|
|
140
|
+
expect(omniVal).toBeCloseTo(culoriVal, 1);
|
|
141
|
+
});
|
|
142
|
+
it('matches CIEDE2000', () => {
|
|
143
|
+
const omniVal = color1.differenceFrom(color2, { method: 'CIEDE2000' });
|
|
144
|
+
const culoriVal = differenceCiede2000()(culori1, culori2);
|
|
145
|
+
expect(omniVal).toBeCloseTo(culoriVal, 3);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe('Contrast', () => {
|
|
151
|
+
const pairs = [
|
|
152
|
+
['#000000', '#ffffff'],
|
|
153
|
+
['#ff0000', '#00ff00'],
|
|
154
|
+
['#777777', '#888888'],
|
|
155
|
+
['#123456', '#abcdef'],
|
|
156
|
+
];
|
|
157
|
+
pairs.forEach(([bg, fg]) => {
|
|
158
|
+
const bgColor = new Color(bg);
|
|
159
|
+
const fgColor = new Color(fg);
|
|
160
|
+
const culoriBg = parseOrThrow(bgColor.toHex8());
|
|
161
|
+
const culoriFg = parseOrThrow(fgColor.toHex8());
|
|
162
|
+
it(`matches WCAG contrast for ${bg} on ${fg}`, () => {
|
|
163
|
+
const omniContrast = bgColor.getContrastRatio(fgColor);
|
|
164
|
+
const culoriContrast = wcagContrast(culoriBg, culoriFg);
|
|
165
|
+
expect(omniContrast).toBeCloseTo(culoriContrast, 2);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|