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.
Files changed (293) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +1042 -0
  3. package/dist/__test__/color-interop.test.d.ts +1 -0
  4. package/dist/__test__/color-interop.test.js +82 -0
  5. package/dist/__test__/comparison_culori.test.d.ts +1 -0
  6. package/dist/__test__/comparison_culori.test.js +169 -0
  7. package/dist/__test__/interop-chroma.test.d.ts +1 -0
  8. package/dist/__test__/interop-chroma.test.js +676 -0
  9. package/dist/__test__/interop-tinycolor.test.d.ts +1 -0
  10. package/dist/__test__/interop-tinycolor.test.js +499 -0
  11. package/dist/color/__test__/baseColor.test.d.ts +2 -0
  12. package/dist/color/__test__/baseColor.test.d.ts.map +1 -0
  13. package/dist/color/__test__/baseColor.test.js +34 -0
  14. package/dist/color/__test__/baseColor.test.js.map +1 -0
  15. package/dist/color/__test__/blank.d.ts +1 -0
  16. package/dist/color/__test__/blank.js +3 -0
  17. package/dist/color/__test__/color.test.d.ts +1 -0
  18. package/dist/color/__test__/color.test.js +1073 -0
  19. package/dist/color/__test__/colorSpaces.test.d.ts +1 -0
  20. package/dist/color/__test__/colorSpaces.test.js +69 -0
  21. package/dist/color/__test__/combinations.test.d.ts +1 -0
  22. package/dist/color/__test__/combinations.test.js +665 -0
  23. package/dist/color/__test__/conversions.test.d.ts +1 -0
  24. package/dist/color/__test__/conversions.test.js +719 -0
  25. package/dist/color/__test__/deltaE.test.d.ts +1 -0
  26. package/dist/color/__test__/deltaE.test.js +120 -0
  27. package/dist/color/__test__/formats.test.d.ts +1 -0
  28. package/dist/color/__test__/formats.test.js +514 -0
  29. package/dist/color/__test__/gradients.test.d.ts +1 -0
  30. package/dist/color/__test__/gradients.test.js +414 -0
  31. package/dist/color/__test__/harmonies.test.d.ts +1 -0
  32. package/dist/color/__test__/harmonies.test.js +676 -0
  33. package/dist/color/__test__/manipulations.test.d.ts +1 -0
  34. package/dist/color/__test__/manipulations.test.js +264 -0
  35. package/dist/color/__test__/names.test.d.ts +1 -0
  36. package/dist/color/__test__/names.test.js +67 -0
  37. package/dist/color/__test__/parse.test.d.ts +1 -0
  38. package/dist/color/__test__/parse.test.js +256 -0
  39. package/dist/color/__test__/random.test.d.ts +1 -0
  40. package/dist/color/__test__/random.test.js +262 -0
  41. package/dist/color/__test__/readability.test.d.ts +1 -0
  42. package/dist/color/__test__/readability.test.js +2596 -0
  43. package/dist/color/__test__/srgb.test.d.ts +1 -0
  44. package/dist/color/__test__/srgb.test.js +43 -0
  45. package/dist/color/__test__/swatch.test.d.ts +1 -0
  46. package/dist/color/__test__/swatch.test.js +267 -0
  47. package/dist/color/__test__/temperature.test.d.ts +1 -0
  48. package/dist/color/__test__/temperature.test.js +223 -0
  49. package/dist/color/__test__/utils.test.d.ts +1 -0
  50. package/dist/color/__test__/utils.test.js +409 -0
  51. package/dist/color/__test__/validations.test.d.ts +1 -0
  52. package/dist/color/__test__/validations.test.js +239 -0
  53. package/dist/color/color.constants.d.ts +4 -0
  54. package/dist/color/color.constants.d.ts.map +1 -0
  55. package/dist/color/color.constants.js +152 -0
  56. package/dist/color/color.constants.js.map +1 -0
  57. package/dist/color/color.consts.d.ts +4 -0
  58. package/dist/color/color.consts.js +152 -0
  59. package/dist/color/color.d.ts +788 -0
  60. package/dist/color/color.d.ts.map +1 -0
  61. package/dist/color/color.helpers.d.ts +6 -0
  62. package/dist/color/color.helpers.js +4 -0
  63. package/dist/color/color.js +919 -0
  64. package/dist/color/color.js.map +1 -0
  65. package/dist/color/colorSpaces.d.ts +15 -0
  66. package/dist/color/colorSpaces.js +127 -0
  67. package/dist/color/combinations.d.ts +45 -0
  68. package/dist/color/combinations.js +562 -0
  69. package/dist/color/conversions.d.ts +16 -0
  70. package/dist/color/conversions.d.ts.map +1 -0
  71. package/dist/color/conversions.js +705 -0
  72. package/dist/color/conversions.js.map +1 -0
  73. package/dist/color/deltaE.d.ts +59 -0
  74. package/dist/color/deltaE.js +110 -0
  75. package/dist/color/formats.d.ts +128 -0
  76. package/dist/color/formats.d.ts.map +1 -0
  77. package/dist/color/formats.js +153 -0
  78. package/dist/color/formats.js.map +1 -0
  79. package/dist/color/gradients.d.ts +49 -0
  80. package/dist/color/gradients.js +672 -0
  81. package/dist/color/harmonies.d.ts +18 -0
  82. package/dist/color/harmonies.js +128 -0
  83. package/dist/color/manipulations.d.ts +29 -0
  84. package/dist/color/manipulations.js +106 -0
  85. package/dist/color/names.d.ts +38 -0
  86. package/dist/color/names.js +108 -0
  87. package/dist/color/parse.d.ts +2 -0
  88. package/dist/color/parse.js +437 -0
  89. package/dist/color/random.d.ts +30 -0
  90. package/dist/color/random.js +65 -0
  91. package/dist/color/readability.d.ts +53 -0
  92. package/dist/color/readability.js +284 -0
  93. package/dist/color/srgb.d.ts +8 -0
  94. package/dist/color/srgb.js +33 -0
  95. package/dist/color/swatch.d.ts +49 -0
  96. package/dist/color/swatch.js +118 -0
  97. package/dist/color/temperature.d.ts +26 -0
  98. package/dist/color/temperature.js +141 -0
  99. package/dist/color/utils.d.ts +49 -0
  100. package/dist/color/utils.d.ts.map +1 -0
  101. package/dist/color/utils.js +104 -0
  102. package/dist/color/utils.js.map +1 -0
  103. package/dist/color/validations.d.ts +2 -0
  104. package/dist/color/validations.d.ts.map +1 -0
  105. package/dist/color/validations.js +178 -0
  106. package/dist/color/validations.js.map +1 -0
  107. package/dist/demo/src/AppFooter.d.ts +1 -0
  108. package/dist/demo/src/AppFooter.js +4 -0
  109. package/dist/demo/src/AppHeader.d.ts +5 -0
  110. package/dist/demo/src/AppHeader.js +6 -0
  111. package/dist/demo/src/components/Card.d.ts +9 -0
  112. package/dist/demo/src/components/Card.js +9 -0
  113. package/dist/demo/src/components/Chip.d.ts +21 -0
  114. package/dist/demo/src/components/Chip.js +23 -0
  115. package/dist/demo/src/components/ColorBox.d.ts +16 -0
  116. package/dist/demo/src/components/ColorBox.js +45 -0
  117. package/dist/demo/src/components/ColorInfoCard.d.ts +7 -0
  118. package/dist/demo/src/components/ColorInfoCard.js +50 -0
  119. package/dist/demo/src/components/ExpandableCodeSnippet.d.ts +5 -0
  120. package/dist/demo/src/components/ExpandableCodeSnippet.js +17 -0
  121. package/dist/demo/src/components/Icon.d.ts +11 -0
  122. package/dist/demo/src/components/Icon.js +50 -0
  123. package/dist/demo/src/components/Icon.types.d.ts +14 -0
  124. package/dist/demo/src/components/Icon.types.js +15 -0
  125. package/dist/demo/src/components/SectionContainer.d.ts +10 -0
  126. package/dist/demo/src/components/SectionContainer.js +12 -0
  127. package/dist/demo/src/components/VSpace.d.ts +5 -0
  128. package/dist/demo/src/components/VSpace.js +4 -0
  129. package/dist/demo/src/components/inputs/Checkbox.d.ts +7 -0
  130. package/dist/demo/src/components/inputs/Checkbox.js +4 -0
  131. package/dist/demo/src/components/inputs/InputGroup.d.ts +6 -0
  132. package/dist/demo/src/components/inputs/InputGroup.js +4 -0
  133. package/dist/demo/src/components/inputs/NumberInput.d.ts +10 -0
  134. package/dist/demo/src/components/inputs/NumberInput.js +8 -0
  135. package/dist/demo/src/components/inputs/Select.d.ts +12 -0
  136. package/dist/demo/src/components/inputs/Select.js +6 -0
  137. package/dist/demo/src/components/inputs/Slider.d.ts +10 -0
  138. package/dist/demo/src/components/inputs/Slider.js +4 -0
  139. package/dist/demo/src/components/utils.d.ts +17 -0
  140. package/dist/demo/src/components/utils.js +24 -0
  141. package/dist/demo/src/demo/ColorDemo.d.ts +1 -0
  142. package/dist/demo/src/demo/ColorDemo.js +45 -0
  143. package/dist/demo/src/demo/ColorHarmonyDemo.d.ts +6 -0
  144. package/dist/demo/src/demo/ColorHarmonyDemo.js +18 -0
  145. package/dist/demo/src/demo/ColorInfo.d.ts +6 -0
  146. package/dist/demo/src/demo/ColorInfo.js +14 -0
  147. package/dist/demo/src/demo/ColorInput.d.ts +7 -0
  148. package/dist/demo/src/demo/ColorInput.js +58 -0
  149. package/dist/demo/src/demo/ColorManipulationDemo.d.ts +6 -0
  150. package/dist/demo/src/demo/ColorManipulationDemo.js +63 -0
  151. package/dist/demo/src/demo/ColorSwatch.d.ts +13 -0
  152. package/dist/demo/src/demo/ColorSwatch.js +15 -0
  153. package/dist/demo/src/demo/ReadabilityDemo.d.ts +6 -0
  154. package/dist/demo/src/demo/ReadabilityDemo.js +24 -0
  155. package/dist/demo/src/demo/combinations/AverageColorsOptionInputs.d.ts +7 -0
  156. package/dist/demo/src/demo/combinations/AverageColorsOptionInputs.js +7 -0
  157. package/dist/demo/src/demo/combinations/BlendColorsOptionInputs.d.ts +7 -0
  158. package/dist/demo/src/demo/combinations/BlendColorsOptionInputs.js +13 -0
  159. package/dist/demo/src/demo/combinations/ColorCombinationDemo.d.ts +6 -0
  160. package/dist/demo/src/demo/combinations/ColorCombinationDemo.js +78 -0
  161. package/dist/demo/src/demo/combinations/MixColorsOptionInputs.d.ts +7 -0
  162. package/dist/demo/src/demo/combinations/MixColorsOptionInputs.js +10 -0
  163. package/dist/demo/src/demo/combinations/colorCombinationDemo.consts.d.ts +4 -0
  164. package/dist/demo/src/demo/combinations/colorCombinationDemo.consts.js +12 -0
  165. package/dist/demo/src/demo/gradients/GradientOptionInputs.d.ts +10 -0
  166. package/dist/demo/src/demo/gradients/GradientOptionInputs.js +42 -0
  167. package/dist/demo/src/demo/gradients/GradientThroughCard.d.ts +6 -0
  168. package/dist/demo/src/demo/gradients/GradientThroughCard.js +50 -0
  169. package/dist/demo/src/demo/gradients/GradientToCard.d.ts +6 -0
  170. package/dist/demo/src/demo/gradients/GradientToCard.js +54 -0
  171. package/dist/demo/src/demo/gradients/GradientsDemo.d.ts +6 -0
  172. package/dist/demo/src/demo/gradients/GradientsDemo.js +6 -0
  173. package/dist/demo/src/demo/gradients/gradientOptions.consts.d.ts +3 -0
  174. package/dist/demo/src/demo/gradients/gradientOptions.consts.js +16 -0
  175. package/dist/demo/src/demo/palette/ColorPaletteDemo.d.ts +6 -0
  176. package/dist/demo/src/demo/palette/ColorPaletteDemo.js +26 -0
  177. package/dist/demo/src/demo/palette/PaletteGenerationOptions.d.ts +8 -0
  178. package/dist/demo/src/demo/palette/PaletteGenerationOptions.js +53 -0
  179. package/dist/demo/src/demo/palette/PaletteHarmonyOptions.d.ts +7 -0
  180. package/dist/demo/src/demo/palette/PaletteHarmonyOptions.js +5 -0
  181. package/dist/demo/src/main.d.ts +1 -0
  182. package/dist/demo/src/main.js +14 -0
  183. package/dist/demo/src/pages/DemoPage.d.ts +1 -0
  184. package/dist/demo/src/pages/DemoPage.js +28 -0
  185. package/dist/demo/src/pages/PlaygroundPage.d.ts +1 -0
  186. package/dist/demo/src/pages/PlaygroundPage.js +24 -0
  187. package/dist/demo/src/playground/Playground.d.ts +1 -0
  188. package/dist/demo/src/playground/Playground.js +42 -0
  189. package/dist/demo/src/playground/playgroundUtils.d.ts +16 -0
  190. package/dist/demo/src/playground/playgroundUtils.js +202 -0
  191. package/dist/demo/src/seo/PageHead.d.ts +9 -0
  192. package/dist/demo/src/seo/PageHead.js +76 -0
  193. package/dist/demo/src/seo/StructuredData.d.ts +6 -0
  194. package/dist/demo/src/seo/StructuredData.js +13 -0
  195. package/dist/demo/src/toast/ToastProvider.d.ts +2 -0
  196. package/dist/demo/src/toast/ToastProvider.js +62 -0
  197. package/dist/demo/src/toast/index.d.ts +2 -0
  198. package/dist/demo/src/toast/index.js +2 -0
  199. package/dist/demo/src/toast/toastBus.d.ts +13 -0
  200. package/dist/demo/src/toast/toastBus.js +27 -0
  201. package/dist/index.d.ts +1233 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/index.js +5235 -0
  204. package/dist/index.js.map +1 -0
  205. package/dist/palette/__test__/palette.test.d.ts +1 -0
  206. package/dist/palette/__test__/palette.test.js +397 -0
  207. package/dist/palette/palette.d.ts +41 -0
  208. package/dist/palette/palette.js +126 -0
  209. package/dist/src/__test__/interop-chroma.test.d.ts +1 -0
  210. package/dist/src/__test__/interop-chroma.test.js +673 -0
  211. package/dist/src/__test__/interop-tinycolor.test.d.ts +1 -0
  212. package/dist/src/__test__/interop-tinycolor.test.js +499 -0
  213. package/dist/src/color/__test__/color.test.d.ts +1 -0
  214. package/dist/src/color/__test__/color.test.js +1071 -0
  215. package/dist/src/color/__test__/colorSpaces.test.d.ts +1 -0
  216. package/dist/src/color/__test__/colorSpaces.test.js +69 -0
  217. package/dist/src/color/__test__/combinations.test.d.ts +1 -0
  218. package/dist/src/color/__test__/combinations.test.js +665 -0
  219. package/dist/src/color/__test__/conversions.test.d.ts +1 -0
  220. package/dist/src/color/__test__/conversions.test.js +719 -0
  221. package/dist/src/color/__test__/deltaE.test.d.ts +1 -0
  222. package/dist/src/color/__test__/deltaE.test.js +120 -0
  223. package/dist/src/color/__test__/formats.test.d.ts +1 -0
  224. package/dist/src/color/__test__/formats.test.js +470 -0
  225. package/dist/src/color/__test__/gradients.test.d.ts +1 -0
  226. package/dist/src/color/__test__/gradients.test.js +414 -0
  227. package/dist/src/color/__test__/harmonies.test.d.ts +1 -0
  228. package/dist/src/color/__test__/harmonies.test.js +734 -0
  229. package/dist/src/color/__test__/manipulations.test.d.ts +1 -0
  230. package/dist/src/color/__test__/manipulations.test.js +264 -0
  231. package/dist/src/color/__test__/names.test.d.ts +1 -0
  232. package/dist/src/color/__test__/names.test.js +67 -0
  233. package/dist/src/color/__test__/parse.test.d.ts +1 -0
  234. package/dist/src/color/__test__/parse.test.js +251 -0
  235. package/dist/src/color/__test__/random.test.d.ts +1 -0
  236. package/dist/src/color/__test__/random.test.js +262 -0
  237. package/dist/src/color/__test__/readability.test.d.ts +1 -0
  238. package/dist/src/color/__test__/readability.test.js +2596 -0
  239. package/dist/src/color/__test__/swatch.test.d.ts +1 -0
  240. package/dist/src/color/__test__/swatch.test.js +267 -0
  241. package/dist/src/color/__test__/temperature.test.d.ts +1 -0
  242. package/dist/src/color/__test__/temperature.test.js +223 -0
  243. package/dist/src/color/__test__/utils.test.d.ts +1 -0
  244. package/dist/src/color/__test__/utils.test.js +409 -0
  245. package/dist/src/color/__test__/validations.test.d.ts +1 -0
  246. package/dist/src/color/__test__/validations.test.js +239 -0
  247. package/dist/src/color/color.consts.d.ts +4 -0
  248. package/dist/src/color/color.consts.js +152 -0
  249. package/dist/src/color/color.d.ts +775 -0
  250. package/dist/src/color/color.js +903 -0
  251. package/dist/src/color/colorSpaces.d.ts +15 -0
  252. package/dist/src/color/colorSpaces.js +127 -0
  253. package/dist/src/color/combinations.d.ts +45 -0
  254. package/dist/src/color/combinations.js +557 -0
  255. package/dist/src/color/conversions.d.ts +16 -0
  256. package/dist/src/color/conversions.js +705 -0
  257. package/dist/src/color/deltaE.d.ts +59 -0
  258. package/dist/src/color/deltaE.js +110 -0
  259. package/dist/src/color/formats.d.ts +126 -0
  260. package/dist/src/color/formats.js +150 -0
  261. package/dist/src/color/gradients.d.ts +49 -0
  262. package/dist/src/color/gradients.js +673 -0
  263. package/dist/src/color/harmonies.d.ts +18 -0
  264. package/dist/src/color/harmonies.js +129 -0
  265. package/dist/src/color/manipulations.d.ts +29 -0
  266. package/dist/src/color/manipulations.js +107 -0
  267. package/dist/src/color/names.d.ts +38 -0
  268. package/dist/src/color/names.js +108 -0
  269. package/dist/src/color/parse.d.ts +2 -0
  270. package/dist/src/color/parse.js +438 -0
  271. package/dist/src/color/random.d.ts +30 -0
  272. package/dist/src/color/random.js +65 -0
  273. package/dist/src/color/readability.d.ts +53 -0
  274. package/dist/src/color/readability.js +284 -0
  275. package/dist/src/color/swatch.d.ts +49 -0
  276. package/dist/src/color/swatch.js +117 -0
  277. package/dist/src/color/temperature.d.ts +26 -0
  278. package/dist/src/color/temperature.js +142 -0
  279. package/dist/src/color/utils.d.ts +57 -0
  280. package/dist/src/color/utils.js +142 -0
  281. package/dist/src/color/validations.d.ts +2 -0
  282. package/dist/src/color/validations.js +178 -0
  283. package/dist/src/index.d.ts +20 -0
  284. package/dist/src/index.js +2 -0
  285. package/dist/src/palette/__test__/palette.test.d.ts +1 -0
  286. package/dist/src/palette/__test__/palette.test.js +397 -0
  287. package/dist/src/palette/palette.d.ts +41 -0
  288. package/dist/src/palette/palette.js +127 -0
  289. package/dist/src/utils.d.ts +20 -0
  290. package/dist/src/utils.js +42 -0
  291. package/dist/utils.d.ts +20 -0
  292. package/dist/utils.js +42 -0
  293. 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 {};