@digdir/designsystemet 0.1.0-alpha.8 → 0.1.0-next.20

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 (114) hide show
  1. package/dist/bin/designsystemet.js +34 -0
  2. package/dist/src/colors/colorUtils.js +230 -0
  3. package/dist/src/colors/index.js +3 -0
  4. package/dist/src/colors/themeUtils.js +244 -0
  5. package/dist/src/colors/types.js +0 -0
  6. package/dist/src/init/createTokensPackage.js +250 -0
  7. package/dist/src/init/generateMetadataJson.js +21 -0
  8. package/dist/src/init/generateThemesJson.js +59 -0
  9. package/dist/src/init/index.js +10 -0
  10. package/dist/src/init/nextStepsMarkdown.js +92 -0
  11. package/dist/src/init/template/default-files/README.md +10 -0
  12. package/dist/src/init/template/default-files/design-tokens/README.md +3 -0
  13. package/dist/src/init/template/default-files/design-tokens/primitives/globals.json +197 -0
  14. package/dist/src/init/template/default-files/design-tokens/primitives/typography/default.json +86 -0
  15. package/dist/src/init/template/default-files/design-tokens/semantic/color.json +562 -0
  16. package/dist/src/init/template/default-files/design-tokens/semantic/style.json +543 -0
  17. package/dist/src/init/template/prettier.config.js +5 -0
  18. package/dist/src/init/template/template-files/design-tokens/primitives/colors/contrast/global.json +376 -0
  19. package/dist/src/init/template/template-files/design-tokens/primitives/colors/contrast/theme-template.json +314 -0
  20. package/dist/src/init/template/template-files/design-tokens/primitives/colors/dark/global.json +376 -0
  21. package/dist/src/init/template/template-files/design-tokens/primitives/colors/dark/theme-template.json +314 -0
  22. package/dist/src/init/template/template-files/design-tokens/primitives/colors/light/global.json +376 -0
  23. package/dist/src/init/template/template-files/design-tokens/primitives/colors/light/theme-template.json +314 -0
  24. package/dist/src/init/template/template-files/design-tokens/themes/theme-template.json +314 -0
  25. package/dist/src/init/template/template-files/package.json +24 -0
  26. package/dist/src/init/utils.js +15 -0
  27. package/dist/src/migrations/beta-to-v1.js +344 -0
  28. package/dist/src/migrations/codemods/css/plugins.js +47 -0
  29. package/dist/src/migrations/codemods/css/run.js +19 -0
  30. package/dist/src/migrations/codemods/jsx/classname-prefix.js +63 -0
  31. package/dist/src/migrations/codemods/jsx/run.js +22 -0
  32. package/dist/src/migrations/index.js +9 -0
  33. package/dist/src/migrations/react-beta-to-v1.js +5 -0
  34. package/dist/src/tokens/actions.js +33 -0
  35. package/dist/src/tokens/build.js +74 -0
  36. package/dist/src/tokens/configs.js +223 -0
  37. package/dist/src/tokens/formats/css.js +170 -0
  38. package/dist/src/tokens/formats/js-tokens.js +31 -0
  39. package/dist/src/tokens/transformers.js +47 -0
  40. package/dist/src/tokens/utils/noCase.js +28 -0
  41. package/dist/src/tokens/utils/permutateThemes.js +63 -0
  42. package/dist/src/tokens/utils/utils.js +14 -0
  43. package/package.json +26 -12
  44. package/LICENSE +0 -7
  45. package/dist/build/bin/designsystemet.js +0 -50
  46. package/dist/build/src/colors/colorUtils.js +0 -314
  47. package/dist/build/src/colors/index.js +0 -3
  48. package/dist/build/src/colors/themeUtils.js +0 -290
  49. package/dist/build/src/colors/types.js +0 -1
  50. package/dist/build/src/migrations/beta-to-v1.js +0 -341
  51. package/dist/build/src/migrations/codemods/css/plugins.js +0 -45
  52. package/dist/build/src/migrations/codemods/css/run.js +0 -17
  53. package/dist/build/src/migrations/codemods/jsx/classname-prefix.js +0 -80
  54. package/dist/build/src/migrations/codemods/jsx/run.js +0 -19
  55. package/dist/build/src/migrations/index.js +0 -6
  56. package/dist/build/src/migrations/react-beta-to-v1.js +0 -2
  57. package/dist/build/src/test/jsx-test.js +0 -10
  58. package/dist/build/src/tokens/actions.js +0 -20
  59. package/dist/build/src/tokens/build.js +0 -63
  60. package/dist/build/src/tokens/configs.js +0 -228
  61. package/dist/build/src/tokens/formats/css-classes.js +0 -53
  62. package/dist/build/src/tokens/formats/css-variables.js +0 -39
  63. package/dist/build/src/tokens/formats/js-tokens.js +0 -29
  64. package/dist/build/src/tokens/transformers.js +0 -44
  65. package/dist/build/src/tokens/utils/noCase.js +0 -30
  66. package/dist/build/src/tokens/utils/permutateThemes.js +0 -56
  67. package/dist/build/src/tokens/utils/utils.js +0 -21
  68. package/dist/build/tsconfig.tsbuildinfo +0 -1
  69. package/dist/types/bin/designsystemet.d.ts +0 -3
  70. package/dist/types/bin/designsystemet.d.ts.map +0 -1
  71. package/dist/types/src/colors/colorUtils.d.ts +0 -118
  72. package/dist/types/src/colors/colorUtils.d.ts.map +0 -1
  73. package/dist/types/src/colors/index.d.ts +0 -4
  74. package/dist/types/src/colors/index.d.ts.map +0 -1
  75. package/dist/types/src/colors/themeUtils.d.ts +0 -101
  76. package/dist/types/src/colors/themeUtils.d.ts.map +0 -1
  77. package/dist/types/src/colors/types.d.ts +0 -16
  78. package/dist/types/src/colors/types.d.ts.map +0 -1
  79. package/dist/types/src/migrations/beta-to-v1.d.ts +0 -3
  80. package/dist/types/src/migrations/beta-to-v1.d.ts.map +0 -1
  81. package/dist/types/src/migrations/codemods/css/plugins.d.ts +0 -6
  82. package/dist/types/src/migrations/codemods/css/plugins.d.ts.map +0 -1
  83. package/dist/types/src/migrations/codemods/css/run.d.ts +0 -8
  84. package/dist/types/src/migrations/codemods/css/run.d.ts.map +0 -1
  85. package/dist/types/src/migrations/codemods/jsx/classname-prefix.d.ts +0 -10
  86. package/dist/types/src/migrations/codemods/jsx/classname-prefix.d.ts.map +0 -1
  87. package/dist/types/src/migrations/codemods/jsx/run.d.ts +0 -7
  88. package/dist/types/src/migrations/codemods/jsx/run.d.ts.map +0 -1
  89. package/dist/types/src/migrations/index.d.ts +0 -6
  90. package/dist/types/src/migrations/index.d.ts.map +0 -1
  91. package/dist/types/src/migrations/react-beta-to-v1.d.ts +0 -3
  92. package/dist/types/src/migrations/react-beta-to-v1.d.ts.map +0 -1
  93. package/dist/types/src/test/jsx-test.d.ts +0 -4
  94. package/dist/types/src/test/jsx-test.d.ts.map +0 -1
  95. package/dist/types/src/tokens/actions.d.ts +0 -3
  96. package/dist/types/src/tokens/actions.d.ts.map +0 -1
  97. package/dist/types/src/tokens/build.d.ts +0 -11
  98. package/dist/types/src/tokens/build.d.ts.map +0 -1
  99. package/dist/types/src/tokens/configs.d.ts +0 -23
  100. package/dist/types/src/tokens/configs.d.ts.map +0 -1
  101. package/dist/types/src/tokens/formats/css-classes.d.ts +0 -6
  102. package/dist/types/src/tokens/formats/css-classes.d.ts.map +0 -1
  103. package/dist/types/src/tokens/formats/css-variables.d.ts +0 -3
  104. package/dist/types/src/tokens/formats/css-variables.d.ts.map +0 -1
  105. package/dist/types/src/tokens/formats/js-tokens.d.ts +0 -6
  106. package/dist/types/src/tokens/formats/js-tokens.d.ts.map +0 -1
  107. package/dist/types/src/tokens/transformers.d.ts +0 -5
  108. package/dist/types/src/tokens/transformers.d.ts.map +0 -1
  109. package/dist/types/src/tokens/utils/noCase.d.ts +0 -11
  110. package/dist/types/src/tokens/utils/noCase.d.ts.map +0 -1
  111. package/dist/types/src/tokens/utils/permutateThemes.d.ts +0 -7
  112. package/dist/types/src/tokens/utils/permutateThemes.d.ts.map +0 -1
  113. package/dist/types/src/tokens/utils/utils.d.ts +0 -17
  114. package/dist/types/src/tokens/utils/utils.d.ts.map +0 -1
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { Argument, Command, program } from "@commander-js/extra-typings";
3
+ import chalk from "chalk";
4
+ import migrations from "../src/migrations/index.js";
5
+ import { run } from "../src/tokens/build.js";
6
+ import { makeInitCommand } from "../src/init/index.js";
7
+ program.name("Designsystemet").description("CLI for working with Designsystemet");
8
+ program.command("tokens").showHelpAfterError().description("run Designsystemet token builder").option("-t, --tokens [string]", `Path to ${chalk.blue("design-tokens")}`, "./design-tokens").option("-o, --out [string]", `Output directory for built ${chalk.blue("design-tokens")}`, "./dist/tokens").option("-p, --preview", "Generate preview token.ts files", false).action((opts) => {
9
+ const tokens = typeof opts.tokens === "string" ? opts.tokens : "./design-tokens";
10
+ const out = typeof opts.out === "string" ? opts.out : "./dist/tokens";
11
+ const preview = opts.preview;
12
+ console.log(`Bulding tokens in ${chalk.green(tokens)}`);
13
+ return run({ tokens, out, preview });
14
+ });
15
+ program.command("migrate").showHelpAfterError().description("run a Designsystemet migration").addArgument(new Argument("[migration]", "Available migrations").choices(Object.keys(migrations))).option("-l --list", "List available migrations").option("-g --glob <glob>", "Glob for files upon which to apply the migration", "./**/*.(tsx|css)").action((migrationKey, opts) => {
16
+ const { glob, list } = opts;
17
+ if (list) {
18
+ Object.keys(migrations).forEach((key) => {
19
+ console.log(key);
20
+ });
21
+ } else if (migrationKey) {
22
+ const migration = migrations[migrationKey];
23
+ if (!migration) {
24
+ console.error("Migration not found!");
25
+ throw "Aborting";
26
+ }
27
+ console.log(`Applying migration ${chalk.blue(migrationKey)} with glob: ${chalk.green(glob)}`);
28
+ migration?.(glob).then(() => console.log(`Migration ${chalk.blue(migrationKey)} finished`)).catch((error) => console.log(error));
29
+ } else {
30
+ console.log("Migrate: please specify a migration name or --list");
31
+ }
32
+ });
33
+ program.addCommand(makeInitCommand(new Command("init")));
34
+ await program.parseAsync(process.argv);
@@ -0,0 +1,230 @@
1
+ import { Hsluv } from "hsluv";
2
+ import chroma from "chroma-js";
3
+ import { APCAcontrast, sRGBtoY } from "apca-w3";
4
+ const hexToCssHsl = (hex, valuesOnly = false) => {
5
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
6
+ let r = 0;
7
+ let g = 0;
8
+ let b = 0;
9
+ let cssString = "";
10
+ if (result) {
11
+ r = parseInt(result[1], 16);
12
+ g = parseInt(result[2], 16);
13
+ b = parseInt(result[3], 16);
14
+ }
15
+ r /= 255, g /= 255, b /= 255;
16
+ const max = Math.max(r, g, b), min = Math.min(r, g, b);
17
+ let h, s, l = (max + min) / 2;
18
+ if (max == min) {
19
+ h = s = 0;
20
+ } else {
21
+ const d = max - min;
22
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
23
+ switch (max) {
24
+ case r:
25
+ h = (g - b) / d + (g < b ? 6 : 0);
26
+ break;
27
+ case g:
28
+ h = (b - r) / d + 2;
29
+ break;
30
+ case b:
31
+ h = (r - g) / d + 4;
32
+ break;
33
+ }
34
+ }
35
+ h = Math.round(h ? h * 360 : 0);
36
+ s = Math.round(s * 100);
37
+ l = Math.round(l * 100);
38
+ cssString = h + "," + s + "%," + l + "%";
39
+ cssString = !valuesOnly ? "hsl(" + cssString + ")" : cssString;
40
+ return cssString;
41
+ };
42
+ const hexToHSL = (H) => {
43
+ let r = 0, g = 0, b = 0;
44
+ if (H.length == 4) {
45
+ r = parseInt("0x" + H[1] + H[1]);
46
+ g = parseInt("0x" + H[2] + H[2]);
47
+ b = parseInt("0x" + H[3] + H[3]);
48
+ } else if (H.length == 7) {
49
+ r = parseInt("0x" + H[1] + H[2]);
50
+ g = parseInt("0x" + H[3] + H[4]);
51
+ b = parseInt("0x" + H[5] + H[6]);
52
+ }
53
+ r /= 255;
54
+ g /= 255;
55
+ b /= 255;
56
+ let h = 0, s = 0, l = 0;
57
+ const cmin = Math.min(r, g, b), cmax = Math.max(r, g, b), delta = cmax - cmin;
58
+ if (delta == 0) h = 0;
59
+ else if (cmax == r) h = (g - b) / delta % 6;
60
+ else if (cmax == g) h = (b - r) / delta + 2;
61
+ else h = (r - g) / delta + 4;
62
+ h = Math.round(h * 60);
63
+ if (h < 0) h += 360;
64
+ l = (cmax + cmin) / 2;
65
+ s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
66
+ s = +(s * 100).toFixed(1);
67
+ l = +(l * 100).toFixed(1);
68
+ return [h, s, l];
69
+ };
70
+ const hexToHsluv = (hex) => {
71
+ const conv = new Hsluv();
72
+ conv.hex = hex;
73
+ conv.hexToHsluv();
74
+ return [conv.hsluv_h, conv.hsluv_s, conv.hsluv_l];
75
+ };
76
+ const hslArrToCss = (HSL) => {
77
+ return "hsl(" + HSL[0] + "," + HSL[1] + "%," + HSL[2] + "%)";
78
+ };
79
+ const HSLToHex = (h, s, l) => {
80
+ s /= 100;
81
+ l /= 100;
82
+ let r = 0, g = 0, b = 0;
83
+ const c = (1 - Math.abs(2 * l - 1)) * s, x = c * (1 - Math.abs(h / 60 % 2 - 1)), m = l - c / 2;
84
+ if (0 <= h && h < 60) {
85
+ r = c;
86
+ g = x;
87
+ b = 0;
88
+ } else if (60 <= h && h < 120) {
89
+ r = x;
90
+ g = c;
91
+ b = 0;
92
+ } else if (120 <= h && h < 180) {
93
+ r = 0;
94
+ g = c;
95
+ b = x;
96
+ } else if (180 <= h && h < 240) {
97
+ r = 0;
98
+ g = x;
99
+ b = c;
100
+ } else if (240 <= h && h < 300) {
101
+ r = x;
102
+ g = 0;
103
+ b = c;
104
+ } else if (300 <= h && h < 360) {
105
+ r = c;
106
+ g = 0;
107
+ b = x;
108
+ }
109
+ r = parseInt(Math.round((r + m) * 255).toString(16), 16);
110
+ g = parseInt(Math.round((g + m) * 255).toString(16), 16);
111
+ b = parseInt(Math.round((b + m) * 255).toString(16), 16);
112
+ if (r.toString().length == 1) r = parseInt("0" + r.toString(), 10);
113
+ if (g.toString().length == 1) g = parseInt("0" + g.toString(), 10);
114
+ if (b.toString().length == 1) b = parseInt("0" + b.toString(), 10);
115
+ return "#" + r + g + b;
116
+ };
117
+ const hexToRgb = (hex) => {
118
+ const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
119
+ hex = hex.replace(shorthandRegex, function(m, r, g, b) {
120
+ return r + r + g + g + b + b;
121
+ });
122
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
123
+ return result ? {
124
+ r: parseInt(result[1], 16),
125
+ g: parseInt(result[2], 16),
126
+ b: parseInt(result[3], 16)
127
+ } : null;
128
+ };
129
+ const luminanceFromRgb = (r, g, b) => {
130
+ const a = [Number(r), Number(g), Number(b)].map(function(v) {
131
+ v /= 255;
132
+ return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
133
+ });
134
+ return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
135
+ };
136
+ const luminanceFromHex = (hex) => {
137
+ const rgb = hexToRgb(hex);
138
+ if (rgb) {
139
+ const r = rgb.r.toString();
140
+ const g = rgb.g.toString();
141
+ const b = rgb.b.toString();
142
+ return luminanceFromRgb(r, g, b);
143
+ }
144
+ return 2;
145
+ };
146
+ const getRatioFromLum = (lum1, lum2) => {
147
+ if (lum1 !== null && lum2 !== null) {
148
+ return (Math.max(lum1, lum2) + 0.05) / (Math.min(lum1, lum2) + 0.05);
149
+ } else {
150
+ return -1;
151
+ }
152
+ };
153
+ const getHslLightessFromHex = (hex) => {
154
+ return chroma(hex).hsl()[2];
155
+ };
156
+ const getHslSaturationFromHex = (hex) => {
157
+ return chroma(hex).hsl()[1];
158
+ };
159
+ const getLightnessFromHex = (hex) => {
160
+ const conv = new Hsluv();
161
+ conv.hex = hex;
162
+ conv.hexToHsluv();
163
+ return Number(conv.hsluv_l.toFixed(0));
164
+ };
165
+ const getContrastFromHex = (color1, color2) => {
166
+ const lum1 = luminanceFromHex(color1);
167
+ const lum2 = luminanceFromHex(color2);
168
+ if (lum1 !== null && lum2 !== null) {
169
+ return getRatioFromLum(lum1, lum2);
170
+ }
171
+ return -1;
172
+ };
173
+ const getContrastFromLightness = (lightness, mainColor, backgroundColor) => {
174
+ const conv = new Hsluv();
175
+ conv.hex = mainColor;
176
+ conv.hexToHsluv();
177
+ conv.hsluv_l = lightness;
178
+ conv.hsluvToHex();
179
+ const lightMainColor = conv.hex;
180
+ const lum1 = luminanceFromHex(lightMainColor);
181
+ const lum2 = luminanceFromHex(backgroundColor);
182
+ const ratio = getRatioFromLum(lum1 ?? 0, lum2 ?? 0);
183
+ return ratio;
184
+ };
185
+ const areColorsContrasting = (color1, color2, type = "aa") => {
186
+ const contrast = getContrastFromHex(color1, color2);
187
+ if (contrast !== null) {
188
+ if (type === "aaa") {
189
+ return contrast >= 7;
190
+ } else if (type === "aa") {
191
+ return contrast >= 4.5;
192
+ } else {
193
+ return contrast >= 3;
194
+ }
195
+ }
196
+ return false;
197
+ };
198
+ const getApcaContrastLc = (textColor, backgroundColor) => {
199
+ const textColorRgb = hexToRgb(textColor);
200
+ const backgroundColorRgb = hexToRgb(backgroundColor);
201
+ if (textColorRgb && backgroundColorRgb) {
202
+ return APCAcontrast(
203
+ sRGBtoY([textColorRgb.r, textColorRgb.g, textColorRgb.b]),
204
+ sRGBtoY([backgroundColorRgb.r, backgroundColorRgb.g, backgroundColorRgb.b])
205
+ );
206
+ }
207
+ return 0;
208
+ };
209
+ const isHexColor = (hex) => {
210
+ return typeof hex === "string" && hex.length === 6 && !isNaN(Number("0x" + hex));
211
+ };
212
+ export {
213
+ HSLToHex,
214
+ areColorsContrasting,
215
+ getApcaContrastLc,
216
+ getContrastFromHex,
217
+ getContrastFromLightness,
218
+ getHslLightessFromHex,
219
+ getHslSaturationFromHex,
220
+ getLightnessFromHex,
221
+ getRatioFromLum,
222
+ hexToCssHsl,
223
+ hexToHSL,
224
+ hexToHsluv,
225
+ hexToRgb,
226
+ hslArrToCss,
227
+ isHexColor,
228
+ luminanceFromHex,
229
+ luminanceFromRgb
230
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./colorUtils";
2
+ export * from "./themeUtils";
3
+ export * from "./types";
@@ -0,0 +1,244 @@
1
+ import { BackgroundColor, Color, Theme } from "@adobe/leonardo-contrast-colors";
2
+ import { Hsluv } from "hsluv";
3
+ import { getContrastFromHex, getContrastFromLightness, getLightnessFromHex } from "./colorUtils";
4
+ const blueBaseColor = "#0A71C0";
5
+ const greenBaseColor = "#078D19";
6
+ const orangeBaseColor = "#CA5C21";
7
+ const purpleBaseColor = "#663299";
8
+ const redBaseColor = "#C01B1B";
9
+ const yellowBaseColor = "#EABF28";
10
+ const generateThemeColor = (color, mode, contrastMode = "aa") => {
11
+ const leoBackgroundColor = new BackgroundColor({
12
+ name: "backgroundColor",
13
+ colorKeys: ["#ffffff"],
14
+ ratios: [1]
15
+ });
16
+ let colorLightness = getLightnessFromHex(color);
17
+ if (mode === "dark" || mode === "contrast") {
18
+ color = getBaseColor(color);
19
+ colorLightness = colorLightness <= 30 ? 70 : 100 - colorLightness;
20
+ }
21
+ const multiplier = colorLightness <= 30 ? -8 : 8;
22
+ const baseDefaultContrast = getContrastFromLightness(colorLightness, color, leoBackgroundColor.colorKeys[0]);
23
+ const baseHoverContrast = getContrastFromLightness(
24
+ colorLightness - multiplier,
25
+ color,
26
+ leoBackgroundColor.colorKeys[0]
27
+ );
28
+ const baseActiveContrast = getContrastFromLightness(
29
+ colorLightness - multiplier * 2,
30
+ color,
31
+ leoBackgroundColor.colorKeys[0]
32
+ );
33
+ const textSubLightLightness = contrastMode === "aa" ? 42 : 30;
34
+ const textDefLightLightness = contrastMode === "aa" ? 18 : 12;
35
+ const textSubDarkLightness = contrastMode === "aa" ? 67 : 80;
36
+ const textDefDarkLightness = contrastMode === "aa" ? 90 : 94;
37
+ let lightnessScale = [];
38
+ if (mode === "light") {
39
+ lightnessScale = [100, 96, 90, 84, 78, 76, 54, 33, textSubLightLightness, textDefLightLightness];
40
+ } else if (mode === "dark") {
41
+ lightnessScale = [10, 14, 20, 26, 32, 35, 47, 77, textSubDarkLightness, textDefDarkLightness];
42
+ } else {
43
+ lightnessScale = [1, 6, 14, 20, 26, 58, 70, 82, 80, 95];
44
+ }
45
+ const getColorContrasts = (color2, lightnessScale2, backgroundColor) => {
46
+ return lightnessScale2.map((lightness) => getContrastFromLightness(lightness, color2, backgroundColor));
47
+ };
48
+ return new Color({
49
+ name: "color",
50
+ colorKeys: [color],
51
+ ratios: [
52
+ ...getColorContrasts(color, lightnessScale.slice(0, 8), leoBackgroundColor.colorKeys[0]),
53
+ baseDefaultContrast,
54
+ baseHoverContrast,
55
+ baseActiveContrast,
56
+ ...getColorContrasts(color, lightnessScale.slice(8), leoBackgroundColor.colorKeys[0])
57
+ ]
58
+ });
59
+ };
60
+ const generateScaleForColor = (color, mode, contrastMode = "aa") => {
61
+ const themeColor = generateThemeColor(color, mode, contrastMode);
62
+ const leoBackgroundColor = new BackgroundColor({
63
+ name: "backgroundColor",
64
+ colorKeys: ["#ffffff"],
65
+ ratios: [1]
66
+ });
67
+ const theme = new Theme({
68
+ colors: [themeColor],
69
+ backgroundColor: leoBackgroundColor,
70
+ lightness: 100
71
+ });
72
+ const outputArray = [];
73
+ for (let i = 0; i < theme.contrastColorValues.length; i++) {
74
+ outputArray.push({
75
+ hex: theme.contrastColorValues[i],
76
+ number: i + 1,
77
+ name: getColorNameFromNumber(i + 1)
78
+ });
79
+ }
80
+ outputArray.push({
81
+ hex: calculateContrastOneColor(theme.contrastColorValues[8]),
82
+ number: 14,
83
+ name: getColorNameFromNumber(14)
84
+ });
85
+ outputArray.push({
86
+ hex: calculateContrastTwoColor(theme.contrastColorValues[8]),
87
+ number: 15,
88
+ name: getColorNameFromNumber(15)
89
+ });
90
+ if (mode === "light") {
91
+ outputArray[8].hex = color;
92
+ }
93
+ return outputArray;
94
+ };
95
+ const generateThemeForColor = (color, contrastMode = "aa") => {
96
+ const lightScale = generateScaleForColor(color, "light", contrastMode);
97
+ const darkScale = generateScaleForColor(color, "dark", contrastMode);
98
+ const contrastScale = generateScaleForColor(color, "contrast", contrastMode);
99
+ return {
100
+ light: lightScale,
101
+ dark: darkScale,
102
+ contrast: contrastScale
103
+ };
104
+ };
105
+ const generateGlobalColors = ({ contrastMode = "aa" }) => {
106
+ const blueTheme = generateThemeForColor(blueBaseColor, contrastMode);
107
+ const greenTheme = generateThemeForColor(greenBaseColor, contrastMode);
108
+ const orangeTheme = generateThemeForColor(orangeBaseColor, contrastMode);
109
+ const purpleTheme = generateThemeForColor(purpleBaseColor, contrastMode);
110
+ const redTheme = generateThemeForColor(redBaseColor, contrastMode);
111
+ const yellowTheme = generateThemeForColor(yellowBaseColor, contrastMode);
112
+ return {
113
+ blue: blueTheme,
114
+ green: greenTheme,
115
+ orange: orangeTheme,
116
+ purple: purpleTheme,
117
+ red: redTheme,
118
+ yellow: yellowTheme
119
+ };
120
+ };
121
+ const generateColorTheme = ({ colors, contrastMode = "aa" }) => {
122
+ const accentTheme = generateThemeForColor(colors.accent, contrastMode);
123
+ const neutralTheme = generateThemeForColor(colors.neutral, contrastMode);
124
+ const brand1Theme = generateThemeForColor(colors.brand1, contrastMode);
125
+ const brand2Theme = generateThemeForColor(colors.brand2, contrastMode);
126
+ const brand3Theme = generateThemeForColor(colors.brand3, contrastMode);
127
+ return {
128
+ accent: accentTheme,
129
+ neutral: neutralTheme,
130
+ brand1: brand1Theme,
131
+ brand2: brand2Theme,
132
+ brand3: brand3Theme
133
+ };
134
+ };
135
+ const calculateContrastOneColor = (baseColor) => {
136
+ const contrastWhite = getContrastFromHex(baseColor, "#ffffff");
137
+ const contrastBlack = getContrastFromHex(baseColor, "#000000");
138
+ const lightness = contrastWhite >= contrastBlack ? 100 : 0;
139
+ return lightness === 0 ? "#000000" : "#ffffff";
140
+ };
141
+ const calculateContrastTwoColor = (color) => {
142
+ const contrastWhite = getContrastFromHex(color, "#ffffff");
143
+ const contrastBlack = getContrastFromHex(color, "#000000");
144
+ const lightness = getLightnessFromHex(color);
145
+ const doubleALightnessModifier = lightness <= 40 ? 60 : lightness >= 60 ? 60 : 50;
146
+ let targetLightness = 0;
147
+ const contrastDirection = contrastWhite >= contrastBlack ? "lighten" : "darken";
148
+ targetLightness = contrastDirection === "lighten" ? lightness + doubleALightnessModifier : lightness - doubleALightnessModifier;
149
+ return createColorWithLightness(color, targetLightness);
150
+ };
151
+ const canTextBeUsedOnColors = (baseDefaultColor, baseActiveColor) => {
152
+ const defaultAgainstWhite = getContrastFromHex(baseDefaultColor, "#ffffff");
153
+ const defaultAgainstBlack = getContrastFromHex(baseDefaultColor, "#000000");
154
+ const activeAgainstWhite = getContrastFromHex(baseActiveColor, "#ffffff");
155
+ const activeAgainstBlack = getContrastFromHex(baseActiveColor, "#000000");
156
+ if (defaultAgainstWhite >= 4.5 && activeAgainstWhite >= 4.5) {
157
+ return true;
158
+ } else if (defaultAgainstBlack >= 4.5 && activeAgainstBlack >= 4.5) {
159
+ return true;
160
+ }
161
+ return false;
162
+ };
163
+ const createColorWithLightness = (color, lightness) => {
164
+ const leoBackgroundColor = new BackgroundColor({
165
+ name: "backgroundColor",
166
+ colorKeys: ["#ffffff"],
167
+ ratios: [1]
168
+ });
169
+ const colors = new Color({
170
+ name: "color",
171
+ colorKeys: [color],
172
+ ratios: [getContrastFromLightness(lightness, color, "#ffffff")]
173
+ });
174
+ const theme = new Theme({
175
+ colors: [colors],
176
+ backgroundColor: leoBackgroundColor,
177
+ lightness: 100
178
+ });
179
+ return theme.contrastColorValues[0];
180
+ };
181
+ const getColorNumberFromName = (name) => {
182
+ const colorMap = {
183
+ "Background Default": 1,
184
+ "Background Subtle": 2,
185
+ "Surface Default": 3,
186
+ "Surface Hover": 4,
187
+ "Surface Active": 5,
188
+ "Border Subtle": 6,
189
+ "Border Default": 7,
190
+ "Border Strong": 8,
191
+ "Base Default": 9,
192
+ "Base Hover": 10,
193
+ "Base Active": 11,
194
+ "Text Subtle": 12,
195
+ "Text Default": 13,
196
+ "Contrast Default": 14,
197
+ "Contrast Subtle": 15
198
+ };
199
+ return colorMap[name];
200
+ };
201
+ const getColorNameFromNumber = (number) => {
202
+ const colorMap = {
203
+ 1: "Background Default",
204
+ 2: "Background Subtle",
205
+ 3: "Surface Default",
206
+ 4: "Surface Hover",
207
+ 5: "Surface Active",
208
+ 6: "Border Subtle",
209
+ 7: "Border Default",
210
+ 8: "Border Strong",
211
+ 9: "Base Default",
212
+ 10: "Base Hover",
213
+ 11: "Base Active",
214
+ 12: "Text Subtle",
215
+ 13: "Text Default",
216
+ 14: "Contrast Default",
217
+ 15: "Contrast Subtle"
218
+ };
219
+ return colorMap[number];
220
+ };
221
+ const getBaseColor = (color) => {
222
+ const conv = new Hsluv();
223
+ conv.hex = color;
224
+ conv.hexToHsluv();
225
+ conv.hsluvToHex();
226
+ return conv.hex;
227
+ };
228
+ const getCssVariable = (colorType, colorNumber) => {
229
+ return `--ds-${colorType}-${getColorNameFromNumber(colorNumber).toLowerCase().replace(/\s/g, "-")}`;
230
+ };
231
+ export {
232
+ calculateContrastOneColor,
233
+ calculateContrastTwoColor,
234
+ canTextBeUsedOnColors,
235
+ createColorWithLightness,
236
+ generateColorTheme,
237
+ generateGlobalColors,
238
+ generateScaleForColor,
239
+ generateThemeForColor,
240
+ getBaseColor,
241
+ getColorNameFromNumber,
242
+ getColorNumberFromName,
243
+ getCssVariable
244
+ };
File without changes