@tbela99/css-parser 0.9.0 → 1.0.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 (70) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +22 -12
  3. package/dist/index-umd-web.js +2678 -2838
  4. package/dist/index.cjs +2468 -2628
  5. package/dist/index.d.ts +71 -26
  6. package/dist/lib/ast/expand.js +15 -2
  7. package/dist/lib/ast/features/calc.js +7 -10
  8. package/dist/lib/ast/features/index.js +1 -0
  9. package/dist/lib/ast/features/inlinecssvariables.js +0 -5
  10. package/dist/lib/ast/features/prefix.js +2 -7
  11. package/dist/lib/ast/features/shorthand.js +6 -9
  12. package/dist/lib/ast/features/transform.js +60 -0
  13. package/dist/lib/ast/math/expression.js +14 -10
  14. package/dist/lib/ast/math/math.js +14 -2
  15. package/dist/lib/ast/minify.js +47 -6
  16. package/dist/lib/ast/transform/compute.js +336 -0
  17. package/dist/lib/ast/transform/convert.js +33 -0
  18. package/dist/lib/ast/transform/matrix.js +111 -0
  19. package/dist/lib/ast/transform/minify.js +296 -0
  20. package/dist/lib/ast/transform/perspective.js +10 -0
  21. package/dist/lib/ast/transform/rotate.js +40 -0
  22. package/dist/lib/ast/transform/scale.js +32 -0
  23. package/dist/lib/ast/transform/skew.js +23 -0
  24. package/dist/lib/ast/transform/translate.js +32 -0
  25. package/dist/lib/ast/transform/utils.js +198 -0
  26. package/dist/lib/ast/types.js +2 -0
  27. package/dist/lib/ast/walk.js +23 -17
  28. package/dist/lib/parser/parse.js +174 -127
  29. package/dist/lib/parser/utils/declaration.js +1 -1
  30. package/dist/lib/renderer/color/{colormix.js → color-mix.js} +6 -0
  31. package/dist/lib/renderer/color/color.js +96 -20
  32. package/dist/lib/renderer/color/hex.js +17 -7
  33. package/dist/lib/renderer/color/hsl.js +7 -2
  34. package/dist/lib/renderer/color/lab.js +10 -1
  35. package/dist/lib/renderer/color/lch.js +8 -0
  36. package/dist/lib/renderer/color/oklab.js +8 -0
  37. package/dist/lib/renderer/color/oklch.js +8 -0
  38. package/dist/lib/renderer/color/prophotorgb.js +2 -2
  39. package/dist/lib/renderer/color/relativecolor.js +10 -21
  40. package/dist/lib/renderer/color/rgb.js +10 -7
  41. package/dist/lib/renderer/color/srgb.js +30 -6
  42. package/dist/lib/renderer/color/utils/components.js +13 -2
  43. package/dist/lib/renderer/color/xyz.js +2 -18
  44. package/dist/lib/renderer/color/xyzd50.js +20 -2
  45. package/dist/lib/renderer/render.js +70 -32
  46. package/dist/lib/renderer/sourcemap/sourcemap.js +1 -1
  47. package/dist/lib/syntax/syntax.js +75 -56
  48. package/dist/lib/validation/at-rules/container.js +6 -6
  49. package/dist/lib/validation/at-rules/document.js +40 -60
  50. package/dist/lib/validation/at-rules/import.js +61 -59
  51. package/dist/lib/validation/at-rules/keyframes.js +1 -1
  52. package/dist/lib/validation/at-rules/media.js +1 -1
  53. package/dist/lib/validation/at-rules/supports.js +40 -9
  54. package/dist/lib/validation/atrule.js +0 -4
  55. package/dist/lib/validation/config.json.js +83 -35
  56. package/dist/lib/validation/parser/parse.js +1 -95
  57. package/dist/lib/validation/parser/types.js +1 -2
  58. package/dist/lib/validation/selector.js +5 -2
  59. package/dist/lib/validation/syntaxes/compound-selector.js +2 -2
  60. package/dist/lib/validation/syntaxes/keyframe-block-list.js +2 -2
  61. package/dist/lib/validation/syntaxes/keyframe-selector.js +11 -90
  62. package/dist/lib/validation/syntaxes/layer-name.js +5 -16
  63. package/dist/lib/validation/syntaxes/relative-selector.js +15 -14
  64. package/dist/lib/validation/utils/list.js +18 -1
  65. package/dist/node/load.js +1 -1
  66. package/package.json +13 -12
  67. package/dist/lib/renderer/color/prophotoRgb.js +0 -56
  68. package/dist/lib/validation/declaration.js +0 -102
  69. package/dist/lib/validation/syntax.js +0 -1475
  70. package/dist/lib/validation/syntaxes/image.js +0 -29
@@ -57,6 +57,9 @@ function interpolateHue(interpolationMethod, h1, h2) {
57
57
  return [h1, h2];
58
58
  }
59
59
  function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color2, percentage2) {
60
+ if (color1.val == 'currentcolor' || color2.val == 'currentcolor') {
61
+ return null;
62
+ }
60
63
  if (hueInterpolationMethod != null && isRectangularOrthogonalColorspace(colorSpace)) {
61
64
  return null;
62
65
  }
@@ -110,6 +113,9 @@ function colorMix(colorSpace, hueInterpolationMethod, color1, percentage1, color
110
113
  }
111
114
  const components1 = getComponents(color1);
112
115
  const components2 = getComponents(color2);
116
+ if (components1 == null || components2 == null) {
117
+ return null;
118
+ }
113
119
  if ((components1[3] != null && components1[3].typ == EnumToken.IdenTokenType && components1[3].val == 'none') && values2.length == 4) {
114
120
  values1[3] = values2[3];
115
121
  }
@@ -8,16 +8,16 @@ import { lch2hwb, lab2hwb, oklch2hwb, oklab2hwb, hsl2hwb, rgb2hwb } from './hwb.
8
8
  import { srgb2lab, oklch2lab, oklab2lab, lch2lab, hwb2lab, hsl2lab, rgb2lab, hex2lab } from './lab.js';
9
9
  import { srgb2lch, oklch2lch, oklab2lch, lab2lch, hwb2lch, hsl2lch, rgb2lch, hex2lch } from './lch.js';
10
10
  import { srgb2oklab, oklch2oklab, lch2oklab, lab2oklab, hwb2oklab, hsl2oklab, rgb2oklab, hex2oklab } from './oklab.js';
11
- import { lch2oklch, oklab2oklch, lab2oklch, hwb2oklch, hsl2oklch, rgb2oklch, hex2oklch, srgb2oklch } from './oklch.js';
11
+ import { lch2oklch, oklab2oklch, lab2oklch, hwb2oklch, hsl2oklch, rgb2oklch, hex2oklch } from './oklch.js';
12
12
  import { colorFuncColorSpace } from './utils/constants.js';
13
13
  import { getComponents } from './utils/components.js';
14
14
  import { xyz2srgb, lsrgb2srgbvalues, srgb2lsrgbvalues, lch2srgb, oklab2srgb, lab2srgb, hwb2srgb, hsl2srgb, rgb2srgb, hex2srgb } from './srgb.js';
15
15
  import { prophotorgb2srgbvalues, srgb2prophotorgbvalues } from './prophotorgb.js';
16
16
  import { a98rgb2srgbvalues, srgb2a98values } from './a98rgb.js';
17
17
  import { rec20202srgb, srgb2rec2020values } from './rec2020.js';
18
- import { xyzd502srgb, srgb2xyz } from './xyz.js';
18
+ import { srgb2xyz } from './xyz.js';
19
19
  import { p32srgbvalues, srgb2p3values } from './p3.js';
20
- import { XYZ_D65_to_D50 } from './xyzd50.js';
20
+ import { xyzd502srgb, XYZ_D65_to_D50 } from './xyzd50.js';
21
21
  import '../sourcemap/lib/encode.js';
22
22
  import '../../parser/utils/config.js';
23
23
 
@@ -33,10 +33,15 @@ function convert(token, to) {
33
33
  }
34
34
  let values = [];
35
35
  if (to == 'hsl') {
36
+ let t;
36
37
  switch (token.kin) {
37
38
  case 'rgb':
38
39
  case 'rgba':
39
- values.push(...rgb2hsl(token));
40
+ t = rgb2hsl(token);
41
+ if (t == null) {
42
+ return null;
43
+ }
44
+ values.push(...t);
40
45
  break;
41
46
  case 'hex':
42
47
  case 'lit':
@@ -46,10 +51,18 @@ function convert(token, to) {
46
51
  values.push(...hwb2hsl(token));
47
52
  break;
48
53
  case 'oklab':
49
- values.push(...oklab2hsl(token));
54
+ t = oklab2hsl(token);
55
+ if (t == null) {
56
+ return null;
57
+ }
58
+ values.push(...t);
50
59
  break;
51
60
  case 'oklch':
52
- values.push(...oklch2hsl(token));
61
+ t = oklch2hsl(token);
62
+ if (t == null) {
63
+ return null;
64
+ }
65
+ values.push(...t);
53
66
  break;
54
67
  case 'lab':
55
68
  values.push(...lab2hsl(token));
@@ -98,28 +111,53 @@ function convert(token, to) {
98
111
  }
99
112
  }
100
113
  else if (to == 'rgb') {
114
+ let t;
101
115
  switch (token.kin) {
102
116
  case 'hex':
103
117
  case 'lit':
104
118
  values.push(...hex2rgb(token));
105
119
  break;
106
120
  case 'hsl':
107
- values.push(...hsl2rgb(token));
121
+ t = hsl2rgb(token);
122
+ if (t == null) {
123
+ return null;
124
+ }
125
+ values.push(...t);
108
126
  break;
109
127
  case 'hwb':
110
- values.push(...hwb2rgb(token));
128
+ t = hwb2rgb(token);
129
+ if (t == null) {
130
+ return null;
131
+ }
132
+ values.push(...t);
111
133
  break;
112
134
  case 'oklab':
113
- values.push(...oklab2rgb(token));
135
+ t = oklab2rgb(token);
136
+ if (t == null) {
137
+ return null;
138
+ }
139
+ values.push(...t);
114
140
  break;
115
141
  case 'oklch':
116
- values.push(...oklch2rgb(token));
142
+ t = oklch2rgb(token);
143
+ if (t == null) {
144
+ return null;
145
+ }
146
+ values.push(...t);
117
147
  break;
118
148
  case 'lab':
119
- values.push(...lab2rgb(token));
149
+ t = lab2rgb(token);
150
+ if (t == null) {
151
+ return null;
152
+ }
153
+ values.push(...t);
120
154
  break;
121
155
  case 'lch':
122
- values.push(...lch2rgb(token));
156
+ t = lch2rgb(token);
157
+ if (t == null) {
158
+ return null;
159
+ }
160
+ values.push(...t);
123
161
  break;
124
162
  case 'color':
125
163
  // @ts-ignore
@@ -305,6 +343,7 @@ function convert(token, to) {
305
343
  }
306
344
  }
307
345
  else if (colorFuncColorSpace.includes(to)) {
346
+ let t;
308
347
  switch (token.kin) {
309
348
  case 'hex':
310
349
  case 'lit':
@@ -312,30 +351,60 @@ function convert(token, to) {
312
351
  break;
313
352
  case 'rgb':
314
353
  case 'rgba':
315
- values.push(...rgb2srgb(token));
354
+ t = rgb2srgb(token);
355
+ if (t == null) {
356
+ return null;
357
+ }
358
+ values.push(...t);
316
359
  break;
317
360
  case 'hsl':
318
361
  case 'hsla':
319
- values.push(...hsl2srgb(token));
362
+ t = hsl2srgb(token);
363
+ if (t == null) {
364
+ return null;
365
+ }
366
+ values.push(...t);
320
367
  break;
321
368
  case 'hwb':
322
- values.push(...hwb2srgb(token));
369
+ t = hwb2srgb(token);
370
+ if (t == null) {
371
+ return null;
372
+ }
373
+ values.push(...t);
323
374
  break;
324
375
  case 'lab':
325
- values.push(...lab2srgb(token));
376
+ t = lab2srgb(token);
377
+ if (t == null) {
378
+ return null;
379
+ }
380
+ values.push(...t);
326
381
  break;
327
382
  case 'oklab':
328
- values.push(...oklab2srgb(token));
383
+ t = oklab2srgb(token);
384
+ if (t == null) {
385
+ return null;
386
+ }
387
+ values.push(...t);
329
388
  break;
330
389
  case 'lch':
331
- values.push(...lch2srgb(token));
390
+ t = lch2srgb(token);
391
+ if (t == null) {
392
+ return null;
393
+ }
394
+ values.push(...t);
332
395
  break;
333
396
  case 'oklch':
334
- // @ts-ignore
335
- values.push(...srgb2oklch(...color2srgbvalues(token)));
397
+ t = color2srgbvalues(token);
398
+ if (t == null) {
399
+ return null;
400
+ }
401
+ values.push(...t);
336
402
  break;
337
403
  case 'color':
338
404
  const val = color2srgbvalues(token);
405
+ if (val == null) {
406
+ return null;
407
+ }
339
408
  switch (to) {
340
409
  case 'srgb':
341
410
  values.push(...val);
@@ -389,6 +458,9 @@ function minmax(value, min, max) {
389
458
  }
390
459
  function color2srgbvalues(token) {
391
460
  const components = getComponents(token);
461
+ if (components == null) {
462
+ return null;
463
+ }
392
464
  const colorSpace = components.shift();
393
465
  let values = components.map((val) => getNumber(val));
394
466
  switch (colorSpace.val) {
@@ -531,6 +603,10 @@ function getNumber(token) {
531
603
  // @ts-ignore
532
604
  return token.typ == EnumToken.PercentageTokenType ? token.val / 100 : +token.val;
533
605
  }
606
+ /**
607
+ * convert angle to turn
608
+ * @param token
609
+ */
534
610
  function getAngle(token) {
535
611
  if (token.typ == EnumToken.IdenTokenType) {
536
612
  if (token.val == 'none') {
@@ -67,25 +67,35 @@ function rgb2hex(token) {
67
67
  return value;
68
68
  }
69
69
  function hsl2hex(token) {
70
- return `${hsl2rgb(token).reduce(toHexString, '#')}`;
70
+ const t = hsl2rgb(token);
71
+ return t == null ? null : `${t.reduce(toHexString, '#')}`;
71
72
  }
72
73
  function hwb2hex(token) {
73
- return `${hwb2rgb(token).reduce(toHexString, '#')}`;
74
+ const t = hwb2rgb(token);
75
+ return t == null ? null : `${t.reduce(toHexString, '#')}`;
74
76
  }
75
77
  function cmyk2hex(token) {
76
- return `#${cmyk2rgb(token).reduce(toHexString, '')}`;
78
+ const t = cmyk2rgb(token);
79
+ return t == null ? null : `#${t.reduce(toHexString, '')}`;
77
80
  }
78
81
  function oklab2hex(token) {
79
- return `${oklab2rgb(token).reduce(toHexString, '#')}`;
82
+ const t = oklab2rgb(token);
83
+ return t == null ? null : `${t.reduce(toHexString, '#')}`;
80
84
  }
81
85
  function oklch2hex(token) {
82
- return `${oklch2rgb(token).reduce(toHexString, '#')}`;
86
+ const value = oklch2rgb(token);
87
+ if (value == null) {
88
+ return null;
89
+ }
90
+ return `${value.reduce(toHexString, '#')}`;
83
91
  }
84
92
  function lab2hex(token) {
85
- return `${lab2rgb(token).reduce(toHexString, '#')}`;
93
+ const t = lab2rgb(token);
94
+ return t == null ? null : `${t.reduce(toHexString, '#')}`;
86
95
  }
87
96
  function lch2hex(token) {
88
- return `${lch2rgb(token).reduce(toHexString, '#')}`;
97
+ const t = lch2rgb(token);
98
+ return t == null ? null : `${t.reduce(toHexString, '#')}`;
89
99
  }
90
100
  function srgb2hexvalues(r, g, b, alpha) {
91
101
  return [r, g, b].concat(alpha == null || alpha == 1 ? [] : [alpha]).reduce((acc, value) => acc + minmax(Math.round(255 * value), 0, 255).toString(16).padStart(2, '0'), '#');
@@ -17,6 +17,9 @@ function hex2hsl(token) {
17
17
  }
18
18
  function rgb2hsl(token) {
19
19
  const chi = getComponents(token);
20
+ if (chi == null) {
21
+ return null;
22
+ }
20
23
  // @ts-ignore
21
24
  let t = chi[0];
22
25
  // @ts-ignore
@@ -75,12 +78,14 @@ function lch2hsl(token) {
75
78
  return rgb2hslvalues(...lch2rgb(token));
76
79
  }
77
80
  function oklab2hsl(token) {
81
+ const t = oklab2rgb(token);
78
82
  // @ts-ignore
79
- return rgb2hslvalues(...oklab2rgb(token));
83
+ return t == null ? null : rgb2hslvalues(...t);
80
84
  }
81
85
  function oklch2hsl(token) {
86
+ const t = oklch2rgb(token);
82
87
  // @ts-ignore
83
- return rgb2hslvalues(...oklch2rgb(token));
88
+ return t == null ? null : rgb2hslvalues(...t);
84
89
  }
85
90
  function rgb2hslvalues(r, g, b, a = null) {
86
91
  return srgb2hsl(r / 255, g / 255, b / 255, a);
@@ -1,6 +1,6 @@
1
1
  import { e, k, D50 } from './utils/constants.js';
2
2
  import { getComponents } from './utils/components.js';
3
- import { srgb2xyz, xyzd502srgb } from './xyz.js';
3
+ import { srgb2xyz } from './xyz.js';
4
4
  import { oklch2srgb, hwb2srgb, hsl2srgb, rgb2srgb, hex2srgb } from './srgb.js';
5
5
  import { getLCHComponents } from './lch.js';
6
6
  import { OKLab_to_XYZ, getOKLABComponents } from './oklab.js';
@@ -9,6 +9,7 @@ import { EnumToken } from '../../ast/types.js';
9
9
  import '../../ast/minify.js';
10
10
  import '../../ast/walk.js';
11
11
  import '../../parser/parse.js';
12
+ import { xyzd502srgb } from './xyzd50.js';
12
13
  import '../sourcemap/lib/encode.js';
13
14
  import '../../parser/utils/config.js';
14
15
 
@@ -86,6 +87,14 @@ function lch2labvalues(l, c, h, a = null) {
86
87
  }
87
88
  function getLABComponents(token) {
88
89
  const components = getComponents(token);
90
+ if (components == null) {
91
+ return null;
92
+ }
93
+ for (let i = 0; i < components.length; i++) {
94
+ if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType, EnumToken.AngleTokenType, EnumToken.IdenTokenType].includes(components[i].typ)) {
95
+ return [];
96
+ }
97
+ }
89
98
  // @ts-ignore
90
99
  let t = components[0];
91
100
  // @ts-ignore
@@ -59,6 +59,14 @@ function xyz2lchvalues(x, y, z, alpha) {
59
59
  }
60
60
  function getLCHComponents(token) {
61
61
  const components = getComponents(token);
62
+ if (components == null) {
63
+ return null;
64
+ }
65
+ for (let i = 0; i < components.length; i++) {
66
+ if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType, EnumToken.AngleTokenType, EnumToken.IdenTokenType].includes(components[i].typ)) {
67
+ return null;
68
+ }
69
+ }
62
70
  // @ts-ignore
63
71
  let t = components[0];
64
72
  // @ts-ignore
@@ -52,6 +52,14 @@ function srgb2oklab(r, g, blue, alpha) {
52
52
  }
53
53
  function getOKLABComponents(token) {
54
54
  const components = getComponents(token);
55
+ if (components == null) {
56
+ return null;
57
+ }
58
+ for (let i = 0; i < components.length; i++) {
59
+ if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType, EnumToken.AngleTokenType, EnumToken.IdenTokenType].includes(components[i].typ)) {
60
+ return null;
61
+ }
62
+ }
55
63
  // @ts-ignore
56
64
  let t = components[0];
57
65
  // @ts-ignore
@@ -44,6 +44,14 @@ function srgb2oklch(r, g, blue, alpha) {
44
44
  }
45
45
  function getOKLCHComponents(token) {
46
46
  const components = getComponents(token);
47
+ if (components == null) {
48
+ return null;
49
+ }
50
+ for (let i = 0; i < components.length; i++) {
51
+ if (![EnumToken.NumberTokenType, EnumToken.PercentageTokenType, EnumToken.AngleTokenType, EnumToken.IdenTokenType].includes(components[i].typ)) {
52
+ return [];
53
+ }
54
+ }
47
55
  // @ts-ignore
48
56
  let t = components[0];
49
57
  // @ts-ignore
@@ -1,5 +1,5 @@
1
- import { srgb2xyz, xyzd502srgb } from './xyz.js';
2
- import { XYZ_D65_to_D50 } from './xyzd50.js';
1
+ import { srgb2xyz } from './xyz.js';
2
+ import { XYZ_D65_to_D50, xyzd502srgb } from './xyzd50.js';
3
3
 
4
4
  function prophotorgb2srgbvalues(r, g, b, a = null) {
5
5
  // @ts-ignore
@@ -142,30 +142,19 @@ function computeComponentValue(expr, converted, values) {
142
142
  return expr;
143
143
  }
144
144
  function replaceValue(parent, value, newValue) {
145
- if (parent.typ == EnumToken.BinaryExpressionTokenType) {
146
- if (parent.l == value) {
147
- parent.l = newValue;
148
- }
149
- else {
150
- parent.r = newValue;
151
- }
152
- }
153
- else {
154
- for (let i = 0; i < parent.chi.length; i++) {
155
- if (parent.chi[i] == value) {
156
- parent.chi.splice(i, 1, newValue);
157
- break;
158
- }
159
- if (parent.chi[i].typ == EnumToken.BinaryExpressionTokenType) {
160
- if (parent.chi[i].l == value) {
161
- parent.chi[i].l = newValue;
162
- break;
145
+ for (const { value: val, parent: pr } of walkValues([parent])) {
146
+ if (val.typ == value.typ && val.val == value.val) {
147
+ if (pr.typ == EnumToken.BinaryExpressionTokenType) {
148
+ if (pr.l == val) {
149
+ pr.l = newValue;
163
150
  }
164
- else if (parent.chi[i].r == value) {
165
- parent.chi[i].r = newValue;
166
- break;
151
+ else {
152
+ pr.r = newValue;
167
153
  }
168
154
  }
155
+ else {
156
+ pr.chi.splice(pr.chi.indexOf(val), 1, newValue);
157
+ }
169
158
  }
170
159
  }
171
160
  }
@@ -21,26 +21,29 @@ function hex2rgb(token) {
21
21
  return rgb;
22
22
  }
23
23
  function hwb2rgb(token) {
24
- return hwb2srgb(token).map(srgb2rgb);
24
+ return hwb2srgb(token)?.map?.(srgb2rgb) ?? null;
25
25
  }
26
26
  function hsl2rgb(token) {
27
- let { h, s, l, a } = hslvalues(token);
27
+ let { h, s, l, a } = hslvalues(token) ?? {};
28
+ if (h == null || s == null || l == null) {
29
+ return null;
30
+ }
28
31
  return hsl2srgbvalues(h, s, l, a).map((t) => minmax(Math.round(t * 255), 0, 255));
29
32
  }
30
33
  function cmyk2rgb(token) {
31
- return cmyk2srgb(token).map(srgb2rgb);
34
+ return cmyk2srgb(token)?.map?.(srgb2rgb) ?? null;
32
35
  }
33
36
  function oklab2rgb(token) {
34
- return oklab2srgb(token).map(srgb2rgb);
37
+ return oklab2srgb(token)?.map?.(srgb2rgb) ?? null;
35
38
  }
36
39
  function oklch2rgb(token) {
37
- return oklch2srgb(token).map(srgb2rgb);
40
+ return oklch2srgb(token)?.map?.(srgb2rgb) ?? null;
38
41
  }
39
42
  function lab2rgb(token) {
40
- return lab2srgb(token).map(srgb2rgb);
43
+ return lab2srgb(token)?.map?.(srgb2rgb) ?? null;
41
44
  }
42
45
  function lch2rgb(token) {
43
- return lch2srgb(token).map(srgb2rgb);
46
+ return lch2srgb(token)?.map?.(srgb2rgb) ?? null;
44
47
  }
45
48
 
46
49
  export { cmyk2rgb, hex2rgb, hsl2rgb, hwb2rgb, lab2rgb, lch2rgb, oklab2rgb, oklch2rgb, srgb2rgb };
@@ -44,7 +44,7 @@ function srgbvalues(token) {
44
44
  return null;
45
45
  }
46
46
  function rgb2srgb(token) {
47
- return getComponents(token).map((t, index) => index == 3 ? ((t.typ == EnumToken.IdenTokenType && t.val == 'none') ? 1 : getNumber(t)) : (t.typ == EnumToken.PercentageTokenType ? 255 : 1) * getNumber(t) / 255);
47
+ return getComponents(token)?.map?.((t, index) => index == 3 ? ((t.typ == EnumToken.IdenTokenType && t.val == 'none') ? 1 : getNumber(t)) : (t.typ == EnumToken.PercentageTokenType ? 255 : 1) * getNumber(t) / 255) ?? null;
48
48
  }
49
49
  function hex2srgb(token) {
50
50
  const value = expandHexValue(token.kin == 'lit' ? COLORS_NAMES[token.val.toLowerCase()] : token.val);
@@ -59,7 +59,10 @@ function xyz2srgb(x, y, z) {
59
59
  return lsrgb2srgbvalues(...XYZ_to_lin_sRGB(x, y, z));
60
60
  }
61
61
  function hwb2srgb(token) {
62
- const { h: hue, s: white, l: black, a: alpha } = hslvalues(token);
62
+ const { h: hue, s: white, l: black, a: alpha } = hslvalues(token) ?? {};
63
+ if (hue == null || white == null || black == null) {
64
+ return [];
65
+ }
63
66
  const rgb = hsl2srgbvalues(hue, 1, .5);
64
67
  for (let i = 0; i < 3; i++) {
65
68
  rgb[i] *= (1 - white - black);
@@ -71,11 +74,17 @@ function hwb2srgb(token) {
71
74
  return rgb;
72
75
  }
73
76
  function hsl2srgb(token) {
74
- let { h, s, l, a } = hslvalues(token);
77
+ let { h, s, l, a } = hslvalues(token) ?? {};
78
+ if (h == null || s == null || l == null) {
79
+ return null;
80
+ }
75
81
  return hsl2srgbvalues(h, s, l, a);
76
82
  }
77
83
  function cmyk2srgb(token) {
78
84
  const components = getComponents(token);
85
+ if (components == null) {
86
+ return null;
87
+ }
79
88
  // @ts-ignore
80
89
  let t = components[0];
81
90
  // @ts-ignore
@@ -107,7 +116,10 @@ function cmyk2srgb(token) {
107
116
  return rgb;
108
117
  }
109
118
  function oklab2srgb(token) {
110
- const [l, a, b, alpha] = getOKLABComponents(token);
119
+ const [l, a, b, alpha] = getOKLABComponents(token) ?? [];
120
+ if (l == null || a == null || b == null) {
121
+ return null;
122
+ }
111
123
  const rgb = OKLab_to_sRGB(l, a, b);
112
124
  if (alpha != null && alpha != 1) {
113
125
  rgb.push(alpha);
@@ -115,7 +127,10 @@ function oklab2srgb(token) {
115
127
  return rgb;
116
128
  }
117
129
  function oklch2srgb(token) {
118
- const [l, c, h, alpha] = getOKLCHComponents(token);
130
+ const [l, c, h, alpha] = getOKLCHComponents(token) ?? [];
131
+ if (l == null || c == null || h == null) {
132
+ return null;
133
+ }
119
134
  // @ts-ignore
120
135
  const rgb = OKLab_to_sRGB(...lch2labvalues(l, c, h));
121
136
  if (alpha != 1) {
@@ -125,6 +140,9 @@ function oklch2srgb(token) {
125
140
  }
126
141
  function hslvalues(token) {
127
142
  const components = getComponents(token);
143
+ if (components == null) {
144
+ return null;
145
+ }
128
146
  let t;
129
147
  // @ts-ignore
130
148
  let h = getAngle(components[0]);
@@ -199,7 +217,10 @@ function hsl2srgbvalues(h, s, l, a = null) {
199
217
  return values;
200
218
  }
201
219
  function lab2srgb(token) {
202
- const [l, a, b, alpha] = getLABComponents(token);
220
+ const [l, a, b, alpha] = getLABComponents(token) ?? [];
221
+ if (l == null || a == null || b == null) {
222
+ return null;
223
+ }
203
224
  const rgb = Lab_to_sRGB(l, a, b);
204
225
  if (alpha != null && alpha != 1) {
205
226
  rgb.push(alpha);
@@ -209,6 +230,9 @@ function lab2srgb(token) {
209
230
  function lch2srgb(token) {
210
231
  // @ts-ignore
211
232
  const [l, a, b, alpha] = lch2labvalues(...getLCHComponents(token));
233
+ if (l == null || a == null || b == null) {
234
+ return null;
235
+ }
212
236
  // https://www.w3.org/TR/css-color-4/#lab-to-lch
213
237
  const rgb = Lab_to_sRGB(l, a, b);
214
238
  if (alpha != 1) {
@@ -15,8 +15,19 @@ function getComponents(token) {
15
15
  return { typ: EnumToken.Number, val: parseInt(t, 16).toString() };
16
16
  });
17
17
  }
18
- return token.chi
19
- .filter((t) => ![EnumToken.LiteralTokenType, EnumToken.CommentTokenType, EnumToken.CommaTokenType, EnumToken.WhitespaceTokenType].includes(t.typ));
18
+ const result = [];
19
+ for (const child of (token.chi)) {
20
+ if ([
21
+ EnumToken.LiteralTokenType, EnumToken.CommentTokenType, EnumToken.CommaTokenType, EnumToken.WhitespaceTokenType
22
+ ].includes(child.typ)) {
23
+ continue;
24
+ }
25
+ if (child.typ == EnumToken.ColorTokenType && child.val == 'currentcolor') {
26
+ return null;
27
+ }
28
+ result.push(child);
29
+ }
30
+ return result;
20
31
  }
21
32
 
22
33
  export { getComponents };
@@ -4,26 +4,10 @@ import '../../ast/types.js';
4
4
  import '../../ast/minify.js';
5
5
  import '../../ast/walk.js';
6
6
  import '../../parser/parse.js';
7
- import { srgb2lsrgbvalues, lsrgb2srgbvalues } from './srgb.js';
7
+ import { srgb2lsrgbvalues } from './srgb.js';
8
8
  import '../sourcemap/lib/encode.js';
9
9
  import '../../parser/utils/config.js';
10
10
 
11
- function xyzd502srgb(x, y, z) {
12
- // @ts-ignore
13
- return lsrgb2srgbvalues(
14
- /* r: */
15
- x * 3.1341359569958707 -
16
- y * 1.6173863321612538 -
17
- 0.4906619460083532 * z,
18
- /* g: */
19
- x * -0.978795502912089 +
20
- y * 1.916254567259524 +
21
- 0.03344273116131949 * z,
22
- /* b: */
23
- x * 0.07195537988411677 -
24
- y * 0.2289768264158322 +
25
- 1.405386058324125 * z);
26
- }
27
11
  function XYZ_to_lin_sRGB(x, y, z) {
28
12
  // convert XYZ to linear-light sRGB
29
13
  const M = [
@@ -63,4 +47,4 @@ function srgb2xyz(r, g, b, alpha) {
63
47
  return rgb;
64
48
  }
65
49
 
66
- export { XYZ_D50_to_D65, XYZ_to_lin_sRGB, srgb2xyz, xyzd502srgb };
50
+ export { XYZ_D50_to_D65, XYZ_to_lin_sRGB, srgb2xyz };
@@ -1,3 +1,4 @@
1
+ import { lsrgb2srgbvalues } from './srgb.js';
1
2
  import { multiplyMatrices } from './utils/matrix.js';
2
3
  import './utils/constants.js';
3
4
  import '../../ast/types.js';
@@ -10,11 +11,12 @@ import { XYZ_D50_to_D65 } from './xyz.js';
10
11
  import '../sourcemap/lib/encode.js';
11
12
  import '../../parser/utils/config.js';
12
13
 
14
+ /*
15
+ */
13
16
  function xyzd502lch(x, y, z, alpha) {
14
17
  // @ts-ignore
15
18
  const [l, a, b] = xyz2lab(...XYZ_D50_to_D65(x, y, z));
16
19
  // L in range [0,100]. For use in CSS, add a percent
17
- // @ts-ignore
18
20
  return lab2lchvalues(l, a, b, alpha);
19
21
  }
20
22
  function XYZ_D65_to_D50(x, y, z) {
@@ -31,5 +33,21 @@ function XYZ_D65_to_D50(x, y, z) {
31
33
  ];
32
34
  return multiplyMatrices(M, [x, y, z]);
33
35
  }
36
+ function xyzd502srgb(x, y, z) {
37
+ // @ts-ignore
38
+ return lsrgb2srgbvalues(
39
+ /* r: */
40
+ x * 3.1341359569958707 -
41
+ y * 1.6173863321612538 -
42
+ 0.4906619460083532 * z,
43
+ /* g: */
44
+ x * -0.978795502912089 +
45
+ y * 1.916254567259524 +
46
+ 0.03344273116131949 * z,
47
+ /* b: */
48
+ x * 0.07195537988411677 -
49
+ y * 0.2289768264158322 +
50
+ 1.405386058324125 * z);
51
+ }
34
52
 
35
- export { XYZ_D65_to_D50, xyzd502lch };
53
+ export { XYZ_D65_to_D50, xyzd502lch, xyzd502srgb };