@tbela99/css-parser 1.1.1 → 1.3.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 (107) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +53 -6
  3. package/dist/index-umd-web.js +5503 -5037
  4. package/dist/index.cjs +5510 -5044
  5. package/dist/index.d.ts +148 -41
  6. package/dist/lib/ast/expand.js +81 -65
  7. package/dist/lib/ast/features/calc.js +14 -36
  8. package/dist/lib/ast/features/inlinecssvariables.js +6 -17
  9. package/dist/lib/ast/features/prefix.js +22 -19
  10. package/dist/lib/ast/features/shorthand.js +1 -1
  11. package/dist/lib/ast/features/transform.js +17 -2
  12. package/dist/lib/ast/math/expression.js +74 -172
  13. package/dist/lib/ast/math/math.js +24 -22
  14. package/dist/lib/ast/minify.js +249 -199
  15. package/dist/lib/ast/transform/compute.js +18 -41
  16. package/dist/lib/ast/transform/matrix.js +36 -36
  17. package/dist/lib/ast/transform/minify.js +37 -59
  18. package/dist/lib/ast/transform/perspective.js +1 -1
  19. package/dist/lib/ast/transform/rotate.js +13 -13
  20. package/dist/lib/ast/transform/scale.js +8 -8
  21. package/dist/lib/ast/transform/skew.js +4 -4
  22. package/dist/lib/ast/transform/translate.js +8 -8
  23. package/dist/lib/ast/transform/utils.js +80 -28
  24. package/dist/lib/ast/types.js +122 -2
  25. package/dist/lib/fs/resolve.js +1 -14
  26. package/dist/lib/parser/declaration/list.js +1 -1
  27. package/dist/lib/parser/declaration/map.js +1 -1
  28. package/dist/lib/parser/declaration/set.js +3 -3
  29. package/dist/lib/parser/parse.js +53 -107
  30. package/dist/lib/parser/tokenize.js +29 -53
  31. package/dist/lib/parser/utils/declaration.js +1 -1
  32. package/dist/lib/parser/utils/type.js +2 -2
  33. package/dist/lib/renderer/render.js +79 -194
  34. package/dist/lib/{renderer → syntax}/color/a98rgb.js +2 -2
  35. package/dist/lib/syntax/color/cmyk.js +104 -0
  36. package/dist/lib/{renderer → syntax}/color/color-mix.js +31 -33
  37. package/dist/lib/syntax/color/color.js +581 -0
  38. package/dist/lib/syntax/color/hex.js +179 -0
  39. package/dist/lib/syntax/color/hsl.js +201 -0
  40. package/dist/lib/syntax/color/hwb.js +204 -0
  41. package/dist/lib/syntax/color/lab.js +262 -0
  42. package/dist/lib/syntax/color/lch.js +194 -0
  43. package/dist/lib/syntax/color/oklab.js +237 -0
  44. package/dist/lib/syntax/color/oklch.js +166 -0
  45. package/dist/lib/{renderer → syntax}/color/p3.js +3 -3
  46. package/dist/lib/{renderer → syntax}/color/rec2020.js +11 -11
  47. package/dist/lib/{renderer → syntax}/color/relativecolor.js +54 -41
  48. package/dist/lib/syntax/color/rgb.js +140 -0
  49. package/dist/lib/{renderer → syntax}/color/srgb.js +58 -46
  50. package/dist/lib/syntax/color/utils/components.js +46 -0
  51. package/dist/lib/{renderer → syntax}/color/utils/constants.js +6 -33
  52. package/dist/lib/syntax/color/utils/distance.js +40 -0
  53. package/dist/lib/{renderer → syntax}/color/xyz.js +27 -14
  54. package/dist/lib/{renderer → syntax}/color/xyzd50.js +8 -8
  55. package/dist/lib/syntax/syntax.js +78 -77
  56. package/dist/lib/syntax/utils.js +70 -0
  57. package/dist/lib/validation/at-rules/container.js +1 -1
  58. package/dist/lib/validation/at-rules/counter-style.js +1 -1
  59. package/dist/lib/validation/at-rules/custom-media.js +1 -1
  60. package/dist/lib/validation/at-rules/document.js +2 -2
  61. package/dist/lib/validation/at-rules/font-feature-values.js +2 -2
  62. package/dist/lib/validation/at-rules/import.js +5 -5
  63. package/dist/lib/validation/at-rules/keyframes.js +3 -13
  64. package/dist/lib/validation/at-rules/layer.js +1 -1
  65. package/dist/lib/validation/at-rules/media.js +1 -1
  66. package/dist/lib/validation/at-rules/namespace.js +1 -1
  67. package/dist/lib/validation/at-rules/page-margin-box.js +1 -1
  68. package/dist/lib/validation/at-rules/page.js +1 -1
  69. package/dist/lib/validation/at-rules/supports.js +7 -7
  70. package/dist/lib/validation/at-rules/when.js +1 -1
  71. package/dist/lib/validation/atrule.js +2 -2
  72. package/dist/lib/validation/config.js +0 -3
  73. package/dist/lib/validation/config.json.js +1 -1
  74. package/dist/lib/validation/parser/parse.js +8 -11
  75. package/dist/lib/validation/selector.js +1 -9
  76. package/dist/lib/validation/syntax.js +67 -137
  77. package/dist/lib/validation/syntaxes/complex-selector-list.js +2 -19
  78. package/dist/lib/validation/syntaxes/complex-selector.js +1 -1
  79. package/dist/lib/validation/syntaxes/compound-selector.js +5 -24
  80. package/dist/lib/validation/syntaxes/family-name.js +5 -40
  81. package/dist/lib/validation/syntaxes/keyframe-selector.js +3 -22
  82. package/dist/lib/validation/syntaxes/layer-name.js +1 -1
  83. package/dist/lib/validation/syntaxes/relative-selector-list.js +1 -25
  84. package/dist/lib/validation/syntaxes/relative-selector.js +1 -1
  85. package/dist/lib/validation/syntaxes/url.js +3 -34
  86. package/dist/lib/validation/utils/list.js +2 -9
  87. package/dist/lib/validation/utils/whitespace.js +1 -1
  88. package/dist/node/index.js +4 -2
  89. package/dist/web/index.js +4 -2
  90. package/package.json +4 -4
  91. package/.editorconfig +0 -484
  92. package/dist/lib/ast/transform/convert.js +0 -33
  93. package/dist/lib/ast/utils/utils.js +0 -104
  94. package/dist/lib/renderer/color/color.js +0 -654
  95. package/dist/lib/renderer/color/hex.js +0 -105
  96. package/dist/lib/renderer/color/hsl.js +0 -125
  97. package/dist/lib/renderer/color/hwb.js +0 -103
  98. package/dist/lib/renderer/color/lab.js +0 -148
  99. package/dist/lib/renderer/color/lch.js +0 -90
  100. package/dist/lib/renderer/color/oklab.js +0 -131
  101. package/dist/lib/renderer/color/oklch.js +0 -75
  102. package/dist/lib/renderer/color/rgb.js +0 -50
  103. package/dist/lib/renderer/color/utils/components.js +0 -34
  104. package/dist/lib/validation/syntaxes/keyframe-block-list.js +0 -28
  105. package/dist/lib/{renderer → syntax}/color/hsv.js +0 -0
  106. package/dist/lib/{renderer → syntax}/color/prophotorgb.js +1 -1
  107. /package/dist/lib/{renderer → syntax}/color/utils/matrix.js +0 -0
@@ -0,0 +1,179 @@
1
+ import { EnumToken, ColorType } from '../../ast/types.js';
2
+ import '../../ast/minify.js';
3
+ import '../../ast/walk.js';
4
+ import '../../parser/parse.js';
5
+ import '../../parser/tokenize.js';
6
+ import '../../parser/utils/config.js';
7
+ import { color2srgbvalues, getNumber } from './color.js';
8
+ import { srgb2rgb, cmyk2rgbvalues, hwb2rgbvalues, hsl2rgbvalues } from './rgb.js';
9
+ import { COLORS_NAMES, NAMES_COLORS } from './utils/constants.js';
10
+ import { getComponents } from './utils/components.js';
11
+ import { lch2srgbvalues, lab2srgbvalues, oklch2srgbvalues, oklab2srgbvalues } from './srgb.js';
12
+ import '../../renderer/sourcemap/lib/encode.js';
13
+
14
+ function toHexString(acc, value) {
15
+ return acc + value.toString(16).padStart(2, '0');
16
+ }
17
+ function reduceHexValue(value) {
18
+ if (value[0] != '#') {
19
+ value = COLORS_NAMES[value.toLowerCase()] ?? value;
20
+ }
21
+ const named_color = NAMES_COLORS[expandHexValue(value)];
22
+ if (value.length == 7) {
23
+ if (value[1] == value[2] &&
24
+ value[3] == value[4] &&
25
+ value[5] == value[6]) {
26
+ value = `#${value[1]}${value[3]}${value[5]}`;
27
+ }
28
+ }
29
+ else if (value.length == 9) {
30
+ if (value[1] == value[2] &&
31
+ value[3] == value[4] &&
32
+ value[5] == value[6] &&
33
+ value[7] == value[8]) {
34
+ value = `#${value[1]}${value[3]}${value[5]}${value[7] == 'f' ? '' : value[7]}`;
35
+ }
36
+ }
37
+ return named_color != null && named_color.length <= value.length ? named_color : value;
38
+ }
39
+ function expandHexValue(value) {
40
+ if (value.length == 4) {
41
+ return `#${value[1]}${value[1]}${value[2]}${value[2]}${value[3]}${value[3]}`;
42
+ }
43
+ if (value.length == 5) {
44
+ return `#${value[1]}${value[1]}${value[2]}${value[2]}${value[3]}${value[3]}${value[4]}${value[4]}`;
45
+ }
46
+ return value;
47
+ }
48
+ function rgb2HexToken(token) {
49
+ let value = rgb2hexvalues(token);
50
+ if (value == null) {
51
+ return null;
52
+ }
53
+ return hexToken(value);
54
+ }
55
+ function hsl2HexToken(token) {
56
+ let value = hsl2hexvalues(token);
57
+ if (value == null) {
58
+ return null;
59
+ }
60
+ return hexToken(value);
61
+ }
62
+ function cmyk2HexToken(token) {
63
+ let value = cmyk2hexvalues(token);
64
+ if (value == null) {
65
+ return null;
66
+ }
67
+ return hexToken(value);
68
+ }
69
+ function hwb2HexToken(token) {
70
+ let value = hwb2hexvalues(token);
71
+ if (value == null) {
72
+ return null;
73
+ }
74
+ return hexToken(value);
75
+ }
76
+ function color2HexToken(token) {
77
+ let value = color2srgbvalues(token);
78
+ if (value == null) {
79
+ return null;
80
+ }
81
+ return hexToken(value.reduce((acc, curr) => acc + srgb2rgb(curr).toString(16).padStart(2, '0'), '#'));
82
+ }
83
+ function oklab2HexToken(token) {
84
+ let value = oklab2srgbvalues(token);
85
+ if (value == null) {
86
+ return null;
87
+ }
88
+ return hexToken(value.reduce((acc, curr) => acc + srgb2rgb(curr).toString(16).padStart(2, '0'), '#'));
89
+ }
90
+ function oklch2HexToken(token) {
91
+ let value = oklch2srgbvalues(token);
92
+ if (value == null) {
93
+ return null;
94
+ }
95
+ return hexToken(value.reduce((acc, curr) => acc + srgb2rgb(curr).toString(16).padStart(2, '0'), '#'));
96
+ }
97
+ function lab2HexToken(token) {
98
+ let value = lab2srgbvalues(token);
99
+ if (value == null) {
100
+ return null;
101
+ }
102
+ return hexToken(value.reduce((acc, curr) => acc + srgb2rgb(curr).toString(16).padStart(2, '0'), '#'));
103
+ }
104
+ function lch2HexToken(token) {
105
+ let value = lch2srgbvalues(token);
106
+ if (value == null) {
107
+ return null;
108
+ }
109
+ return hexToken(value.reduce((acc, curr) => acc + srgb2rgb(curr).toString(16).padStart(2, '0'), '#'));
110
+ }
111
+ function hexToken(value) {
112
+ value = reduceHexValue(value);
113
+ return {
114
+ typ: EnumToken.ColorTokenType,
115
+ val: value,
116
+ kin: value[0] == '#' ? ColorType.HEX : ColorType.LIT
117
+ };
118
+ }
119
+ function rgb2hexvalues(token) {
120
+ let value = '#';
121
+ let t;
122
+ // @ts-ignore
123
+ const components = getComponents(token);
124
+ if (components == null || components.length < 3) {
125
+ return null;
126
+ }
127
+ // @ts-ignore
128
+ for (let i = 0; i < 3; i++) {
129
+ // @ts-ignore
130
+ t = components[i];
131
+ // @ts-ignore
132
+ value += (t.typ == EnumToken.Iden && t.val == 'none' ? '0' : Math.round(getNumber(t) * (t.typ == EnumToken.PercentageTokenType ? 255 : 1))).toString(16).padStart(2, '0');
133
+ }
134
+ // @ts-ignore
135
+ if (components.length == 4) {
136
+ // @ts-ignore
137
+ t = components[3];
138
+ // @ts-ignore
139
+ const v = getNumber(t);
140
+ // @ts-ignore
141
+ if (v < 1) {
142
+ // @ts-ignore
143
+ value += Math.round(255 * getNumber(t)).toString(16).padStart(2, '0');
144
+ }
145
+ }
146
+ return value;
147
+ }
148
+ function hsl2hexvalues(token) {
149
+ const t = hsl2rgbvalues(token);
150
+ if (t == null) {
151
+ return null;
152
+ }
153
+ if (t.length == 4) {
154
+ t[3] = srgb2rgb(t[3]);
155
+ }
156
+ return `${t.reduce(toHexString, '#')}`;
157
+ }
158
+ function hwb2hexvalues(token) {
159
+ const t = hwb2rgbvalues(token);
160
+ if (t == null) {
161
+ return null;
162
+ }
163
+ if (t.length == 4) {
164
+ t[3] = srgb2rgb(t[3]);
165
+ }
166
+ return `${t.reduce(toHexString, '#')}`;
167
+ }
168
+ function cmyk2hexvalues(token) {
169
+ const t = cmyk2rgbvalues(token);
170
+ if (t == null) {
171
+ return null;
172
+ }
173
+ if (t.length == 4) {
174
+ t[3] = srgb2rgb(t[3]);
175
+ }
176
+ return `#${t.reduce(toHexString, '')}`;
177
+ }
178
+
179
+ export { cmyk2HexToken, cmyk2hexvalues, color2HexToken, expandHexValue, hsl2HexToken, hsl2hexvalues, hwb2HexToken, hwb2hexvalues, lab2HexToken, lch2HexToken, oklab2HexToken, oklch2HexToken, reduceHexValue, rgb2HexToken, rgb2hexvalues };
@@ -0,0 +1,201 @@
1
+ import { hwb2hsv } from './hsv.js';
2
+ import { color2srgbvalues, toPrecisionAngle, getNumber } from './color.js';
3
+ import { lch2rgbvalues, lab2rgbvalues, cmyk2rgbvalues } from './rgb.js';
4
+ import './utils/constants.js';
5
+ import { getComponents } from './utils/components.js';
6
+ import { hex2srgbvalues, oklch2srgbvalues, oklab2srgbvalues, hslvalues } from './srgb.js';
7
+ import { EnumToken, ColorType } from '../../ast/types.js';
8
+ import '../../ast/minify.js';
9
+ import '../../ast/walk.js';
10
+ import '../../parser/parse.js';
11
+ import '../../parser/tokenize.js';
12
+ import '../../parser/utils/config.js';
13
+ import '../../renderer/sourcemap/lib/encode.js';
14
+
15
+ function hex2HslToken(token) {
16
+ // @ts-ignore
17
+ return hslToken(srgb2hslvalues(...hex2srgbvalues(token)));
18
+ }
19
+ function rgb2HslToken(token) {
20
+ const values = rgb2hslvalues(token);
21
+ if (values == null) {
22
+ return null;
23
+ }
24
+ return hslToken(values);
25
+ }
26
+ function hwb2HslToken(token) {
27
+ const values = hwb2hslvalues(token);
28
+ if (values == null) {
29
+ return null;
30
+ }
31
+ return hslToken(values);
32
+ }
33
+ function cmyk2HslToken(token) {
34
+ const values = cmyk2hslvalues(token);
35
+ if (values == null) {
36
+ return null;
37
+ }
38
+ return hslToken(values);
39
+ }
40
+ function oklab2HslToken(token) {
41
+ const values = oklab2hslvalues(token);
42
+ if (values == null) {
43
+ return null;
44
+ }
45
+ return hslToken(values);
46
+ }
47
+ function oklch2HslToken(token) {
48
+ const values = oklch2hslvalues(token);
49
+ if (values == null) {
50
+ return null;
51
+ }
52
+ return hslToken(values);
53
+ }
54
+ function lab2HslToken(token) {
55
+ const values = lab2hslvalues(token);
56
+ if (values == null) {
57
+ return null;
58
+ }
59
+ return hslToken(values);
60
+ }
61
+ function lch2HslToken(token) {
62
+ const values = lch2hslvalues(token);
63
+ if (values == null) {
64
+ return null;
65
+ }
66
+ return hslToken(values);
67
+ }
68
+ function color2HslToken(token) {
69
+ const values = color2srgbvalues(token);
70
+ if (values == null) {
71
+ return null;
72
+ }
73
+ // @ts-ignore
74
+ return hslToken(srgb2hslvalues(...values));
75
+ }
76
+ function hslToken(values) {
77
+ values[0] = toPrecisionAngle(values[0] * 360);
78
+ const chi = [
79
+ { typ: EnumToken.NumberTokenType, val: values[0] },
80
+ { typ: EnumToken.PercentageTokenType, val: values[1] * 100 },
81
+ { typ: EnumToken.PercentageTokenType, val: values[2] * 100 },
82
+ ];
83
+ if (values.length == 4 && values[3] != 1) {
84
+ chi.push({ typ: EnumToken.LiteralTokenType, val: '/' }, { typ: EnumToken.PercentageTokenType, val: values[3] * 100 });
85
+ }
86
+ return {
87
+ typ: EnumToken.ColorTokenType,
88
+ val: 'hsl',
89
+ chi,
90
+ kin: ColorType.HSL
91
+ };
92
+ }
93
+ function rgb2hslvalues(token) {
94
+ const chi = getComponents(token);
95
+ if (chi == null || chi.length < 3) {
96
+ return null;
97
+ }
98
+ // @ts-ignore
99
+ let t = chi[0];
100
+ // @ts-ignore
101
+ let r = getNumber(t);
102
+ // @ts-ignore
103
+ t = chi[1];
104
+ // @ts-ignore
105
+ let g = getNumber(t);
106
+ // @ts-ignore
107
+ t = chi[2];
108
+ // @ts-ignore
109
+ let b = getNumber(t);
110
+ // @ts-ignore
111
+ let a = null;
112
+ if (chi.length == 4) {
113
+ a = getNumber(chi[3]);
114
+ }
115
+ const values = [r, g, b];
116
+ if (a != null && a != 1) {
117
+ values.push(a);
118
+ }
119
+ // @ts-ignore
120
+ return rgbvalues2hslvalues(...values);
121
+ }
122
+ // https://gist.github.com/defims/0ca2ef8832833186ed396a2f8a204117#file-annotated-js
123
+ function hsv2hsl(h, s, v, a) {
124
+ const result = [
125
+ //[hue, saturation, lightness]
126
+ //Range should be between 0 - 1
127
+ h, //Hue stays the same
128
+ //Saturation is very different between the two color spaces
129
+ //If (2-sat)*val < 1 set it to sat*val/((2-sat)*val)
130
+ //Otherwise sat*val/(2-(2-sat)*val)
131
+ //Conditional is not operating with hue, it is reassigned!
132
+ s * v / ((h = (2 - s) * v) < 1 ? h : 2 - h),
133
+ h / 2, //Lightness is (2-sat)*val/2
134
+ ];
135
+ if (a != null) {
136
+ result.push(a);
137
+ }
138
+ return result;
139
+ }
140
+ function cmyk2hslvalues(token) {
141
+ const values = cmyk2rgbvalues(token);
142
+ // @ts-ignore
143
+ return values == null ? null : rgbvalues2hslvalues(...values);
144
+ }
145
+ function hwb2hslvalues(token) {
146
+ // @ts-ignore
147
+ return hsv2hsl(...hwb2hsv(...Object.values(hslvalues(token))));
148
+ }
149
+ function lab2hslvalues(token) {
150
+ // @ts-ignore
151
+ return rgbvalues2hslvalues(...lab2rgbvalues(token));
152
+ }
153
+ function lch2hslvalues(token) {
154
+ // @ts-ignore
155
+ return rgbvalues2hslvalues(...lch2rgbvalues(token));
156
+ }
157
+ function oklab2hslvalues(token) {
158
+ const t = oklab2srgbvalues(token);
159
+ // @ts-ignore
160
+ return t == null ? null : srgb2hslvalues(...t);
161
+ }
162
+ function oklch2hslvalues(token) {
163
+ const t = oklch2srgbvalues(token);
164
+ // @ts-ignore
165
+ return t == null ? null : srgb2hslvalues(...t);
166
+ }
167
+ function rgbvalues2hslvalues(r, g, b, a = null) {
168
+ return srgb2hslvalues(r / 255, g / 255, b / 255, a);
169
+ }
170
+ function srgb2hslvalues(r, g, b, a = null) {
171
+ let max = Math.max(r, g, b);
172
+ let min = Math.min(r, g, b);
173
+ let h = 0;
174
+ let s = 0;
175
+ let l = (max + min) / 2;
176
+ if (max != min) {
177
+ let d = max - min;
178
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
179
+ switch (max) {
180
+ case r:
181
+ h = (g - b) / d + (g < b ? 6 : 0);
182
+ break;
183
+ case g:
184
+ h = (b - r) / d + 2;
185
+ break;
186
+ case b:
187
+ h = (r - g) / d + 4;
188
+ break;
189
+ }
190
+ h /= 6;
191
+ }
192
+ const hsl = [h, s, l];
193
+ if (a != null && a < 1) {
194
+ // @ts-ignore
195
+ return hsl.concat([a]);
196
+ }
197
+ // @ts-ignore
198
+ return hsl;
199
+ }
200
+
201
+ export { cmyk2HslToken, cmyk2hslvalues, color2HslToken, hex2HslToken, hsv2hsl, hwb2HslToken, hwb2hslvalues, lab2HslToken, lab2hslvalues, lch2HslToken, lch2hslvalues, oklab2HslToken, oklab2hslvalues, oklch2HslToken, oklch2hslvalues, rgb2HslToken, rgb2hslvalues, rgbvalues2hslvalues, srgb2hslvalues };
@@ -0,0 +1,204 @@
1
+ import { hsl2hsv } from './hsv.js';
2
+ import './utils/constants.js';
3
+ import { getComponents } from './utils/components.js';
4
+ import { color2srgbvalues, toPrecisionAngle, getAngle, getNumber } from './color.js';
5
+ import { cmyk2srgbvalues, lch2srgbvalues, lab2srgbvalues, oklch2srgbvalues, oklab2srgbvalues } from './srgb.js';
6
+ import { EnumToken, ColorType } from '../../ast/types.js';
7
+ import '../../ast/minify.js';
8
+ import '../../ast/walk.js';
9
+ import '../../parser/parse.js';
10
+ import '../../parser/tokenize.js';
11
+ import '../../parser/utils/config.js';
12
+ import '../../renderer/sourcemap/lib/encode.js';
13
+
14
+ function rgb2hwbToken(token) {
15
+ const values = rgb2hwbvalues(token);
16
+ if (values == null) {
17
+ return null;
18
+ }
19
+ return hwbToken(values);
20
+ }
21
+ function hsl2hwbToken(token) {
22
+ const values = hsl2hwbvalues(token);
23
+ if (values == null) {
24
+ return null;
25
+ }
26
+ return hwbToken(values);
27
+ }
28
+ function cmyk2hwbToken(token) {
29
+ const values = cmyk2hwbvalues(token);
30
+ if (values == null) {
31
+ return null;
32
+ }
33
+ return hwbToken(values);
34
+ }
35
+ function oklab2hwbToken(token) {
36
+ const values = oklab2hwbvalues(token);
37
+ if (values == null) {
38
+ return null;
39
+ }
40
+ return hwbToken(values);
41
+ }
42
+ function oklch2hwbToken(token) {
43
+ const values = oklch2hwbvalues(token);
44
+ if (values == null) {
45
+ return null;
46
+ }
47
+ return hwbToken(values);
48
+ }
49
+ function lab2hwbToken(token) {
50
+ const values = lab2hwbvalues(token);
51
+ if (values == null) {
52
+ return null;
53
+ }
54
+ return hwbToken(values);
55
+ }
56
+ function lch2hwbToken(token) {
57
+ const values = lch2hwbvalues(token);
58
+ if (values == null) {
59
+ return null;
60
+ }
61
+ return hwbToken(values);
62
+ }
63
+ function color2hwbToken(token) {
64
+ const values = color2hwbvalues(token);
65
+ if (values == null) {
66
+ return null;
67
+ }
68
+ return hwbToken(values);
69
+ }
70
+ function hwbToken(values) {
71
+ values[0] = toPrecisionAngle(values[0] * 360);
72
+ const chi = [
73
+ { typ: EnumToken.NumberTokenType, val: values[0] },
74
+ { typ: EnumToken.PercentageTokenType, val: values[1] * 100 },
75
+ { typ: EnumToken.PercentageTokenType, val: values[2] * 100 },
76
+ ];
77
+ if (values.length == 4) {
78
+ chi.push({ typ: EnumToken.LiteralTokenType, val: '/' }, {
79
+ typ: EnumToken.PercentageTokenType,
80
+ val: values[3] * 100
81
+ });
82
+ }
83
+ return {
84
+ typ: EnumToken.ColorTokenType,
85
+ val: 'hwb',
86
+ chi,
87
+ kin: ColorType.HWB
88
+ };
89
+ }
90
+ function rgb2hwbvalues(token) {
91
+ // @ts-ignore
92
+ return srgb2hwb(...getComponents(token).map((t, index) => {
93
+ if (index == 3) {
94
+ return getNumber(t);
95
+ }
96
+ return getNumber(t) / 255;
97
+ }));
98
+ }
99
+ function cmyk2hwbvalues(token) {
100
+ // @ts-ignore
101
+ return srgb2hwb(...cmyk2srgbvalues(token));
102
+ }
103
+ function hsl2hwbvalues(token) {
104
+ // @ts-ignore
105
+ return hslvalues2hwbvalues(...getComponents(token).map((t, index) => {
106
+ if (index == 3 && (t.typ == EnumToken.IdenTokenType && t.val == 'none')) {
107
+ return 1;
108
+ }
109
+ if (index == 0) {
110
+ return getAngle(t);
111
+ }
112
+ return getNumber(t);
113
+ }));
114
+ }
115
+ function lab2hwbvalues(token) {
116
+ const values = lab2srgbvalues(token);
117
+ if (values == null) {
118
+ return null;
119
+ }
120
+ // @ts-ignore
121
+ return srgb2hwb(...values);
122
+ }
123
+ function lch2hwbvalues(token) {
124
+ const values = lch2srgbvalues(token);
125
+ if (values == null) {
126
+ return null;
127
+ }
128
+ // @ts-ignore
129
+ return srgb2hwb(...values);
130
+ }
131
+ function oklab2hwbvalues(token) {
132
+ const values = oklab2srgbvalues(token);
133
+ if (values == null) {
134
+ return null;
135
+ }
136
+ // @ts-ignore
137
+ return srgb2hwb(...values);
138
+ }
139
+ function oklch2hwbvalues(token) {
140
+ const values = oklch2srgbvalues(token);
141
+ // @ts-ignore
142
+ return values == null ? null : srgb2hwb(...values);
143
+ }
144
+ function rgb2hue(r, g, b, fallback = 0) {
145
+ let value = rgb2value(r, g, b);
146
+ let whiteness = rgb2whiteness(r, g, b);
147
+ let delta = value - whiteness;
148
+ if (delta > 0) {
149
+ // calculate segment
150
+ let segment = value === r ? (g - b) / delta : (value === g
151
+ ? (b - r) / delta
152
+ : (r - g) / delta);
153
+ // calculate shift
154
+ let shift = value === r ? segment < 0
155
+ ? 360 / 60
156
+ : 0 / 60 : (value === g
157
+ ? 120 / 60
158
+ : 240 / 60);
159
+ // calculate hue
160
+ return (segment + shift) * 60;
161
+ }
162
+ return fallback;
163
+ }
164
+ function rgb2value(r, g, b) {
165
+ return Math.max(r, g, b);
166
+ }
167
+ function rgb2whiteness(r, g, b) {
168
+ return Math.min(r, g, b);
169
+ }
170
+ function color2hwbvalues(token) {
171
+ const values = color2srgbvalues(token);
172
+ if (values == null) {
173
+ return null;
174
+ }
175
+ // @ts-ignore
176
+ return srgb2hwb(...values);
177
+ }
178
+ function srgb2hwb(r, g, b, a = null, fallback = 0) {
179
+ r *= 100;
180
+ g *= 100;
181
+ b *= 100;
182
+ let hue = rgb2hue(r, g, b, fallback);
183
+ let whiteness = rgb2whiteness(r, g, b);
184
+ let value = Math.round(rgb2value(r, g, b));
185
+ let blackness = 100 - value;
186
+ const result = [hue / 360, whiteness / 100, blackness / 100];
187
+ if (a != null) {
188
+ result.push(a);
189
+ }
190
+ return result;
191
+ }
192
+ function hsv2hwb(h, s, v, a = null) {
193
+ const result = [h, (1 - s) * v, 1 - v];
194
+ if (a != null) {
195
+ result.push(a);
196
+ }
197
+ return result;
198
+ }
199
+ function hslvalues2hwbvalues(h, s, l, a = null) {
200
+ // @ts-ignore
201
+ return hsv2hwb(...hsl2hsv(h, s, l, a));
202
+ }
203
+
204
+ export { cmyk2hwbToken, cmyk2hwbvalues, color2hwbToken, color2hwbvalues, hsl2hwbToken, hsl2hwbvalues, hslvalues2hwbvalues, hsv2hwb, hwbToken, lab2hwbToken, lab2hwbvalues, lch2hwbToken, lch2hwbvalues, oklab2hwbToken, oklab2hwbvalues, oklch2hwbToken, oklch2hwbvalues, rgb2hwbToken, rgb2hwbvalues, srgb2hwb };