@digdir/designsystemet 0.1.0-alpha.13 → 0.1.0-alpha.15

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 (67) hide show
  1. package/dist/bin/designsystemet.js +32 -3439
  2. package/dist/src/colors/colorUtils.js +301 -343
  3. package/dist/src/colors/index.js +3 -607
  4. package/dist/src/colors/themeUtils.js +319 -348
  5. package/dist/src/colors/types.js +1 -1
  6. package/dist/src/init/createTokensPackage.js +230 -0
  7. package/dist/src/init/generateMetadataJson.js +16 -0
  8. package/dist/src/init/generateThemesJson.js +50 -0
  9. package/dist/src/init/index.js +7 -0
  10. package/dist/src/init/nextStepsMarkdown.js +90 -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 +7 -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 +23 -0
  26. package/dist/src/init/utils.js +11 -0
  27. package/dist/src/migrations/beta-to-v1.js +341 -407
  28. package/dist/src/migrations/codemods/css/plugins.js +36 -42
  29. package/dist/src/migrations/codemods/css/run.js +20 -17
  30. package/dist/src/migrations/codemods/jsx/classname-prefix.js +63 -59
  31. package/dist/src/migrations/codemods/jsx/run.js +20 -20
  32. package/dist/src/migrations/index.js +5 -436
  33. package/dist/src/migrations/react-beta-to-v1.js +4 -27
  34. package/dist/src/test/a.css +39 -0
  35. package/dist/src/test/jsx-test.js +12 -0
  36. package/dist/src/tokens/actions.js +23 -2176
  37. package/dist/src/tokens/build.js +54 -2974
  38. package/dist/src/tokens/configs.js +234 -2874
  39. package/dist/src/tokens/formats/css.js +153 -2632
  40. package/dist/src/tokens/formats/js-tokens.js +28 -42
  41. package/dist/src/tokens/transformers.js +44 -82
  42. package/dist/src/tokens/utils/noCase.js +26 -28
  43. package/dist/src/tokens/utils/permutateThemes.js +65 -217
  44. package/dist/src/tokens/utils/utils.js +25 -14
  45. package/package.json +16 -23
  46. package/LICENSE +0 -7
  47. package/dist/bin/designsystemet.js.map +0 -1
  48. package/dist/src/colors/colorUtils.js.map +0 -1
  49. package/dist/src/colors/index.js.map +0 -1
  50. package/dist/src/colors/themeUtils.js.map +0 -1
  51. package/dist/src/colors/types.js.map +0 -1
  52. package/dist/src/migrations/beta-to-v1.js.map +0 -1
  53. package/dist/src/migrations/codemods/css/plugins.js.map +0 -1
  54. package/dist/src/migrations/codemods/css/run.js.map +0 -1
  55. package/dist/src/migrations/codemods/jsx/classname-prefix.js.map +0 -1
  56. package/dist/src/migrations/codemods/jsx/run.js.map +0 -1
  57. package/dist/src/migrations/index.js.map +0 -1
  58. package/dist/src/migrations/react-beta-to-v1.js.map +0 -1
  59. package/dist/src/tokens/actions.js.map +0 -1
  60. package/dist/src/tokens/build.js.map +0 -1
  61. package/dist/src/tokens/configs.js.map +0 -1
  62. package/dist/src/tokens/formats/css.js.map +0 -1
  63. package/dist/src/tokens/formats/js-tokens.js.map +0 -1
  64. package/dist/src/tokens/transformers.js.map +0 -1
  65. package/dist/src/tokens/utils/noCase.js.map +0 -1
  66. package/dist/src/tokens/utils/permutateThemes.js.map +0 -1
  67. package/dist/src/tokens/utils/utils.js.map +0 -1
@@ -1,365 +1,336 @@
1
- // src/colors/themeUtils.ts
2
1
  import { BackgroundColor, Color, Theme } from "@adobe/leonardo-contrast-colors";
3
- import { Hsluv as Hsluv2 } from "hsluv";
4
-
5
- // src/colors/colorUtils.ts
6
2
  import { Hsluv } from "hsluv";
7
- import chroma from "chroma-js";
8
- var hexToRgb = (hex) => {
9
- const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
10
- hex = hex.replace(shorthandRegex, function(m, r, g, b) {
11
- return r + r + g + g + b + b;
12
- });
13
- const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
14
- return result ? {
15
- r: parseInt(result[1], 16),
16
- g: parseInt(result[2], 16),
17
- b: parseInt(result[3], 16)
18
- } : null;
19
- };
20
- var luminanceFromRgb = (r, g, b) => {
21
- const a = [Number(r), Number(g), Number(b)].map(function(v) {
22
- v /= 255;
23
- return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
24
- });
25
- return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
26
- };
27
- var luminanceFromHex = (hex) => {
28
- const rgb = hexToRgb(hex);
29
- if (rgb) {
30
- const r = rgb.r.toString();
31
- const g = rgb.g.toString();
32
- const b = rgb.b.toString();
33
- return luminanceFromRgb(r, g, b);
34
- }
35
- return 2;
36
- };
37
- var getRatioFromLum = (lum1, lum2) => {
38
- if (lum1 !== null && lum2 !== null) {
39
- return (Math.max(lum1, lum2) + 0.05) / (Math.min(lum1, lum2) + 0.05);
40
- } else {
41
- return -1;
42
- }
43
- };
44
- var getLightnessFromHex = (hex) => {
45
- const conv = new Hsluv();
46
- conv.hex = hex;
47
- conv.hexToHsluv();
48
- return Number(conv.hsluv_l.toFixed(0));
49
- };
50
- var getContrastFromHex = (color1, color2) => {
51
- const lum1 = luminanceFromHex(color1);
52
- const lum2 = luminanceFromHex(color2);
53
- if (lum1 !== null && lum2 !== null) {
54
- return getRatioFromLum(lum1, lum2);
55
- }
56
- return -1;
57
- };
58
- var getContrastFromLightness = (lightness, mainColor, backgroundColor) => {
59
- const conv = new Hsluv();
60
- conv.hex = mainColor;
61
- conv.hexToHsluv();
62
- conv.hsluv_l = lightness;
63
- conv.hsluvToHex();
64
- const lightMainColor = conv.hex;
65
- const lum1 = luminanceFromHex(lightMainColor);
66
- const lum2 = luminanceFromHex(backgroundColor);
67
- const ratio = getRatioFromLum(lum1 ?? 0, lum2 ?? 0);
68
- return ratio;
69
- };
70
-
71
- // src/colors/themeUtils.ts
72
- var blueBaseColor = "#0A71C0";
73
- var greenBaseColor = "#078D19";
74
- var orangeBaseColor = "#CA5C21";
75
- var purpleBaseColor = "#663299";
76
- var redBaseColor = "#C01B1B";
77
- var yellowBaseColor = "#EABF28";
78
- var generateThemeColor = (color, mode, contrastMode = "aa") => {
79
- const leoBackgroundColor = new BackgroundColor({
80
- name: "backgroundColor",
81
- colorKeys: ["#ffffff"],
82
- ratios: [1]
83
- });
84
- let colorLightness = getLightnessFromHex(color);
85
- if (mode === "dark" || mode === "contrast") {
86
- color = getBaseColor(color);
87
- colorLightness = colorLightness <= 30 ? 70 : 100 - colorLightness;
88
- }
89
- const multiplier = colorLightness <= 30 ? -8 : 8;
90
- const baseDefaultContrast = getContrastFromLightness(colorLightness, color, leoBackgroundColor.colorKeys[0]);
91
- const baseHoverContrast = getContrastFromLightness(
92
- colorLightness - multiplier,
93
- color,
94
- leoBackgroundColor.colorKeys[0]
95
- );
96
- const baseActiveContrast = getContrastFromLightness(
97
- colorLightness - multiplier * 2,
98
- color,
99
- leoBackgroundColor.colorKeys[0]
100
- );
101
- const textSubLightLightness = contrastMode === "aa" ? 42 : 30;
102
- const textDefLightLightness = contrastMode === "aa" ? 18 : 12;
103
- const textSubDarkLightness = contrastMode === "aa" ? 67 : 80;
104
- const textDefDarkLightness = contrastMode === "aa" ? 90 : 94;
105
- let lightnessScale = [];
106
- if (mode === "light") {
107
- lightnessScale = [100, 96, 90, 84, 78, 76, 54, 33, textSubLightLightness, textDefLightLightness];
108
- } else if (mode === "dark") {
109
- lightnessScale = [10, 14, 20, 26, 32, 35, 47, 77, textSubDarkLightness, textDefDarkLightness];
110
- } else {
111
- lightnessScale = [1, 6, 14, 20, 26, 58, 70, 82, 80, 95];
112
- }
113
- const getColorContrasts = (color2, lightnessScale2, backgroundColor) => {
114
- return lightnessScale2.map((lightness) => getContrastFromLightness(lightness, color2, backgroundColor));
115
- };
116
- return new Color({
117
- name: "color",
118
- colorKeys: [color],
119
- ratios: [
120
- ...getColorContrasts(color, lightnessScale.slice(0, 8), leoBackgroundColor.colorKeys[0]),
121
- baseDefaultContrast,
122
- baseHoverContrast,
123
- baseActiveContrast,
124
- ...getColorContrasts(color, lightnessScale.slice(8), leoBackgroundColor.colorKeys[0])
125
- ]
126
- });
3
+ import { getContrastFromHex, getContrastFromLightness, getLightnessFromHex } from "./colorUtils.js";
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
+ /**
11
+ * Generates a Leonardo theme color that is used to create a Leonardo Theme
12
+ *
13
+ * @param color CssColor
14
+ * @param mode Light, Dark or Contrastmode
15
+ * @param contrastMode Contrast mode
16
+ * @returns
17
+ */ const generateThemeColor = (color, mode, contrastMode = 'aa')=>{
18
+ const leoBackgroundColor = new BackgroundColor({
19
+ name: 'backgroundColor',
20
+ colorKeys: [
21
+ '#ffffff'
22
+ ],
23
+ ratios: [
24
+ 1
25
+ ]
26
+ });
27
+ let colorLightness = getLightnessFromHex(color);
28
+ if (mode === 'dark' || mode === 'contrast') {
29
+ color = getBaseColor(color);
30
+ colorLightness = colorLightness <= 30 ? 70 : 100 - colorLightness;
31
+ }
32
+ const multiplier = colorLightness <= 30 ? -8 : 8;
33
+ const baseDefaultContrast = getContrastFromLightness(colorLightness, color, leoBackgroundColor.colorKeys[0]);
34
+ const baseHoverContrast = getContrastFromLightness(colorLightness - multiplier, color, leoBackgroundColor.colorKeys[0]);
35
+ const baseActiveContrast = getContrastFromLightness(colorLightness - multiplier * 2, color, leoBackgroundColor.colorKeys[0]);
36
+ const textSubLightLightness = contrastMode === 'aa' ? 42 : 30;
37
+ const textDefLightLightness = contrastMode === 'aa' ? 18 : 12;
38
+ const textSubDarkLightness = contrastMode === 'aa' ? 67 : 80;
39
+ const textDefDarkLightness = contrastMode === 'aa' ? 90 : 94;
40
+ let lightnessScale = [];
41
+ if (mode === 'light') {
42
+ lightnessScale = [
43
+ 100,
44
+ 96,
45
+ 90,
46
+ 84,
47
+ 78,
48
+ 76,
49
+ 54,
50
+ 33,
51
+ textSubLightLightness,
52
+ textDefLightLightness
53
+ ];
54
+ } else if (mode === 'dark') {
55
+ lightnessScale = [
56
+ 10,
57
+ 14,
58
+ 20,
59
+ 26,
60
+ 32,
61
+ 35,
62
+ 47,
63
+ 77,
64
+ textSubDarkLightness,
65
+ textDefDarkLightness
66
+ ];
67
+ } else {
68
+ lightnessScale = [
69
+ 1,
70
+ 6,
71
+ 14,
72
+ 20,
73
+ 26,
74
+ 58,
75
+ 70,
76
+ 82,
77
+ 80,
78
+ 95
79
+ ];
80
+ }
81
+ const getColorContrasts = (color, lightnessScale, backgroundColor)=>{
82
+ return lightnessScale.map((lightness)=>getContrastFromLightness(lightness, color, backgroundColor));
83
+ };
84
+ return new Color({
85
+ name: 'color',
86
+ colorKeys: [
87
+ color
88
+ ],
89
+ ratios: [
90
+ ...getColorContrasts(color, lightnessScale.slice(0, 8), leoBackgroundColor.colorKeys[0]),
91
+ baseDefaultContrast,
92
+ baseHoverContrast,
93
+ baseActiveContrast,
94
+ ...getColorContrasts(color, lightnessScale.slice(8), leoBackgroundColor.colorKeys[0])
95
+ ]
96
+ });
127
97
  };
128
- var generateScaleForColor = (color, mode, contrastMode = "aa") => {
129
- const themeColor = generateThemeColor(color, mode, contrastMode);
130
- const leoBackgroundColor = new BackgroundColor({
131
- name: "backgroundColor",
132
- colorKeys: ["#ffffff"],
133
- ratios: [1]
134
- });
135
- const theme = new Theme({
136
- colors: [themeColor],
137
- backgroundColor: leoBackgroundColor,
138
- lightness: 100
139
- });
140
- const outputArray = [];
141
- for (let i = 0; i < theme.contrastColorValues.length; i++) {
98
+ /**
99
+ *
100
+ * Generates a color scale based on a base color and a mode.
101
+ *
102
+ * @param color The base color that is used to generate the color scale
103
+ * @param mode The mode of the theme
104
+ */ export const generateScaleForColor = (color, mode, contrastMode = 'aa')=>{
105
+ const themeColor = generateThemeColor(color, mode, contrastMode);
106
+ const leoBackgroundColor = new BackgroundColor({
107
+ name: 'backgroundColor',
108
+ colorKeys: [
109
+ '#ffffff'
110
+ ],
111
+ ratios: [
112
+ 1
113
+ ]
114
+ });
115
+ const theme = new Theme({
116
+ colors: [
117
+ themeColor
118
+ ],
119
+ backgroundColor: leoBackgroundColor,
120
+ lightness: 100
121
+ });
122
+ const outputArray = [];
123
+ for(let i = 0; i < theme.contrastColorValues.length; i++){
124
+ outputArray.push({
125
+ hex: theme.contrastColorValues[i],
126
+ number: i + 1,
127
+ name: getColorNameFromNumber(i + 1)
128
+ });
129
+ }
142
130
  outputArray.push({
143
- hex: theme.contrastColorValues[i],
144
- number: i + 1,
145
- name: getColorNameFromNumber(i + 1)
131
+ hex: calculateContrastOneColor(theme.contrastColorValues[8]),
132
+ number: 14,
133
+ name: getColorNameFromNumber(14)
146
134
  });
147
- }
148
- outputArray.push({
149
- hex: calculateContrastOneColor(theme.contrastColorValues[8]),
150
- number: 14,
151
- name: getColorNameFromNumber(14)
152
- });
153
- outputArray.push({
154
- hex: calculateContrastTwoColor(theme.contrastColorValues[8]),
155
- number: 15,
156
- name: getColorNameFromNumber(15)
157
- });
158
- if (mode === "light") {
159
- outputArray[8].hex = color;
160
- }
161
- return outputArray;
162
- };
163
- var generateThemeForColor = (color, contrastMode = "aa") => {
164
- const lightScale = generateScaleForColor(color, "light", contrastMode);
165
- const darkScale = generateScaleForColor(color, "dark", contrastMode);
166
- const contrastScale = generateScaleForColor(color, "contrast", contrastMode);
167
- return {
168
- light: lightScale,
169
- dark: darkScale,
170
- contrast: contrastScale
171
- };
135
+ outputArray.push({
136
+ hex: calculateContrastTwoColor(theme.contrastColorValues[8]),
137
+ number: 15,
138
+ name: getColorNameFromNumber(15)
139
+ });
140
+ if (mode === 'light') {
141
+ outputArray[8].hex = color;
142
+ }
143
+ return outputArray;
172
144
  };
173
- var generateGlobalColors = ({ contrastMode = "aa" }) => {
174
- const blueTheme = generateThemeForColor(blueBaseColor, contrastMode);
175
- const greenTheme = generateThemeForColor(greenBaseColor, contrastMode);
176
- const orangeTheme = generateThemeForColor(orangeBaseColor, contrastMode);
177
- const purpleTheme = generateThemeForColor(purpleBaseColor, contrastMode);
178
- const redTheme = generateThemeForColor(redBaseColor, contrastMode);
179
- const yellowTheme = generateThemeForColor(yellowBaseColor, contrastMode);
180
- return {
181
- blue: blueTheme,
182
- green: greenTheme,
183
- orange: orangeTheme,
184
- purple: purpleTheme,
185
- red: redTheme,
186
- yellow: yellowTheme
187
- };
145
+ /**
146
+ *
147
+ * Generates a color theme based on a base color. Light, Dark and Contrast scales are includes.
148
+ *
149
+ * @param color The base color that is used to generate the color theme
150
+ */ export const generateThemeForColor = (color, contrastMode = 'aa')=>{
151
+ const lightScale = generateScaleForColor(color, 'light', contrastMode);
152
+ const darkScale = generateScaleForColor(color, 'dark', contrastMode);
153
+ const contrastScale = generateScaleForColor(color, 'contrast', contrastMode);
154
+ return {
155
+ light: lightScale,
156
+ dark: darkScale,
157
+ contrast: contrastScale
158
+ };
188
159
  };
189
- var generateColorTheme = ({ colors, contrastMode = "aa" }) => {
190
- const accentTheme = generateThemeForColor(colors.accent, contrastMode);
191
- const neutralTheme = generateThemeForColor(colors.neutral, contrastMode);
192
- const brand1Theme = generateThemeForColor(colors.brand1, contrastMode);
193
- const brand2Theme = generateThemeForColor(colors.brand2, contrastMode);
194
- const brand3Theme = generateThemeForColor(colors.brand3, contrastMode);
195
- return {
196
- accent: accentTheme,
197
- neutral: neutralTheme,
198
- brand1: brand1Theme,
199
- brand2: brand2Theme,
200
- brand3: brand3Theme
201
- };
160
+ export const generateGlobalColors = ({ contrastMode = 'aa' })=>{
161
+ const blueTheme = generateThemeForColor(blueBaseColor, contrastMode);
162
+ const greenTheme = generateThemeForColor(greenBaseColor, contrastMode);
163
+ const orangeTheme = generateThemeForColor(orangeBaseColor, contrastMode);
164
+ const purpleTheme = generateThemeForColor(purpleBaseColor, contrastMode);
165
+ const redTheme = generateThemeForColor(redBaseColor, contrastMode);
166
+ const yellowTheme = generateThemeForColor(yellowBaseColor, contrastMode);
167
+ return {
168
+ blue: blueTheme,
169
+ green: greenTheme,
170
+ orange: orangeTheme,
171
+ purple: purpleTheme,
172
+ red: redTheme,
173
+ yellow: yellowTheme
174
+ };
202
175
  };
203
- var calculateContrastOneColor = (baseColor) => {
204
- const contrastWhite = getContrastFromHex(baseColor, "#ffffff");
205
- const contrastBlack = getContrastFromHex(baseColor, "#000000");
206
- const lightness = contrastWhite >= contrastBlack ? 100 : 0;
207
- return lightness === 0 ? "#000000" : "#ffffff";
176
+ /**
177
+ * This function generates a complete theme for a set of colors.
178
+ *
179
+ * @param colors Which colors to generate the theme for
180
+ * @param contrastMode The contrast mode to use
181
+ * @returns
182
+ */ export const generateColorTheme = ({ colors, contrastMode = 'aa' })=>{
183
+ const accentTheme = generateThemeForColor(colors.accent, contrastMode);
184
+ const neutralTheme = generateThemeForColor(colors.neutral, contrastMode);
185
+ const brand1Theme = generateThemeForColor(colors.brand1, contrastMode);
186
+ const brand2Theme = generateThemeForColor(colors.brand2, contrastMode);
187
+ const brand3Theme = generateThemeForColor(colors.brand3, contrastMode);
188
+ return {
189
+ accent: accentTheme,
190
+ neutral: neutralTheme,
191
+ brand1: brand1Theme,
192
+ brand2: brand2Theme,
193
+ brand3: brand3Theme
194
+ };
208
195
  };
209
- var calculateContrastTwoColor = (color) => {
210
- const contrastWhite = getContrastFromHex(color, "#ffffff");
211
- const contrastBlack = getContrastFromHex(color, "#000000");
212
- const lightness = getLightnessFromHex(color);
213
- const doubleALightnessModifier = lightness <= 40 ? 60 : lightness >= 60 ? 60 : 50;
214
- let targetLightness = 0;
215
- const contrastDirection = contrastWhite >= contrastBlack ? "lighten" : "darken";
216
- targetLightness = contrastDirection === "lighten" ? lightness + doubleALightnessModifier : lightness - doubleALightnessModifier;
217
- return createColorWithLightness(color, targetLightness);
196
+ /**
197
+ *
198
+ * This function calculates a color that can be used as a strong contrast color to a base color.
199
+ *
200
+ * @param baseColor The base color
201
+ */ export const calculateContrastOneColor = (baseColor)=>{
202
+ const contrastWhite = getContrastFromHex(baseColor, '#ffffff');
203
+ const contrastBlack = getContrastFromHex(baseColor, '#000000');
204
+ const lightness = contrastWhite >= contrastBlack ? 100 : 0;
205
+ // const color = createColorWithLightness(baseColor, lightness);
206
+ return lightness === 0 ? '#000000' : '#ffffff';
218
207
  };
219
- var canTextBeUsedOnColors = (baseDefaultColor, baseActiveColor) => {
220
- const defaultAgainstWhite = getContrastFromHex(baseDefaultColor, "#ffffff");
221
- const defaultAgainstBlack = getContrastFromHex(baseDefaultColor, "#000000");
222
- const activeAgainstWhite = getContrastFromHex(baseActiveColor, "#ffffff");
223
- const activeAgainstBlack = getContrastFromHex(baseActiveColor, "#000000");
224
- if (defaultAgainstWhite >= 4.5 && activeAgainstWhite >= 4.5) {
225
- return true;
226
- } else if (defaultAgainstBlack >= 4.5 && activeAgainstBlack >= 4.5) {
227
- return true;
228
- }
229
- return false;
208
+ /**
209
+ *
210
+ * This function calculates a color that can be used as a subtle contrast color to a base color.
211
+ *
212
+ * @param color The base color
213
+ */ export const calculateContrastTwoColor = (color)=>{
214
+ const contrastWhite = getContrastFromHex(color, '#ffffff');
215
+ const contrastBlack = getContrastFromHex(color, '#000000');
216
+ const lightness = getLightnessFromHex(color);
217
+ const doubleALightnessModifier = lightness <= 40 ? 60 : lightness >= 60 ? 60 : 50;
218
+ let targetLightness = 0;
219
+ const contrastDirection = contrastWhite >= contrastBlack ? 'lighten' : 'darken';
220
+ targetLightness = contrastDirection === 'lighten' ? lightness + doubleALightnessModifier : lightness - doubleALightnessModifier;
221
+ return createColorWithLightness(color, targetLightness);
230
222
  };
231
- var createColorWithLightness = (color, lightness) => {
232
- const leoBackgroundColor = new BackgroundColor({
233
- name: "backgroundColor",
234
- colorKeys: ["#ffffff"],
235
- ratios: [1]
236
- });
237
- const colors = new Color({
238
- name: "color",
239
- colorKeys: [color],
240
- ratios: [getContrastFromLightness(lightness, color, "#ffffff")]
241
- });
242
- const theme = new Theme({
243
- colors: [colors],
244
- backgroundColor: leoBackgroundColor,
245
- lightness: 100
246
- });
247
- return theme.contrastColorValues[0];
223
+ /**
224
+ *
225
+ * This function checks if white or black text can be used on 2 different colors at 4.5:1 contrast.
226
+ *
227
+ * @param baseDefaultColor Base default color
228
+ * @param baseActiveColor Base active color
229
+ */ export const canTextBeUsedOnColors = (baseDefaultColor, baseActiveColor)=>{
230
+ const defaultAgainstWhite = getContrastFromHex(baseDefaultColor, '#ffffff');
231
+ const defaultAgainstBlack = getContrastFromHex(baseDefaultColor, '#000000');
232
+ const activeAgainstWhite = getContrastFromHex(baseActiveColor, '#ffffff');
233
+ const activeAgainstBlack = getContrastFromHex(baseActiveColor, '#000000');
234
+ if (defaultAgainstWhite >= 4.5 && activeAgainstWhite >= 4.5) {
235
+ return true;
236
+ } else if (defaultAgainstBlack >= 4.5 && activeAgainstBlack >= 4.5) {
237
+ return true;
238
+ }
239
+ return false;
248
240
  };
249
- var getColorNumberFromName = (name) => {
250
- const colorMap = {
251
- "Background Default": 1,
252
- "Background Subtle": 2,
253
- "Surface Default": 3,
254
- "Surface Hover": 4,
255
- "Surface Active": 5,
256
- "Border Subtle": 6,
257
- "Border Default": 7,
258
- "Border Strong": 8,
259
- "Base Default": 9,
260
- "Base Hover": 10,
261
- "Base Active": 11,
262
- "Text Subtle": 12,
263
- "Text Default": 13,
264
- "Contrast Default": 14,
265
- "Contrast Subtle": 15
266
- };
267
- return colorMap[name];
241
+ /**
242
+ *
243
+ * This function creates a color with a specific lightness value.
244
+ *
245
+ * @param color The base color
246
+ * @param lightness The lightness value from 0 to 100
247
+ */ export const createColorWithLightness = (color, lightness)=>{
248
+ const leoBackgroundColor = new BackgroundColor({
249
+ name: 'backgroundColor',
250
+ colorKeys: [
251
+ '#ffffff'
252
+ ],
253
+ ratios: [
254
+ 1
255
+ ]
256
+ });
257
+ const colors = new Color({
258
+ name: 'color',
259
+ colorKeys: [
260
+ color
261
+ ],
262
+ ratios: [
263
+ getContrastFromLightness(lightness, color, '#ffffff')
264
+ ]
265
+ });
266
+ const theme = new Theme({
267
+ colors: [
268
+ colors
269
+ ],
270
+ backgroundColor: leoBackgroundColor,
271
+ lightness: 100
272
+ });
273
+ return theme.contrastColorValues[0];
268
274
  };
269
- var getColorNameFromNumber = (number) => {
270
- const colorMap = {
271
- 1: "Background Default",
272
- 2: "Background Subtle",
273
- 3: "Surface Default",
274
- 4: "Surface Hover",
275
- 5: "Surface Active",
276
- 6: "Border Subtle",
277
- 7: "Border Default",
278
- 8: "Border Strong",
279
- 9: "Base Default",
280
- 10: "Base Hover",
281
- 11: "Base Active",
282
- 12: "Text Subtle",
283
- 13: "Text Default",
284
- 14: "Contrast Default",
285
- 15: "Contrast Subtle"
286
- };
287
- return colorMap[number];
275
+ /**
276
+ *
277
+ * This function returns the color number based on the color name.
278
+ *
279
+ * @param name The name of the color
280
+ */ export const getColorNumberFromName = (name)=>{
281
+ const colorMap = {
282
+ 'Background Default': 1,
283
+ 'Background Subtle': 2,
284
+ 'Surface Default': 3,
285
+ 'Surface Hover': 4,
286
+ 'Surface Active': 5,
287
+ 'Border Subtle': 6,
288
+ 'Border Default': 7,
289
+ 'Border Strong': 8,
290
+ 'Base Default': 9,
291
+ 'Base Hover': 10,
292
+ 'Base Active': 11,
293
+ 'Text Subtle': 12,
294
+ 'Text Default': 13,
295
+ 'Contrast Default': 14,
296
+ 'Contrast Subtle': 15
297
+ };
298
+ return colorMap[name];
288
299
  };
289
- var getBaseColor = (color) => {
290
- const conv = new Hsluv2();
291
- conv.hex = color;
292
- conv.hexToHsluv();
293
- conv.hsluvToHex();
294
- return conv.hex;
300
+ /**
301
+ *
302
+ * This function returns the color name based on the color number.
303
+ *
304
+ * @param number The number of the color
305
+ */ export const getColorNameFromNumber = (number)=>{
306
+ const colorMap = {
307
+ 1: 'Background Default',
308
+ 2: 'Background Subtle',
309
+ 3: 'Surface Default',
310
+ 4: 'Surface Hover',
311
+ 5: 'Surface Active',
312
+ 6: 'Border Subtle',
313
+ 7: 'Border Default',
314
+ 8: 'Border Strong',
315
+ 9: 'Base Default',
316
+ 10: 'Base Hover',
317
+ 11: 'Base Active',
318
+ 12: 'Text Subtle',
319
+ 13: 'Text Default',
320
+ 14: 'Contrast Default',
321
+ 15: 'Contrast Subtle'
322
+ };
323
+ return colorMap[number];
295
324
  };
296
- var getCssVariable = (colorType, colorNumber) => {
297
- return `--ds-${colorType}-${getColorNameFromNumber(colorNumber).toLowerCase().replace(/\s/g, "-")}`;
325
+ export const getBaseColor = (color)=>{
326
+ const conv = new Hsluv();
327
+ conv.hex = color;
328
+ conv.hexToHsluv();
329
+ // conv.hsluv_l = 100 - conv.hsluv_l;
330
+ // conv.hsluv_s = getSaturationForDarkMode(color, conv.hsluv_s);
331
+ conv.hsluvToHex();
332
+ return conv.hex;
298
333
  };
299
- export {
300
- calculateContrastOneColor,
301
- calculateContrastTwoColor,
302
- canTextBeUsedOnColors,
303
- createColorWithLightness,
304
- generateColorTheme,
305
- generateGlobalColors,
306
- generateScaleForColor,
307
- generateThemeForColor,
308
- getBaseColor,
309
- getColorNameFromNumber,
310
- getColorNumberFromName,
311
- getCssVariable
334
+ export const getCssVariable = (colorType, colorNumber)=>{
335
+ return `--ds-${colorType}-${getColorNameFromNumber(colorNumber).toLowerCase().replace(/\s/g, '-')}`;
312
336
  };
313
- /*! Bundled license information:
314
-
315
- colorparsley/src/colorparsley.js:
316
- (** @preserve
317
- ///// CoLoR PaRsLeY a simple set of color parsing thingies!
318
- ///// Beta 0.1.8 Revision date: June 04, 2022
319
- /////
320
- ///// Functions to parse color values and return array
321
- ///// Copyright (c) 2019-2022 by Andrew Somers. All Rights Reserved.
322
- ///// LICENSE: AGPL 3
323
- ///// CONTACT: Please use the ISSUES or DISCUSSIONS tab at:
324
- ///// https://github.com/Myndex/colorparsley/
325
- /////
326
- ///////////////////////////////////////////////////////////////////////////////
327
- /////
328
- ///// IMPORT:
329
- ///// import { colorParsley } from 'colorparsley';
330
- /////
331
- ///// let rgbaArray = colorParsley('#abcdef');
332
- /////
333
- ///// Output as array: [r,g,b,a,isValid,colorspace]
334
- ///// Example: [123,123,123,1.0,true,'sRGB']
335
- // *)
336
-
337
- apca-w3/src/apca-w3.js:
338
- (** @preserve
339
- ///// SAPC APCA - Advanced Perceptual Contrast Algorithm
340
- ///// Beta 0.1.9 W3 • contrast function only
341
- ///// DIST: W3 • Revision date: July 3, 2022
342
- ///// Function to parse color values and determine Lc contrast
343
- ///// Copyright © 2019-2022 by Andrew Somers. All Rights Reserved.
344
- ///// LICENSE: W3 LICENSE
345
- ///// CONTACT: Please use the ISSUES or DISCUSSIONS tab at:
346
- ///// https://github.com/Myndex/SAPC-APCA/
347
- /////
348
- ///////////////////////////////////////////////////////////////////////////////
349
- /////
350
- ///// MINIMAL IMPORTS:
351
- ///// import { APCAcontrast, sRGBtoY, displayP3toY,
352
- ///// calcAPCA, fontLookupAPCA } from 'apca-w3';
353
- ///// import { colorParsley } from 'colorparsley';
354
- /////
355
- ///// FORWARD CONTRAST USAGE:
356
- ///// Lc = APCAcontrast( sRGBtoY( TEXTcolor ) , sRGBtoY( BACKGNDcolor ) );
357
- ///// Where the colors are sent as an rgba array [255,255,255,1]
358
- /////
359
- ///// Retrieving an array of font sizes for the contrast:
360
- ///// fontArray = fontLookupAPCA(Lc);
361
- /////
362
- ///// Live Demonstrator at https://www.myndex.com/APCA/
363
- // *)
364
- */
365
- //# sourceMappingURL=themeUtils.js.map