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,6 @@
1
+ import { Color } from '../../../../dist';
2
+ interface Props {
3
+ color: Color;
4
+ }
5
+ export declare function ColorCombinationDemo({ color }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from 'react';
3
+ import { Color } from '../../../../dist';
4
+ import { ColorBox } from '../../components/ColorBox';
5
+ import { MixColorsOptionInputs } from './MixColorsOptionInputs';
6
+ import { BlendColorsOptionInputs } from './BlendColorsOptionInputs';
7
+ import { AverageColorsOptionInputs } from './AverageColorsOptionInputs';
8
+ import { Card } from '../../components/Card';
9
+ import { useIsDarkMode } from '../../components/utils';
10
+ import { DEFAULT_AVERAGE_COLORS_OPTIONS, DEFAULT_BLEND_COLORS_OPTIONS, DEFAULT_MIX_COLORS_OPTIONS, } from './colorCombinationDemo.consts';
11
+ function getMixCodeSnippet(colorHex, mixOptions) {
12
+ const mixSpace = mixOptions.space ?? DEFAULT_MIX_COLORS_OPTIONS.space;
13
+ const mixType = mixOptions.type ?? DEFAULT_MIX_COLORS_OPTIONS.type;
14
+ return `
15
+ const color = new Color('${colorHex}');
16
+
17
+ const red = new Color('red');
18
+ const green = new Color('green');
19
+ const blue = new Color('blue');
20
+
21
+ const mixedWithRed = color.mix([red], { space: '${mixSpace}', type: '${mixType}' });
22
+ const mixedWithGreen = color.mix([green], { space: '${mixSpace}', type: '${mixType}' });
23
+ const mixedWithBlue = color.mix([blue], { space: '${mixSpace}', type: '${mixType}' });
24
+ const mixedWithAll = color.mix([red, green, blue], { space: '${mixSpace}', type: '${mixType}' });
25
+ `;
26
+ }
27
+ function getBlendCodeSnippet(colorHex, blendOptions) {
28
+ const blendMode = blendOptions.mode ?? DEFAULT_BLEND_COLORS_OPTIONS.mode;
29
+ const blendSpace = blendOptions.space ?? DEFAULT_BLEND_COLORS_OPTIONS.space;
30
+ const blendRatio = blendOptions.ratio ?? DEFAULT_BLEND_COLORS_OPTIONS.ratio;
31
+ return `
32
+ const color = new Color('${colorHex}');
33
+
34
+ const red = new Color('red');
35
+ const green = new Color('green');
36
+ const blue = new Color('blue');
37
+
38
+ const blendedWithRed = color.blend(red, { mode: '${blendMode}', space: '${blendSpace}', ratio: ${blendRatio} });
39
+ const blendedWithGreen = color.blend(green, { mode: '${blendMode}', space: '${blendSpace}', ratio: ${blendRatio} });
40
+ const blendedWithBlue = color.blend(blue, { mode: '${blendMode}', space: '${blendSpace}', ratio: ${blendRatio} });
41
+ `;
42
+ }
43
+ function getAverageCodeSnippet(colorHex, averageOptions) {
44
+ const averageSpace = averageOptions.space ?? DEFAULT_AVERAGE_COLORS_OPTIONS.space;
45
+ return `
46
+ const color = new Color('${colorHex}');
47
+
48
+ const red = new Color('red');
49
+ const green = new Color('green');
50
+ const blue = new Color('blue');
51
+
52
+ const averagedWithRed = color.average([red], { space: '${averageSpace}' });
53
+ const averagedWithGreen = color.average([green], { space: '${averageSpace}' });
54
+ const averagedWithBlue = color.average([blue], { space: '${averageSpace}' });
55
+ const averagedWithAll = color.average([red, green, blue], { space: '${averageSpace}' });
56
+ `;
57
+ }
58
+ export function ColorCombinationDemo({ color }) {
59
+ const isDarkMode = useIsDarkMode();
60
+ const [mixOptions, setMixOptions] = useState(DEFAULT_MIX_COLORS_OPTIONS);
61
+ const [blendOptions, setBlendOptions] = useState(DEFAULT_BLEND_COLORS_OPTIONS);
62
+ const [averageOptions, setAverageOptions] = useState(DEFAULT_AVERAGE_COLORS_OPTIONS);
63
+ const { red, green, blue } = useMemo(() => {
64
+ return { red: new Color('red'), green: new Color('green'), blue: new Color('blue') };
65
+ }, []);
66
+ const mixRed = color.mix([red], mixOptions);
67
+ const mixGreen = color.mix([green], mixOptions);
68
+ const mixBlue = color.mix([blue], mixOptions);
69
+ const mixRGB = color.mix([red, green, blue], mixOptions);
70
+ const blendRed = color.blend(red, blendOptions);
71
+ const blendGreen = color.blend(green, blendOptions);
72
+ const blendBlue = color.blend(blue, blendOptions);
73
+ const averageRed = color.average([red], averageOptions);
74
+ const averageGreen = color.average([green], averageOptions);
75
+ const averageBlue = color.average([blue], averageOptions);
76
+ const averageRGB = color.average([red, green, blue], averageOptions);
77
+ return (_jsxs("div", { className: "w-full flex flex-col gap-4", children: [_jsxs(Card, { codeSnippet: getMixCodeSnippet(color.toHex8(), mixOptions), title: "Mix", children: [_jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-5 gap-2 mb-4", children: [_jsx(ColorBox, { color: color, label: color.toHex(), overlaySize: "SMALL", overlayText: "Original", width: "STRETCH" }), _jsx(ColorBox, { color: mixRed, label: mixRed.toHex(), overlaySize: "SMALL", overlayText: "+Red", width: "STRETCH" }), _jsx(ColorBox, { color: mixGreen, label: mixGreen.toHex(), overlaySize: "SMALL", overlayText: "+Green", width: "STRETCH" }), _jsx(ColorBox, { color: mixBlue, label: mixBlue.toHex(), overlaySize: "SMALL", overlayText: "+Blue", width: "STRETCH" }), _jsx(ColorBox, { color: mixRGB, label: mixRGB.toHex(), overlaySize: "SMALL", overlayText: "+RGB", width: "STRETCH" })] }), _jsx(MixColorsOptionInputs, { mixOptions: mixOptions, onOptionsChanged: setMixOptions })] }), _jsxs(Card, { codeSnippet: getBlendCodeSnippet(color.toHex8(), blendOptions), title: "Blend", children: [_jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-5 gap-2 mb-4", children: [_jsx(ColorBox, { color: color, label: color.toHex(), overlaySize: "SMALL", overlayText: "Original", width: "STRETCH" }), _jsx(ColorBox, { color: blendRed, label: blendRed.toHex(), overlaySize: "SMALL", overlayText: "+Red", width: "STRETCH" }), _jsx(ColorBox, { color: blendGreen, label: blendGreen.toHex(), overlaySize: "SMALL", overlayText: "+Green", width: "STRETCH" }), _jsx(ColorBox, { color: blendBlue, label: blendBlue.toHex(), overlaySize: "SMALL", overlayText: "+Blue", width: "STRETCH" }), _jsx(ColorBox, { color: isDarkMode ? new Color('#00000000') : new Color('#ffffff00'), label: "Not supported", overlaySize: "SMALL", overlayText: "+RGB (N/A)", width: "STRETCH" })] }), _jsx(BlendColorsOptionInputs, { blendOptions: blendOptions, onOptionsChanged: setBlendOptions })] }), _jsxs(Card, { codeSnippet: getAverageCodeSnippet(color.toHex8(), averageOptions), title: "Average", children: [_jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-5 gap-2 mb-4", children: [_jsx(ColorBox, { color: color, label: color.toHex(), overlaySize: "SMALL", overlayText: "Original", width: "STRETCH" }), _jsx(ColorBox, { color: averageRed, label: averageRed.toHex(), overlaySize: "SMALL", overlayText: "+Red", width: "STRETCH" }), _jsx(ColorBox, { color: averageGreen, label: averageGreen.toHex(), overlaySize: "SMALL", overlayText: "+Green", width: "STRETCH" }), _jsx(ColorBox, { color: averageBlue, label: averageBlue.toHex(), overlaySize: "SMALL", overlayText: "+Blue", width: "STRETCH" }), _jsx(ColorBox, { color: averageRGB, label: averageRGB.toHex(), overlaySize: "SMALL", overlayText: "+RGB", width: "STRETCH" })] }), _jsx(AverageColorsOptionInputs, { mixOptions: averageOptions, onOptionsChanged: setAverageOptions })] })] }));
78
+ }
@@ -0,0 +1,7 @@
1
+ import type { MixColorsOptions } from '../../../../dist';
2
+ interface Props {
3
+ mixOptions: MixColorsOptions;
4
+ onOptionsChanged: (options: MixColorsOptions) => void;
5
+ }
6
+ export declare function MixColorsOptionInputs({ mixOptions, onOptionsChanged }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { InputGroup } from '../../components/inputs/InputGroup';
3
+ import { Select } from '../../components/inputs/Select';
4
+ import { DEFAULT_MIX_COLORS_OPTIONS } from './colorCombinationDemo.consts';
5
+ export function MixColorsOptionInputs({ mixOptions, onOptionsChanged }) {
6
+ return (_jsxs(InputGroup, { onResetClicked: () => onOptionsChanged(DEFAULT_MIX_COLORS_OPTIONS), children: [_jsx(Select, { label: "Mix type", options: [
7
+ { label: 'Additive', value: 'ADDITIVE' },
8
+ { label: 'Subtractive', value: 'SUBTRACTIVE' },
9
+ ], value: mixOptions.type, onChange: (value) => onOptionsChanged({ ...mixOptions, type: value }) }), _jsx(Select, { label: "Mix space", options: [{ label: 'Linear RGB', value: 'LINEAR_RGB' }, 'RGB', 'HSL', 'LCH', 'OKLCH'], value: mixOptions.space, onChange: (value) => onOptionsChanged({ ...mixOptions, space: value }) })] }));
10
+ }
@@ -0,0 +1,4 @@
1
+ import type { AverageColorsOptions, BlendColorsOptions, MixColorsOptions } from '../../../../dist';
2
+ export declare const DEFAULT_MIX_COLORS_OPTIONS: MixColorsOptions;
3
+ export declare const DEFAULT_BLEND_COLORS_OPTIONS: BlendColorsOptions;
4
+ export declare const DEFAULT_AVERAGE_COLORS_OPTIONS: AverageColorsOptions;
@@ -0,0 +1,12 @@
1
+ export const DEFAULT_MIX_COLORS_OPTIONS = {
2
+ space: 'LINEAR_RGB',
3
+ type: 'ADDITIVE',
4
+ };
5
+ export const DEFAULT_BLEND_COLORS_OPTIONS = {
6
+ mode: 'NORMAL',
7
+ space: 'RGB',
8
+ ratio: 0.5,
9
+ };
10
+ export const DEFAULT_AVERAGE_COLORS_OPTIONS = {
11
+ space: 'LINEAR_RGB',
12
+ };
@@ -0,0 +1,10 @@
1
+ import { Color, type ColorGradientOptions } from '../../../../dist';
2
+ interface Props {
3
+ options: ColorGradientOptions;
4
+ showInterpolationOption?: boolean;
5
+ onOptionsChanged: (options: ColorGradientOptions) => void;
6
+ onOptionsReset: () => void;
7
+ onTargetColorChanged?: (targetColor: Color) => void;
8
+ }
9
+ export declare function GradientOptionInputs({ options, showInterpolationOption, onOptionsChanged, onOptionsReset, onTargetColorChanged, }: Props): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Color } from '../../../../dist';
4
+ import { InputGroup } from '../../components/inputs/InputGroup';
5
+ import { Select } from '../../components/inputs/Select';
6
+ import { NumberInput } from '../../components/inputs/NumberInput';
7
+ const TARGET_COLORS_NAMES = ['Red', 'Green', 'Blue', 'Black', 'White', 'Gray', 'Random'];
8
+ export function GradientOptionInputs({ options, showInterpolationOption = true, onOptionsChanged, onOptionsReset, onTargetColorChanged, }) {
9
+ const [selectedTargetColorName, setSelectedTargetColorName] = useState('Random');
10
+ const handleTargetColorNameChanged = (colorName) => {
11
+ if (!onTargetColorChanged) {
12
+ return;
13
+ }
14
+ setSelectedTargetColorName(colorName);
15
+ if (colorName === 'Random') {
16
+ onTargetColorChanged(new Color());
17
+ }
18
+ else {
19
+ onTargetColorChanged(new Color(colorName.toLowerCase()));
20
+ }
21
+ };
22
+ const handleOptionsReset = () => {
23
+ setSelectedTargetColorName('Random');
24
+ onOptionsReset();
25
+ };
26
+ return (_jsxs(InputGroup, { onResetClicked: handleOptionsReset, children: [onTargetColorChanged && (_jsx(Select, { label: "Target color", options: TARGET_COLORS_NAMES, value: selectedTargetColorName, onChange: handleTargetColorNameChanged })), _jsx(NumberInput, { label: "Stops", max: 10, min: 2, step: 1, value: options.stops, onChange: (value) => onOptionsChanged({ ...options, stops: value }) }), _jsx(Select, { label: "Color space", options: ['RGB', 'HSL', 'HSV', 'LCH', 'OKLCH'], value: options.space, onChange: (value) => onOptionsChanged({ ...options, space: value }) }), showInterpolationOption && (_jsx(Select, { label: "Interpolation", options: [
27
+ { label: 'Linear', value: 'LINEAR' },
28
+ { label: 'Bezier', value: 'BEZIER' },
29
+ ], value: options.interpolation, onChange: (value) => onOptionsChanged({ ...options, interpolation: value }) })), _jsx(Select, { label: "Easing", options: [
30
+ { label: 'Linear', value: 'LINEAR' },
31
+ { label: 'Ease in', value: 'EASE_IN' },
32
+ { label: 'Ease out', value: 'EASE_OUT' },
33
+ { label: 'Ease in/out', value: 'EASE_IN_OUT' },
34
+ ], value: typeof options.easing === 'string' ? options.easing : undefined, onChange: (value) => onOptionsChanged({ ...options, easing: value }) }), options.space !== 'RGB' && (_jsx(Select, { label: "Hue interpolation", options: [
35
+ { label: 'Cartesian', value: 'CARTESIAN' },
36
+ { label: 'Shortest', value: 'SHORTEST' },
37
+ { label: 'Longest', value: 'LONGEST' },
38
+ { label: 'Increasing', value: 'INCREASING' },
39
+ { label: 'Decreasing', value: 'DECREASING' },
40
+ { label: 'Raw', value: 'RAW' },
41
+ ], value: options.hueInterpolationMode, onChange: (value) => onOptionsChanged({ ...options, hueInterpolationMode: value }) }))] }));
42
+ }
@@ -0,0 +1,6 @@
1
+ import { Color } from '../../../../dist';
2
+ interface Props {
3
+ color: Color;
4
+ }
5
+ export declare function GradientThroughCard({ color }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from 'react';
3
+ import { Card } from '../../components/Card';
4
+ import { ColorBox } from '../../components/ColorBox';
5
+ import { GradientOptionInputs } from './GradientOptionInputs';
6
+ import { DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS } from './gradientOptions.consts';
7
+ const STOP_COLORS = ['Red', 'Green', 'Blue'];
8
+ function getGradientThroughCodeSnippet({ colorHex, options, }) {
9
+ const stops = options.stops ?? DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS.stops;
10
+ const space = options.space ?? DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS.space;
11
+ const interpolation = options.interpolation ?? DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS.interpolation;
12
+ const easing = options.easing ?? DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS.easing;
13
+ const clamp = options.clamp ?? DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS.clamp;
14
+ const hueInterpolationMode = options.hueInterpolationMode ?? DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS.hueInterpolationMode;
15
+ const easingInput = typeof easing === 'function' ? easing.toString() : `'${easing}'`;
16
+ const hueInterpolationInput = space !== 'RGB'
17
+ ? `,
18
+ hueInterpolationMode: '${hueInterpolationMode}'`
19
+ : '';
20
+ return `
21
+ const color = new Color('${colorHex}');
22
+ const stopColors = ['red', 'green', 'blue'];
23
+
24
+ const gradient = color.createGradientThrough(stopColors, {
25
+ stops: ${stops},
26
+ space: '${space}',
27
+ interpolation: '${interpolation}',
28
+ easing: ${easingInput},
29
+ clamp: ${clamp}${hueInterpolationInput},
30
+ });
31
+ `;
32
+ }
33
+ export function GradientThroughCard({ color }) {
34
+ const [options, setOptions] = useState(DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS);
35
+ const colorBoxes = useMemo(() => {
36
+ const gradientStops = color.createGradientThrough(STOP_COLORS, options);
37
+ return gradientStops.map((color, index) => {
38
+ const colorHex = color.toHex();
39
+ let title;
40
+ if (index === 0) {
41
+ title = 'Start';
42
+ }
43
+ return (_jsx(ColorBox, { color: color, label: colorHex, overlaySize: "SMALL", overlayText: title, width: "STRETCH" }, colorHex));
44
+ });
45
+ }, [color, options]);
46
+ return (_jsxs(Card, { codeSnippet: getGradientThroughCodeSnippet({
47
+ colorHex: color.toHex8(),
48
+ options,
49
+ }), title: "Gradient through red, green, and blue", children: [_jsx("div", { className: "flex flex-col sm:flex-row gap-2 mb-4", children: colorBoxes }), _jsx(GradientOptionInputs, { options: options, onOptionsReset: () => setOptions(DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS), onOptionsChanged: setOptions })] }));
50
+ }
@@ -0,0 +1,6 @@
1
+ import { Color } from '../../../../dist';
2
+ interface Props {
3
+ color: Color;
4
+ }
5
+ export declare function GradientToCard({ color }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Color } from '../../../../dist';
4
+ import { Card } from '../../components/Card';
5
+ import { ColorBox } from '../../components/ColorBox';
6
+ import { GradientOptionInputs } from './GradientOptionInputs';
7
+ import { DEFAULT_COLOR_GRADIENT_TO_OPTIONS } from './gradientOptions.consts';
8
+ function getGradientToCodeSnippet({ colorHex, targetColorHex, options, }) {
9
+ const stops = options.stops ?? DEFAULT_COLOR_GRADIENT_TO_OPTIONS.stops;
10
+ const space = options.space ?? DEFAULT_COLOR_GRADIENT_TO_OPTIONS.space;
11
+ const easing = options.easing ?? DEFAULT_COLOR_GRADIENT_TO_OPTIONS.easing;
12
+ const clamp = options.clamp ?? DEFAULT_COLOR_GRADIENT_TO_OPTIONS.clamp;
13
+ const hueInterpolationMode = options.hueInterpolationMode ?? DEFAULT_COLOR_GRADIENT_TO_OPTIONS.hueInterpolationMode;
14
+ const easingInput = typeof easing === 'function' ? easing.toString() : `'${easing}'`;
15
+ const hueInterpolationInput = space !== 'RGB'
16
+ ? `,
17
+ hueInterpolationMode: '${hueInterpolationMode}'`
18
+ : '';
19
+ return `
20
+ const color = new Color('${colorHex}');
21
+ const targetColor = new Color('${targetColorHex}');
22
+
23
+ const gradient = color.createGradientTo(targetColor, {
24
+ stops: ${stops},
25
+ space: '${space}',
26
+ easing: ${easingInput},
27
+ clamp: ${clamp}${hueInterpolationInput},
28
+ });
29
+ `;
30
+ }
31
+ export function GradientToCard({ color }) {
32
+ const [targetColor, setTargetColor] = useState(new Color());
33
+ const [options, setOptions] = useState(DEFAULT_COLOR_GRADIENT_TO_OPTIONS);
34
+ const gradientColors = color.createGradientTo(targetColor, options);
35
+ const handleOptionsReset = () => {
36
+ setOptions(DEFAULT_COLOR_GRADIENT_TO_OPTIONS);
37
+ setTargetColor(new Color());
38
+ };
39
+ return (_jsxs(Card, { codeSnippet: getGradientToCodeSnippet({
40
+ colorHex: color.toHex8(),
41
+ targetColorHex: targetColor.toHex8(),
42
+ options,
43
+ }), title: "Gradient to", children: [_jsx("div", { className: "flex flex-col sm:flex-row gap-2 mb-4", children: gradientColors.map((color, index) => {
44
+ const colorHex = color.toHex();
45
+ let title;
46
+ if (index === 0) {
47
+ title = 'Start';
48
+ }
49
+ else if (index === gradientColors.length - 1) {
50
+ title = 'Target';
51
+ }
52
+ return (_jsx(ColorBox, { color: color, label: colorHex, overlaySize: "SMALL", overlayText: title, width: "STRETCH" }, index));
53
+ }) }), _jsx(GradientOptionInputs, { options: options, showInterpolationOption: false, onOptionsChanged: setOptions, onOptionsReset: handleOptionsReset, onTargetColorChanged: setTargetColor })] }));
54
+ }
@@ -0,0 +1,6 @@
1
+ import { Color } from '../../../../dist';
2
+ interface Props {
3
+ color: Color;
4
+ }
5
+ export declare function GradientsDemo({ color }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { GradientThroughCard } from './GradientThroughCard';
3
+ import { GradientToCard } from './GradientToCard';
4
+ export function GradientsDemo({ color }) {
5
+ return (_jsxs("div", { className: "w-full flex flex-col gap-4", children: [_jsx(GradientToCard, { color: color }), _jsx(GradientThroughCard, { color: color })] }));
6
+ }
@@ -0,0 +1,3 @@
1
+ import type { ColorGradientOptions } from '../../../../dist';
2
+ export declare const DEFAULT_COLOR_GRADIENT_TO_OPTIONS: ColorGradientOptions;
3
+ export declare const DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS: ColorGradientOptions;
@@ -0,0 +1,16 @@
1
+ const DEFAULT_COLOR_GRADIENT_OPTIONS = {
2
+ stops: 2,
3
+ space: 'RGB',
4
+ interpolation: 'LINEAR',
5
+ easing: 'LINEAR',
6
+ clamp: true,
7
+ hueInterpolationMode: 'CARTESIAN',
8
+ };
9
+ export const DEFAULT_COLOR_GRADIENT_TO_OPTIONS = {
10
+ ...DEFAULT_COLOR_GRADIENT_OPTIONS,
11
+ stops: 5,
12
+ };
13
+ export const DEFAULT_COLOR_GRADIENT_THROUGH_OPTIONS = {
14
+ ...DEFAULT_COLOR_GRADIENT_OPTIONS,
15
+ stops: 6,
16
+ };
@@ -0,0 +1,6 @@
1
+ import { Color } from '../../../../dist';
2
+ interface Props {
3
+ color: Color;
4
+ }
5
+ export declare function ColorPaletteDemo({ color }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { ColorSwatch } from '../ColorSwatch';
4
+ import { PaletteHarmonyOptions } from './PaletteHarmonyOptions';
5
+ import { PaletteGenerationOptions } from './PaletteGenerationOptions';
6
+ import { VSpace } from '../../components/VSpace';
7
+ const DEFAULT_GENERATE_COLOR_PALETTE_OPTIONS = {
8
+ neutralHarmonization: {
9
+ tintChromaFactor: 0.1,
10
+ maxTintChroma: 0.04,
11
+ },
12
+ semanticHarmonization: {
13
+ huePull: 0.1,
14
+ chromaRange: [0.02, 0.25],
15
+ },
16
+ swatchOptions: {
17
+ centerOn500: true,
18
+ extended: false,
19
+ },
20
+ };
21
+ export function ColorPaletteDemo({ color }) {
22
+ const [selectedHarmony, setSelectedHarmony] = useState('COMPLEMENTARY');
23
+ const [options, setOptions] = useState(DEFAULT_GENERATE_COLOR_PALETTE_OPTIONS);
24
+ const palette = color.getColorPalette(selectedHarmony, options);
25
+ return (_jsxs("div", { className: "w-full flex flex-col gap-4", children: [_jsxs("div", { children: [_jsx(PaletteHarmonyOptions, { selectedHarmony: selectedHarmony, onHarmonySelectionChanged: setSelectedHarmony }), _jsx(VSpace, { height: 8 }), _jsx(PaletteGenerationOptions, { options: options, onOptionsChanged: setOptions, onReset: () => setOptions(DEFAULT_GENERATE_COLOR_PALETTE_OPTIONS) })] }), _jsx(ColorSwatch, { swatch: palette.primary, title: "Primary", withLabels: true }), palette.secondaryColors.map((swatch, index) => (_jsx(ColorSwatch, { title: `Secondary${palette.secondaryColors.length > 1 ? ` ${index + 1}` : ''}`, swatch: swatch, withLabels: true }, index))), _jsx(ColorSwatch, { swatch: palette.neutrals, title: "Neutrals", withLabels: true }), _jsx(ColorSwatch, { swatch: palette.tintedNeutrals, title: "Tinted neutrals", withLabels: true }), _jsx(ColorSwatch, { swatch: palette.info, title: "Info (semantic)", withLabels: true }), _jsx(ColorSwatch, { swatch: palette.positive, title: "Positive (semantic)", withLabels: true }), _jsx(ColorSwatch, { swatch: palette.negative, title: "Negative (semantic)", withLabels: true }), _jsx(ColorSwatch, { swatch: palette.warning, title: "Warning (semantic)", withLabels: true }), _jsx(ColorSwatch, { swatch: palette.special, title: "Special (semantic)", withLabels: true })] }));
26
+ }
@@ -0,0 +1,8 @@
1
+ import type { GenerateColorPaletteOptions } from '../../../../dist';
2
+ interface Props {
3
+ options: GenerateColorPaletteOptions;
4
+ onOptionsChanged: (options: GenerateColorPaletteOptions) => void;
5
+ onReset: () => void;
6
+ }
7
+ export declare function PaletteGenerationOptions({ options, onOptionsChanged, onReset }: Props): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Checkbox } from '../../components/inputs/Checkbox';
3
+ import { InputGroup } from '../../components/inputs/InputGroup';
4
+ import { NumberInput } from '../../components/inputs/NumberInput';
5
+ export function PaletteGenerationOptions({ options, onOptionsChanged, onReset }) {
6
+ return (_jsxs(InputGroup, { onResetClicked: onReset, children: [_jsx(NumberInput, { label: _jsxs("span", { children: [_jsx("u", { children: "Tinted neutrals" }), " chroma factor"] }), max: 1, min: 0, step: 0.01, value: options.neutralHarmonization?.tintChromaFactor, onChange: (value) => onOptionsChanged({
7
+ ...options,
8
+ neutralHarmonization: {
9
+ ...options.neutralHarmonization,
10
+ tintChromaFactor: value,
11
+ },
12
+ }) }), _jsx(NumberInput, { label: _jsxs("span", { children: [_jsx("u", { children: "Tinted neutrals" }), " max chroma"] }), max: 1, min: 0, step: 0.01, value: options.neutralHarmonization?.maxTintChroma, onChange: (value) => onOptionsChanged({
13
+ ...options,
14
+ neutralHarmonization: {
15
+ ...options.neutralHarmonization,
16
+ maxTintChroma: value,
17
+ },
18
+ }) }), _jsx(NumberInput, { label: _jsxs("span", { children: [_jsx("u", { children: "Semantic" }), " hue pull"] }), max: 1, min: 0, step: 0.01, value: options.semanticHarmonization?.huePull, onChange: (value) => onOptionsChanged({
19
+ ...options,
20
+ semanticHarmonization: {
21
+ ...options.semanticHarmonization,
22
+ huePull: value,
23
+ },
24
+ }) }), _jsx("label", { children: _jsxs("div", { className: "flex flex-row flex-wrap items-center gap-2", children: [_jsx("u", { children: "Semantic" }), " chroma range:", _jsx(NumberInput, { max: 1, min: 0, step: 0.01, value: options.semanticHarmonization?.chromaRange?.[0], onChange: (value) => onOptionsChanged({
25
+ ...options,
26
+ semanticHarmonization: {
27
+ ...options.semanticHarmonization,
28
+ chromaRange: [value, options.semanticHarmonization?.chromaRange?.[1] ?? value],
29
+ },
30
+ }) }), "-", _jsx(NumberInput, { max: 1, min: 0, step: 0.01, value: options.semanticHarmonization?.chromaRange?.[1], onChange: (value) => onOptionsChanged({
31
+ ...options,
32
+ semanticHarmonization: {
33
+ ...options.semanticHarmonization,
34
+ chromaRange: [options.semanticHarmonization?.chromaRange?.[0] ?? value, value],
35
+ },
36
+ }) })] }) }), _jsx(Checkbox, { isChecked: options.swatchOptions?.centerOn500, label: "Centered swatches", onChange: (centerOn500) => {
37
+ onOptionsChanged({
38
+ ...options,
39
+ swatchOptions: {
40
+ ...options.swatchOptions,
41
+ centerOn500,
42
+ },
43
+ });
44
+ } }), _jsx(Checkbox, { isChecked: options.swatchOptions?.extended, label: "Extended swatches", onChange: (extended) => {
45
+ onOptionsChanged({
46
+ ...options,
47
+ swatchOptions: {
48
+ ...options.swatchOptions,
49
+ extended,
50
+ },
51
+ });
52
+ } })] }));
53
+ }
@@ -0,0 +1,7 @@
1
+ import type { ColorHarmony } from '../../../../dist';
2
+ interface Props {
3
+ selectedHarmony: ColorHarmony;
4
+ onHarmonySelectionChanged: (harmony: ColorHarmony) => void;
5
+ }
6
+ export declare function PaletteHarmonyOptions({ selectedHarmony, onHarmonySelectionChanged }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const PALETTE_HARMONY_RADIO_GROUP_NAME = 'palette-color-harmony';
3
+ export function PaletteHarmonyOptions({ selectedHarmony, onHarmonySelectionChanged }) {
4
+ return (_jsxs("div", { className: "w-full flex flex-row justify-center items-center gap-4 flex-wrap", children: [_jsxs("label", { className: "flex flex-row items-center gap-1", children: [_jsx("input", { checked: selectedHarmony === 'COMPLEMENTARY', name: PALETTE_HARMONY_RADIO_GROUP_NAME, type: "radio", value: "COMPLEMENTARY", onChange: () => onHarmonySelectionChanged('COMPLEMENTARY') }), "Complementary"] }), _jsxs("label", { className: "flex flex-row items-center gap-1", children: [_jsx("input", { checked: selectedHarmony === 'SPLIT_COMPLEMENTARY', name: PALETTE_HARMONY_RADIO_GROUP_NAME, type: "radio", value: "SPLIT_COMPLEMENTARY", onChange: () => onHarmonySelectionChanged('SPLIT_COMPLEMENTARY') }), "Split complementary"] }), _jsxs("label", { className: "flex flex-row items-center gap-1", children: [_jsx("input", { checked: selectedHarmony === 'TRIADIC', name: PALETTE_HARMONY_RADIO_GROUP_NAME, type: "radio", value: "TRIADIC", onChange: () => onHarmonySelectionChanged('TRIADIC') }), "Triadic"] }), _jsxs("label", { className: "flex flex-row items-center gap-1", children: [_jsx("input", { checked: selectedHarmony === 'SQUARE', name: PALETTE_HARMONY_RADIO_GROUP_NAME, type: "radio", value: "SQUARE", onChange: () => onHarmonySelectionChanged('SQUARE') }), "Square"] }), _jsxs("label", { className: "flex flex-row items-center gap-1", children: [_jsx("input", { checked: selectedHarmony === 'TETRADIC', name: PALETTE_HARMONY_RADIO_GROUP_NAME, type: "radio", value: "TETRADIC", onChange: () => onHarmonySelectionChanged('TETRADIC') }), "Tetradic"] }), _jsxs("label", { className: "flex flex-row items-center gap-1", children: [_jsx("input", { checked: selectedHarmony === 'ANALOGOUS', name: PALETTE_HARMONY_RADIO_GROUP_NAME, type: "radio", value: "ANALOGOUS", onChange: () => onHarmonySelectionChanged('ANALOGOUS') }), "Analogous"] }), _jsxs("label", { className: "flex flex-row items-center gap-1", children: [_jsx("input", { checked: selectedHarmony === 'MONOCHROMATIC', name: PALETTE_HARMONY_RADIO_GROUP_NAME, type: "radio", value: "MONOCHROMATIC", onChange: () => onHarmonySelectionChanged('MONOCHROMATIC') }), "Monochromatic"] })] }));
5
+ }
@@ -0,0 +1 @@
1
+ import './index.css';
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { StrictMode } from 'react';
3
+ import { createRoot } from 'react-dom/client';
4
+ import { RouterProvider, createBrowserRouter } from 'react-router-dom';
5
+ import { DemoPage } from './pages/DemoPage';
6
+ import { PlaygroundPage } from './pages/PlaygroundPage';
7
+ import { ToastProvider } from './toast';
8
+ import './index.css';
9
+ const basename = (import.meta.env.BASE_URL ?? '/').replace(/\/$/, '');
10
+ const router = createBrowserRouter([
11
+ { path: '/', element: _jsx(DemoPage, {}) },
12
+ { path: '/playground', element: _jsx(PlaygroundPage, {}) },
13
+ ], { basename });
14
+ createRoot(document.getElementById('root')).render(_jsx(StrictMode, { children: _jsx(ToastProvider, { children: _jsx(RouterProvider, { router: router }) }) }));
@@ -0,0 +1 @@
1
+ export declare function DemoPage(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { AppFooter } from '../AppFooter';
4
+ import { AppHeader } from '../AppHeader';
5
+ import { SectionContainer } from '../components/SectionContainer';
6
+ import { DemoSectionIDs } from '../components/utils';
7
+ import { VSpace } from '../components/VSpace';
8
+ import { ColorDemo } from '../demo/ColorDemo';
9
+ import { Playground } from '../playground/Playground';
10
+ import { PageHead } from '../seo/PageHead';
11
+ import { StructuredData } from '../seo/StructuredData';
12
+ export function DemoPage() {
13
+ const pageStructuredData = useMemo(() => ({
14
+ '@context': 'https://schema.org',
15
+ '@type': 'WebPage',
16
+ '@id': 'https://rteammco.github.io/omni-color/',
17
+ name: 'omni-color color library demo',
18
+ url: 'https://rteammco.github.io/omni-color/',
19
+ inLanguage: 'en',
20
+ isPartOf: {
21
+ '@id': 'https://rteammco.github.io/omni-color/#website',
22
+ },
23
+ about: {
24
+ '@id': 'https://rteammco.github.io/omni-color/#software',
25
+ },
26
+ }), []);
27
+ return (_jsxs(_Fragment, { children: [_jsx(PageHead, { description: "Explore omni-color color utilities, gradients, harmonies, and palettes with live previews and interactive demos.", path: "/", title: "omni-color | Interactive Demo" }), _jsx(StructuredData, { data: pageStructuredData }), _jsx("div", { className: "w-full p-6 text-center", children: _jsxs("div", { className: "max-w-7xl justify-self-center", children: [_jsx(AppHeader, {}), _jsx(VSpace, { height: 40 }), _jsx(ColorDemo, {}), _jsx(VSpace, { height: 40 }), _jsx(SectionContainer, { description: "You can experiment with the Color object here", openSectionInNewTabLink: "/omni-color/playground", sectionID: DemoSectionIDs.PLAYGROUND, title: "Code playground", children: _jsx(Playground, {}) }), _jsx(VSpace, { height: 40 }), _jsx(AppFooter, {})] }) })] }));
28
+ }
@@ -0,0 +1 @@
1
+ export declare function PlaygroundPage(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { AppHeader } from '../AppHeader';
4
+ import { VSpace } from '../components/VSpace';
5
+ import { Playground } from '../playground/Playground';
6
+ import { PageHead } from '../seo/PageHead';
7
+ import { StructuredData } from '../seo/StructuredData';
8
+ export function PlaygroundPage() {
9
+ const pageStructuredData = useMemo(() => ({
10
+ '@context': 'https://schema.org',
11
+ '@type': 'WebPage',
12
+ '@id': 'https://rteammco.github.io/omni-color/playground',
13
+ name: 'omni-color playground',
14
+ url: 'https://rteammco.github.io/omni-color/playground',
15
+ inLanguage: 'en',
16
+ isPartOf: {
17
+ '@id': 'https://rteammco.github.io/omni-color/#website',
18
+ },
19
+ about: {
20
+ '@id': 'https://rteammco.github.io/omni-color/#software',
21
+ },
22
+ }), []);
23
+ return (_jsxs(_Fragment, { children: [_jsx(PageHead, { description: "Run omni-color JavaScript snippets in the browser to explore conversions, palettes, and color math interactively.", path: "/playground", title: "omni-color | Code Playground" }), _jsx(StructuredData, { data: pageStructuredData }), _jsxs("div", { className: "p-6 w-full text-center", children: [_jsx(AppHeader, { pageDescription: "Code Playground" }), _jsx(VSpace, { height: 40 }), _jsx(Playground, {})] })] }));
24
+ }
@@ -0,0 +1 @@
1
+ export declare function Playground(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { CodeExecutionStatus, getRandomStarterCode, tryToRunCode } from './playgroundUtils';
4
+ import { Color } from '../../../dist';
5
+ import { ColorBox } from '../components/ColorBox';
6
+ import { Card } from '../components/Card';
7
+ export function Playground() {
8
+ const initialCode = useMemo(() => getRandomStarterCode(), []);
9
+ const [code, setCode] = useState(initialCode);
10
+ const [returnedColor, setReturnedColor] = useState(null);
11
+ const [codeErrorMessage, setCodeErrorMessage] = useState(null);
12
+ const [codeConsoleOutputs, setCodeConsoleOutputs] = useState(null);
13
+ const placeholderColor = useMemo(() => new Color('white'), []);
14
+ const executeCode = useCallback((newCode) => {
15
+ tryToRunCode(newCode).then((res) => {
16
+ if (res.status === CodeExecutionStatus.SUCCESS) {
17
+ setCodeErrorMessage(null);
18
+ setReturnedColor(res.color ?? null);
19
+ }
20
+ else {
21
+ setCodeErrorMessage(res.errorMessage ?? `Something went wrong: ${res.status}`);
22
+ }
23
+ if (res.status !== CodeExecutionStatus.CODE_ERROR) {
24
+ setCodeConsoleOutputs(res.consoleOutputs ?? null);
25
+ }
26
+ });
27
+ }, []);
28
+ const handleCodeChanged = useCallback((event) => {
29
+ const newCode = event.target.value;
30
+ setCode(newCode);
31
+ executeCode(newCode);
32
+ }, [executeCode]);
33
+ const handleResetOrInitCode = useCallback(() => {
34
+ const newCode = getRandomStarterCode();
35
+ setCode(newCode);
36
+ executeCode(newCode);
37
+ }, [executeCode]);
38
+ useEffect(() => {
39
+ executeCode(initialCode);
40
+ }, [executeCode, initialCode]);
41
+ return (_jsxs("div", { className: "w-full flex flex-col items-center", children: [_jsxs("div", { className: "w-full flex flex-col gap-4", children: [_jsxs("div", { children: [_jsx("textarea", { className: `px-4 py-2 w-full h-60 border-1 ${codeErrorMessage ? 'border-red-500' : 'border-gray-200'} rounded-md shadow-md font-mono text-sm`, spellCheck: false, value: code, onChange: handleCodeChanged }), codeErrorMessage && (_jsx("div", { className: "flex flex-row items-center text-sm text-red-500 h-6", children: codeErrorMessage }))] }), _jsx(Card, { title: "Output", children: _jsxs("div", { className: "flex flex-col gap-4", children: [_jsx("div", { className: "w-full", children: _jsx(ColorBox, { color: returnedColor ?? placeholderColor, label: returnedColor?.toHex(), overlaySize: "SMALL", overlayText: "Returned color", width: "STRETCH" }) }), codeConsoleOutputs && codeConsoleOutputs.length > 0 && (_jsx("div", { className: "flex flex-col items-center gap-3 mb-3 w-full", children: _jsx("div", { className: "flex flex-col items-start gap-0.5 w-full", children: codeConsoleOutputs.map((output, index) => (_jsxs("pre", { className: "text-sm whitespace-pre-wrap break-words text-left w-full", children: ["> ", output] }, index))) }) }))] }) })] }), _jsx("button", { className: "mt-4", onClick: handleResetOrInitCode, children: "Reset playground" })] }));
42
+ }
@@ -0,0 +1,16 @@
1
+ import { Color } from '../../../dist';
2
+ export declare function getRandomStarterCode(): string;
3
+ export declare enum CodeExecutionStatus {
4
+ CODE_ERROR = "CODE_ERROR",
5
+ NO_RETURNED_VALUE = "NO_RETURNED_VALUE",
6
+ INVALID_RETURNED_VALUE = "INVALID_RETURNED_VALUE",
7
+ SUCCESS = "SUCCESS"
8
+ }
9
+ interface RunCodeResults {
10
+ color?: Color;
11
+ consoleOutputs?: string[];
12
+ errorMessage?: string;
13
+ status: CodeExecutionStatus;
14
+ }
15
+ export declare function tryToRunCode(code: string): Promise<RunCodeResults>;
16
+ export {};