color-bits 1.1.0 → 1.2.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 (83) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/README.md +30 -14
  3. package/benchmarks/compare-oklab.ts +44 -0
  4. package/benchmarks/compare-srgb.ts +59 -0
  5. package/benchmarks/compare.ts +46 -0
  6. package/benchmarks/parse.ts +41 -0
  7. package/build/conversion/channels.d.ts +61 -0
  8. package/build/conversion/channels.js +353 -0
  9. package/build/conversion/channels.js.map +1 -0
  10. package/build/{convert.d.ts → conversion/color-spaces.d.ts} +25 -23
  11. package/build/conversion/color-spaces.js +263 -0
  12. package/build/conversion/color-spaces.js.map +1 -0
  13. package/build/core/bits.d.ts +28 -0
  14. package/build/{core.js → core/bits.js} +25 -26
  15. package/build/core/bits.js.map +1 -0
  16. package/build/core/bytes.d.ts +5 -0
  17. package/build/core/bytes.js +12 -0
  18. package/build/core/bytes.js.map +1 -0
  19. package/build/css.d.ts +1 -0
  20. package/build/css.js +18 -0
  21. package/build/css.js.map +1 -0
  22. package/build/formatting/index.d.ts +27 -0
  23. package/build/{format.js → formatting/index.js} +13 -67
  24. package/build/formatting/index.js.map +1 -0
  25. package/build/index.d.ts +6 -4
  26. package/build/index.js +6 -4
  27. package/build/index.js.map +1 -1
  28. package/build/namedColors.d.ts +1 -0
  29. package/build/namedColors.js +18 -0
  30. package/build/namedColors.js.map +1 -0
  31. package/build/operations/adjust.d.ts +19 -0
  32. package/build/operations/adjust.js +40 -0
  33. package/build/operations/adjust.js.map +1 -0
  34. package/build/operations/blend.d.ts +9 -0
  35. package/build/operations/blend.js +19 -0
  36. package/build/operations/blend.js.map +1 -0
  37. package/build/operations/color-mix.d.ts +20 -0
  38. package/build/operations/color-mix.js +144 -0
  39. package/build/operations/color-mix.js.map +1 -0
  40. package/build/operations/luminance.d.ts +7 -0
  41. package/build/operations/luminance.js +20 -0
  42. package/build/operations/luminance.js.map +1 -0
  43. package/build/parsing/calc.d.ts +8 -0
  44. package/build/parsing/calc.js +205 -0
  45. package/build/parsing/calc.js.map +1 -0
  46. package/build/parsing/color-mix.d.ts +8 -0
  47. package/build/parsing/color-mix.js +70 -0
  48. package/build/parsing/color-mix.js.map +1 -0
  49. package/build/parsing/css.d.ts +23 -0
  50. package/build/parsing/css.js +115 -0
  51. package/build/parsing/css.js.map +1 -0
  52. package/build/parsing/fast.d.ts +19 -0
  53. package/build/parsing/fast.js +184 -0
  54. package/build/parsing/fast.js.map +1 -0
  55. package/build/parsing/named-colors.d.ts +12 -0
  56. package/build/parsing/named-colors.js +68 -0
  57. package/build/parsing/named-colors.js.map +1 -0
  58. package/build/parsing/relative.d.ts +9 -0
  59. package/build/parsing/relative.js +158 -0
  60. package/build/parsing/relative.js.map +1 -0
  61. package/build/parsing/tokenizer.d.ts +16 -0
  62. package/build/parsing/tokenizer.js +78 -0
  63. package/build/parsing/tokenizer.js.map +1 -0
  64. package/build/parsing/values.d.ts +41 -0
  65. package/build/parsing/values.js +139 -0
  66. package/build/parsing/values.js.map +1 -0
  67. package/package.json +30 -12
  68. package/benchmarks/index.ts +0 -35
  69. package/build/bit.d.ts +0 -3
  70. package/build/bit.js +0 -29
  71. package/build/bit.js.map +0 -1
  72. package/build/convert.js +0 -347
  73. package/build/convert.js.map +0 -1
  74. package/build/core.d.ts +0 -27
  75. package/build/core.js.map +0 -1
  76. package/build/format.d.ts +0 -27
  77. package/build/format.js.map +0 -1
  78. package/build/functions.d.ts +0 -33
  79. package/build/functions.js +0 -95
  80. package/build/functions.js.map +0 -1
  81. package/build/parse.d.ts +0 -17
  82. package/build/parse.js +0 -392
  83. package/build/parse.js.map +0 -1
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ // Full CSS Color parser: everything the fast `parse` handles (hex + absolute
3
+ // functions) plus named colors, relative colors (`from …`), calc() channels
4
+ // and color-mix(). This is the batteries-included entry (`color-bits/css`);
5
+ // importing it pulls in the named-color table and the relative/color-mix
6
+ // machinery, which is why it is kept separate from the lean `parse` core.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.namedColors = exports.resolveNamed = exports.colorSpaceModel = exports.colorModel = exports.colorMix = void 0;
9
+ exports.parseCSS = parseCSS;
10
+ const fast_1 = require("./fast");
11
+ const tokenizer_1 = require("./tokenizer");
12
+ const named_colors_1 = require("./named-colors");
13
+ const relative_1 = require("./relative");
14
+ const color_mix_1 = require("./color-mix");
15
+ var color_mix_2 = require("../operations/color-mix");
16
+ Object.defineProperty(exports, "colorMix", { enumerable: true, get: function () { return color_mix_2.colorMix; } });
17
+ var channels_1 = require("../conversion/channels");
18
+ Object.defineProperty(exports, "colorModel", { enumerable: true, get: function () { return channels_1.colorModel; } });
19
+ Object.defineProperty(exports, "colorSpaceModel", { enumerable: true, get: function () { return channels_1.colorSpaceModel; } });
20
+ var named_colors_2 = require("./named-colors");
21
+ Object.defineProperty(exports, "resolveNamed", { enumerable: true, get: function () { return named_colors_2.resolveNamed; } });
22
+ Object.defineProperty(exports, "namedColors", { enumerable: true, get: function () { return named_colors_2.namedColors; } });
23
+ const HASH = 35; // '#'
24
+ const CLOSE = 41; // ')'
25
+ /** Guard against resolvers that keep answering with unresolvable strings. */
26
+ const MAX_DEPTH = 32;
27
+ function isSpace(c) {
28
+ return c === 32 || c === 9 || c === 10 || c === 13;
29
+ }
30
+ const COLOR_MIX = 'color-mix';
31
+ /** ASCII case-insensitive check that the function name is `color-mix`. */
32
+ function isColorMixName(color, open) {
33
+ if (open !== COLOR_MIX.length) {
34
+ return false;
35
+ }
36
+ for (let i = 0; i < COLOR_MIX.length; i++) {
37
+ if ((color.charCodeAt(i) | 0x20) !== COLOR_MIX.charCodeAt(i)) {
38
+ return false;
39
+ }
40
+ }
41
+ return true;
42
+ }
43
+ /** ASCII case-insensitive check that the first argument is the `from` keyword. */
44
+ function firstArgIsFrom(color, open) {
45
+ let i = open + 1;
46
+ while (i < color.length && isSpace(color.charCodeAt(i))) {
47
+ i++;
48
+ }
49
+ return (i + 4 < color.length
50
+ && (color.charCodeAt(i) | 0x20) === 102 // 'f'
51
+ && (color.charCodeAt(i + 1) | 0x20) === 114 // 'r'
52
+ && (color.charCodeAt(i + 2) | 0x20) === 111 // 'o'
53
+ && (color.charCodeAt(i + 3) | 0x20) === 109 // 'm'
54
+ && isSpace(color.charCodeAt(i + 4)));
55
+ }
56
+ /**
57
+ * Parse any CSS Color Module 4/5 color: hex, named colors, rgb()/hsl()/hwb()/
58
+ * lab()/lch()/oklab()/oklch()/color(), their relative `from …` forms, calc()
59
+ * channels, and color-mix(). For `currentColor`/system colors, pass
60
+ * `options.resolve`.
61
+ */
62
+ function parseCSS(input, options) {
63
+ return parseAny(input, options, 0);
64
+ }
65
+ function invalid(color) {
66
+ throw new Error(`parseCSS(): invalid CSS color: "${color}"`);
67
+ }
68
+ function parseAny(input, options, depth) {
69
+ if (depth > MAX_DEPTH) {
70
+ throw new Error(`parseCSS(): too many nested color references: "${input}"`);
71
+ }
72
+ const color = input.trim();
73
+ if (color.charCodeAt(0) === HASH) {
74
+ return (0, fast_1.parseHex)(color);
75
+ }
76
+ const open = color.indexOf('(');
77
+ if (open === -1) {
78
+ // Bare identifier: named color, transparent, currentColor, system color.
79
+ const named = (0, named_colors_1.resolveNamed)(color);
80
+ if (named !== null) {
81
+ return named;
82
+ }
83
+ return resolveExternal(color, options, depth);
84
+ }
85
+ if (color.charCodeAt(color.length - 1) !== CLOSE) {
86
+ invalid(color);
87
+ }
88
+ // Slow forms — color-mix(), relative `from` colors, and nested calc()/
89
+ // functions — need the nesting-aware tokenizer. Everything else (the common
90
+ // case) goes straight to the fast path and scans the string only once.
91
+ if (isColorMixName(color, open) || firstArgIsFrom(color, open) || color.indexOf('(', open + 1) !== -1) {
92
+ const tokens = (0, tokenizer_1.tokenize)(color);
93
+ if (tokens === null) {
94
+ invalid(color);
95
+ }
96
+ const parseNested = (nested) => parseAny(nested, options, depth + 1);
97
+ if (tokens.name === 'color-mix') {
98
+ return (0, color_mix_1.resolveColorMix)(tokens, parseNested);
99
+ }
100
+ return (0, relative_1.resolveColorFunction)(tokens, parseNested);
101
+ }
102
+ // Absolute function: delegate to the fast path.
103
+ return (0, fast_1.parse)(color);
104
+ }
105
+ function resolveExternal(name, options, depth) {
106
+ const resolve = options?.resolve;
107
+ if (resolve) {
108
+ const result = resolve(name);
109
+ if (result !== null && result !== undefined) {
110
+ return typeof result === 'number' ? result : parseAny(result, options, depth + 1);
111
+ }
112
+ }
113
+ throw new Error(`parseCSS(): unknown color: "${name}"`);
114
+ }
115
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/parsing/css.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ColorBits } from '../core/bits';
2
+ /**
3
+ * Parse CSS color. Fast path: supports hexadecimal and the absolute forms of
4
+ * every CSS color function. For named colors, relative colors (`from …`) and
5
+ * `color-mix()`, use `parseCSS` from `color-bits/css`.
6
+ * @param color CSS color string: #xxx, #xxxxxx, #xxxxxxxx, rgb(), rgba(), hsl(), hsla(), color()
7
+ */
8
+ export declare function parse(color: string): ColorBits;
9
+ /**
10
+ * Parse hexadecimal CSS color
11
+ * @param color Hex color string: #xxx, #xxxxxx, #xxxxxxxx
12
+ */
13
+ export declare function parseHex(color: string): ColorBits;
14
+ /**
15
+ * Parse CSS color
16
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value
17
+ * @param color CSS color string: rgb(), rgba(), hsl(), hsla(), color()
18
+ */
19
+ export declare function parseColor(color: string): ColorBits;
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parse = parse;
4
+ exports.parseHex = parseHex;
5
+ exports.parseColor = parseColor;
6
+ const bits_1 = require("../core/bits");
7
+ const channels_1 = require("../conversion/channels");
8
+ const values_1 = require("./values");
9
+ const HASH = 35; // '#'
10
+ /**
11
+ * Approximative CSS colorspace string pattern, e.g. rgb(), color()
12
+ */
13
+ const PATTERN = (() => {
14
+ const NAME = '(\\w+)';
15
+ const SEPARATOR = '[\\s,\\/]';
16
+ const VALUE = '([^\\s,\\/]+)';
17
+ const SEPARATOR_THEN_VALUE = `(?:${SEPARATOR}+${VALUE})`;
18
+ return new RegExp(`${NAME}\\(
19
+ ${SEPARATOR}*
20
+ ${VALUE}
21
+ ${SEPARATOR_THEN_VALUE}
22
+ ${SEPARATOR_THEN_VALUE}
23
+ ${SEPARATOR_THEN_VALUE}?
24
+ ${SEPARATOR_THEN_VALUE}?
25
+ ${SEPARATOR}*
26
+ \\)`.replace(/\s/g, ''));
27
+ })();
28
+ /**
29
+ * Parse CSS color. Fast path: supports hexadecimal and the absolute forms of
30
+ * every CSS color function. For named colors, relative colors (`from …`) and
31
+ * `color-mix()`, use `parseCSS` from `color-bits/css`.
32
+ * @param color CSS color string: #xxx, #xxxxxx, #xxxxxxxx, rgb(), rgba(), hsl(), hsla(), color()
33
+ */
34
+ function parse(color) {
35
+ if (color.charCodeAt(0) === HASH) {
36
+ return parseHex(color);
37
+ }
38
+ else {
39
+ return parseColor(color);
40
+ }
41
+ }
42
+ /**
43
+ * Parse hexadecimal CSS color
44
+ * @param color Hex color string: #xxx, #xxxxxx, #xxxxxxxx
45
+ */
46
+ function parseHex(color) {
47
+ let r = 0x00;
48
+ let g = 0x00;
49
+ let b = 0x00;
50
+ let a = 0xff;
51
+ switch (color.length) {
52
+ // #59f
53
+ case 4: {
54
+ r = (hexValue(color.charCodeAt(1)) << 4) + hexValue(color.charCodeAt(1));
55
+ g = (hexValue(color.charCodeAt(2)) << 4) + hexValue(color.charCodeAt(2));
56
+ b = (hexValue(color.charCodeAt(3)) << 4) + hexValue(color.charCodeAt(3));
57
+ break;
58
+ }
59
+ // #5599ff
60
+ case 7: {
61
+ r = (hexValue(color.charCodeAt(1)) << 4) + hexValue(color.charCodeAt(2));
62
+ g = (hexValue(color.charCodeAt(3)) << 4) + hexValue(color.charCodeAt(4));
63
+ b = (hexValue(color.charCodeAt(5)) << 4) + hexValue(color.charCodeAt(6));
64
+ break;
65
+ }
66
+ // #5599ff88
67
+ case 9: {
68
+ r = (hexValue(color.charCodeAt(1)) << 4) + hexValue(color.charCodeAt(2));
69
+ g = (hexValue(color.charCodeAt(3)) << 4) + hexValue(color.charCodeAt(4));
70
+ b = (hexValue(color.charCodeAt(5)) << 4) + hexValue(color.charCodeAt(6));
71
+ a = (hexValue(color.charCodeAt(7)) << 4) + hexValue(color.charCodeAt(8));
72
+ break;
73
+ }
74
+ default: {
75
+ break;
76
+ }
77
+ }
78
+ return (0, bits_1.newColor)(r, g, b, a);
79
+ }
80
+ // https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
81
+ function hexValue(c) {
82
+ return (c & 0xF) + 9 * (c >> 6);
83
+ }
84
+ /**
85
+ * Parse CSS color
86
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/color_value
87
+ * @param color CSS color string: rgb(), rgba(), hsl(), hsla(), color()
88
+ */
89
+ function parseColor(color) {
90
+ const match = PATTERN.exec(color);
91
+ if (match !== null) {
92
+ const format = match[1];
93
+ const p1 = match[2];
94
+ const p2 = match[3];
95
+ const p3 = match[4];
96
+ const p4 = match[5];
97
+ const p5 = match[6];
98
+ // Relative colors (`rgb(from …)`) are not handled by the fast path.
99
+ if ((0, values_1.isFromKeyword)(p1)) {
100
+ throw new Error(`Color.parse(): relative colors require parseCSS() from "color-bits/css": "${color}"`);
101
+ }
102
+ let result = parseColorFormat(format, p1, p2, p3, p4, p5);
103
+ if (result === null && format.toLowerCase() !== format) {
104
+ // CSS function names are ASCII case-insensitive; retry lowercased so the
105
+ // common all-lowercase inputs pay nothing.
106
+ result = parseColorFormat(format.toLowerCase(), p1, p2, p3, p4, p5);
107
+ }
108
+ if (result !== null) {
109
+ return result;
110
+ }
111
+ }
112
+ throw new Error(`Color.parse(): invalid CSS color: "${color}"`);
113
+ }
114
+ function parseColorFormat(format, p1, p2, p3, p4, p5) {
115
+ switch (format) {
116
+ case 'rgb':
117
+ case 'rgba': {
118
+ const r = (0, values_1.parseColorChannel)(p1);
119
+ const g = (0, values_1.parseColorChannel)(p2);
120
+ const b = (0, values_1.parseColorChannel)(p3);
121
+ const a = p4 ? (0, values_1.parseAlphaChannel)(p4) : 255;
122
+ return (0, bits_1.newColor)(r, g, b, a);
123
+ }
124
+ case 'hsl':
125
+ case 'hsla': {
126
+ const h = (0, values_1.parseAngle)(p1);
127
+ const s = (0, values_1.parsePercent)(p2);
128
+ const l = (0, values_1.parsePercent)(p3);
129
+ const a = p4 ? (0, values_1.parseAlphaChannel)(p4) : 255;
130
+ return (0, channels_1.hslToColor)(h, s, l, a);
131
+ }
132
+ case 'hwb': {
133
+ const h = (0, values_1.parseAngle)(p1);
134
+ const w = (0, values_1.parsePercent)(p2);
135
+ const b = (0, values_1.parsePercent)(p3);
136
+ const a = p4 ? (0, values_1.parseAlphaChannel)(p4) : 255;
137
+ return (0, channels_1.hwbToColor)(h, w, b, a);
138
+ }
139
+ case 'lab': {
140
+ const l = (0, values_1.parseNumberOrPercentage)(p1, 100);
141
+ const aa = (0, values_1.parseNumberOrPercentage)(p2, 125);
142
+ const b = (0, values_1.parseNumberOrPercentage)(p3, 125);
143
+ const a = p4 ? (0, values_1.parseAlphaChannel)(p4) : 255;
144
+ return (0, channels_1.labToColor)(l, aa, b, a);
145
+ }
146
+ case 'lch': {
147
+ const l = (0, values_1.parseNumberOrPercentage)(p1, 100);
148
+ const c = (0, values_1.parseNumberOrPercentage)(p2, 150);
149
+ const h = (0, values_1.parseAngle)(p3);
150
+ const a = p4 ? (0, values_1.parseAlphaChannel)(p4) : 255;
151
+ return (0, channels_1.lchToColor)(l, c, h, a);
152
+ }
153
+ case 'oklab': {
154
+ const l = (0, values_1.parseNumberOrPercentage)(p1, 1);
155
+ const aa = (0, values_1.parseNumberOrPercentage)(p2, 0.4);
156
+ const b = (0, values_1.parseNumberOrPercentage)(p3, 0.4);
157
+ const a = p4 ? (0, values_1.parseAlphaChannel)(p4) : 255;
158
+ return (0, channels_1.oklabToColor)(l, aa, b, a);
159
+ }
160
+ case 'oklch': {
161
+ const l = (0, values_1.parseNumberOrPercentage)(p1, 1);
162
+ const c = (0, values_1.parseNumberOrPercentage)(p2, 0.4);
163
+ const h = (0, values_1.parseAngle)(p3);
164
+ const a = p4 ? (0, values_1.parseAlphaChannel)(p4) : 255;
165
+ return (0, channels_1.oklchToColor)(l, c, h, a);
166
+ }
167
+ case 'color': {
168
+ // https://drafts.csswg.org/css-color-4/#color-function
169
+ const c1 = (0, values_1.parsePercentageOrValue)(p2);
170
+ const c2 = (0, values_1.parsePercentageOrValue)(p3);
171
+ const c3 = (0, values_1.parsePercentageOrValue)(p4);
172
+ const a = p5 ? (0, values_1.parseAlphaChannel)(p5) : 255;
173
+ // Color space names are ASCII case-insensitive too; retry on miss only.
174
+ let result = (0, channels_1.colorSpaceToColor)(p1, c1, c2, c3, a);
175
+ if (result === null && p1.toLowerCase() !== p1) {
176
+ result = (0, channels_1.colorSpaceToColor)(p1.toLowerCase(), c1, c2, c3, a);
177
+ }
178
+ return result;
179
+ }
180
+ default:
181
+ return null;
182
+ }
183
+ }
184
+ //# sourceMappingURL=fast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast.js","sourceRoot":"","sources":["../../src/parsing/fast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { ColorBits } from '../core/bits';
2
+ /**
3
+ * Map of CSS named color -> ColorBits (opaque), plus `transparent`.
4
+ * Keys are lowercase. Uses a null prototype so lookups of names like
5
+ * `toString` correctly miss.
6
+ */
7
+ export declare const namedColors: Record<string, ColorBits>;
8
+ /**
9
+ * Resolve a CSS named color (case-insensitive), or `transparent`.
10
+ * @returns the ColorBits, or null if the name is not a known color.
11
+ */
12
+ export declare function resolveNamed(name: string): ColorBits | null;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ // CSS named colors (CSS Color 4 <named-color>). Opaque sRGB, packed as 0xRRGGBB.
3
+ // Generated from the `color-name` package; do not edit by hand.
4
+ // This is a separate module (`color-bits/named`) so the fast `parse` core
5
+ // never pulls in the ~1KB table.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.namedColors = void 0;
8
+ exports.resolveNamed = resolveNamed;
9
+ const bits_1 = require("../core/bits");
10
+ const RGB = {
11
+ aliceblue: 0xf0f8ff, antiquewhite: 0xfaebd7, aqua: 0x00ffff, aquamarine: 0x7fffd4,
12
+ azure: 0xf0ffff, beige: 0xf5f5dc, bisque: 0xffe4c4, black: 0x000000,
13
+ blanchedalmond: 0xffebcd, blue: 0x0000ff, blueviolet: 0x8a2be2, brown: 0xa52a2a,
14
+ burlywood: 0xdeb887, cadetblue: 0x5f9ea0, chartreuse: 0x7fff00, chocolate: 0xd2691e,
15
+ coral: 0xff7f50, cornflowerblue: 0x6495ed, cornsilk: 0xfff8dc, crimson: 0xdc143c,
16
+ cyan: 0x00ffff, darkblue: 0x00008b, darkcyan: 0x008b8b, darkgoldenrod: 0xb8860b,
17
+ darkgray: 0xa9a9a9, darkgreen: 0x006400, darkgrey: 0xa9a9a9, darkkhaki: 0xbdb76b,
18
+ darkmagenta: 0x8b008b, darkolivegreen: 0x556b2f, darkorange: 0xff8c00, darkorchid: 0x9932cc,
19
+ darkred: 0x8b0000, darksalmon: 0xe9967a, darkseagreen: 0x8fbc8f, darkslateblue: 0x483d8b,
20
+ darkslategray: 0x2f4f4f, darkslategrey: 0x2f4f4f, darkturquoise: 0x00ced1, darkviolet: 0x9400d3,
21
+ deeppink: 0xff1493, deepskyblue: 0x00bfff, dimgray: 0x696969, dimgrey: 0x696969,
22
+ dodgerblue: 0x1e90ff, firebrick: 0xb22222, floralwhite: 0xfffaf0, forestgreen: 0x228b22,
23
+ fuchsia: 0xff00ff, gainsboro: 0xdcdcdc, ghostwhite: 0xf8f8ff, gold: 0xffd700,
24
+ goldenrod: 0xdaa520, gray: 0x808080, green: 0x008000, greenyellow: 0xadff2f,
25
+ grey: 0x808080, honeydew: 0xf0fff0, hotpink: 0xff69b4, indianred: 0xcd5c5c,
26
+ indigo: 0x4b0082, ivory: 0xfffff0, khaki: 0xf0e68c, lavender: 0xe6e6fa,
27
+ lavenderblush: 0xfff0f5, lawngreen: 0x7cfc00, lemonchiffon: 0xfffacd, lightblue: 0xadd8e6,
28
+ lightcoral: 0xf08080, lightcyan: 0xe0ffff, lightgoldenrodyellow: 0xfafad2, lightgray: 0xd3d3d3,
29
+ lightgreen: 0x90ee90, lightgrey: 0xd3d3d3, lightpink: 0xffb6c1, lightsalmon: 0xffa07a,
30
+ lightseagreen: 0x20b2aa, lightskyblue: 0x87cefa, lightslategray: 0x778899, lightslategrey: 0x778899,
31
+ lightsteelblue: 0xb0c4de, lightyellow: 0xffffe0, lime: 0x00ff00, limegreen: 0x32cd32,
32
+ linen: 0xfaf0e6, magenta: 0xff00ff, maroon: 0x800000, mediumaquamarine: 0x66cdaa,
33
+ mediumblue: 0x0000cd, mediumorchid: 0xba55d3, mediumpurple: 0x9370db, mediumseagreen: 0x3cb371,
34
+ mediumslateblue: 0x7b68ee, mediumspringgreen: 0x00fa9a, mediumturquoise: 0x48d1cc, mediumvioletred: 0xc71585,
35
+ midnightblue: 0x191970, mintcream: 0xf5fffa, mistyrose: 0xffe4e1, moccasin: 0xffe4b5,
36
+ navajowhite: 0xffdead, navy: 0x000080, oldlace: 0xfdf5e6, olive: 0x808000,
37
+ olivedrab: 0x6b8e23, orange: 0xffa500, orangered: 0xff4500, orchid: 0xda70d6,
38
+ palegoldenrod: 0xeee8aa, palegreen: 0x98fb98, paleturquoise: 0xafeeee, palevioletred: 0xdb7093,
39
+ papayawhip: 0xffefd5, peachpuff: 0xffdab9, peru: 0xcd853f, pink: 0xffc0cb,
40
+ plum: 0xdda0dd, powderblue: 0xb0e0e6, purple: 0x800080, rebeccapurple: 0x663399,
41
+ red: 0xff0000, rosybrown: 0xbc8f8f, royalblue: 0x4169e1, saddlebrown: 0x8b4513,
42
+ salmon: 0xfa8072, sandybrown: 0xf4a460, seagreen: 0x2e8b57, seashell: 0xfff5ee,
43
+ sienna: 0xa0522d, silver: 0xc0c0c0, skyblue: 0x87ceeb, slateblue: 0x6a5acd,
44
+ slategray: 0x708090, slategrey: 0x708090, snow: 0xfffafa, springgreen: 0x00ff7f,
45
+ steelblue: 0x4682b4, tan: 0xd2b48c, teal: 0x008080, thistle: 0xd8bfd8,
46
+ tomato: 0xff6347, turquoise: 0x40e0d0, violet: 0xee82ee, wheat: 0xf5deb3,
47
+ white: 0xffffff, whitesmoke: 0xf5f5f5, yellow: 0xffff00, yellowgreen: 0x9acd32,
48
+ };
49
+ /**
50
+ * Map of CSS named color -> ColorBits (opaque), plus `transparent`.
51
+ * Keys are lowercase. Uses a null prototype so lookups of names like
52
+ * `toString` correctly miss.
53
+ */
54
+ exports.namedColors = Object.create(null);
55
+ exports.namedColors.transparent = (0, bits_1.newColor)(0, 0, 0, 0);
56
+ for (const name in RGB) {
57
+ const v = RGB[name];
58
+ exports.namedColors[name] = (0, bits_1.newColor)((v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff, 0xff);
59
+ }
60
+ /**
61
+ * Resolve a CSS named color (case-insensitive), or `transparent`.
62
+ * @returns the ColorBits, or null if the name is not a known color.
63
+ */
64
+ function resolveNamed(name) {
65
+ const color = exports.namedColors[name.toLowerCase()];
66
+ return color === undefined ? null : color;
67
+ }
68
+ //# sourceMappingURL=named-colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"named-colors.js","sourceRoot":"","sources":["../../src/parsing/named-colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ColorBits } from '../core/bits';
2
+ import type { Tokens } from './tokenizer';
3
+ /**
4
+ * Resolve a color function from its tokenized form: either a relative color
5
+ * (`rgb(from …)`) or an absolute function with calc() channels.
6
+ * @param tokens tokenized function
7
+ * @param parseColor parser for the origin color (recursive; handles nested colors)
8
+ */
9
+ export declare function resolveColorFunction(tokens: Tokens, parseColor: (input: string) => ColorBits): ColorBits;
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ // Color-function resolution for the forms the fast regex path cannot handle:
3
+ // relative colors, e.g. `oklch(from green calc(l * 0.8) c h / 0.5)`, and
4
+ // absolute functions whose channels use calc(), e.g. `rgb(calc(255 / 2) 0 0)`.
5
+ //
6
+ // For relative colors the origin is parsed (recursively, via the injected
7
+ // `parseColor`), then expressed in the destination color model's channels as
8
+ // keyword bindings. Each output channel is a keyword, a number/percentage/
9
+ // angle, `none`, or a calc() expression over those keywords. Results route
10
+ // through the same conversion math as the absolute parser, so absolute and
11
+ // relative agree.
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.resolveColorFunction = resolveColorFunction;
14
+ const bits_1 = require("../core/bits");
15
+ const bytes_1 = require("../core/bytes");
16
+ const calc_1 = require("./calc");
17
+ const values_1 = require("./values");
18
+ const channels_1 = require("../conversion/channels");
19
+ function rgbFromSrgb(r, g, b, out) {
20
+ out[0] = r * 255;
21
+ out[1] = g * 255;
22
+ out[2] = b * 255;
23
+ return out;
24
+ }
25
+ // Scratch for the origin's channel values; reuse is safe because the origin is
26
+ // fully parsed before fromSrgb runs, and the values are copied into the scope
27
+ // Map right away.
28
+ const ORIGIN_CHANNELS = new Float64Array(3);
29
+ function rgbToColor(r, g, b, alpha) {
30
+ return (0, bits_1.newColor)((0, bytes_1.clampByte)(r), (0, bytes_1.clampByte)(g), (0, bytes_1.clampByte)(b), alpha);
31
+ }
32
+ const RGB_MODEL = {
33
+ keys: ['r', 'g', 'b'],
34
+ ranges: [255, 255, 255],
35
+ hues: [false, false, false],
36
+ fromSrgb: rgbFromSrgb,
37
+ toColor: rgbToColor,
38
+ };
39
+ /** Model for a color function name, including the legacy rgba()/hsla() aliases. */
40
+ function functionModel(name) {
41
+ switch (name) {
42
+ case 'rgb':
43
+ case 'rgba': return RGB_MODEL;
44
+ case 'hsla': return (0, channels_1.colorModel)('hsl');
45
+ default: return (0, channels_1.colorModel)(name);
46
+ }
47
+ }
48
+ /** Channel scope for absolute functions: no keyword resolves. */
49
+ const EMPTY_SCOPE = new Map();
50
+ function fail(message) {
51
+ throw new Error('parseCSS(): ' + message);
52
+ }
53
+ /** Evaluate one channel token into its keyword-unit numeric value. */
54
+ function evalChannel(token, scope, range, isHue) {
55
+ const lower = token.toLowerCase();
56
+ const bound = scope.get(lower);
57
+ if (bound !== undefined) {
58
+ return bound;
59
+ }
60
+ let value;
61
+ if (lower.startsWith('calc(') || lower.startsWith('(')) {
62
+ value = (0, calc_1.evaluateCalc)(token, scope, range);
63
+ }
64
+ else if (isHue) {
65
+ value = (0, values_1.parseAngle)(token);
66
+ }
67
+ else {
68
+ value = (0, values_1.parseNumberOrPercentage)(token, range);
69
+ }
70
+ // Unknown keywords and unsupported functions (min(), …) parse as NaN; a
71
+ // silent NaN would pack as channel 0, so reject it here.
72
+ if (Number.isNaN(value)) {
73
+ fail(`invalid channel value: "${token}"`);
74
+ }
75
+ return value;
76
+ }
77
+ /**
78
+ * Resolve a color function from its tokenized form: either a relative color
79
+ * (`rgb(from …)`) or an absolute function with calc() channels.
80
+ * @param tokens tokenized function
81
+ * @param parseColor parser for the origin color (recursive; handles nested colors)
82
+ */
83
+ function resolveColorFunction(tokens, parseColor) {
84
+ const { name } = tokens;
85
+ let args = tokens.tokens;
86
+ const isRelative = args.length > 0 && (0, values_1.isFromKeyword)(args[0]);
87
+ // Commas are invalid in relative colors; in absolute legacy forms they are
88
+ // plain separators.
89
+ let hadCommas = false;
90
+ if (args.indexOf(',') !== -1) {
91
+ if (isRelative) {
92
+ fail(`unexpected comma in relative "${name}()"`);
93
+ }
94
+ hadCommas = true;
95
+ args = args.filter((token) => token !== ',');
96
+ }
97
+ if (isRelative && args[1] === undefined) {
98
+ fail(`missing origin color in "${name}()"`);
99
+ }
100
+ let model;
101
+ let channelStart;
102
+ const spaceIndex = isRelative ? 2 : 0;
103
+ if (name === 'color') {
104
+ const space = args[spaceIndex];
105
+ model = space === undefined ? null : (0, channels_1.colorSpaceModel)(space.toLowerCase());
106
+ channelStart = spaceIndex + 1;
107
+ }
108
+ else {
109
+ model = functionModel(name);
110
+ channelStart = spaceIndex;
111
+ }
112
+ if (model === null) {
113
+ fail(`unsupported color function: "${name}"`);
114
+ }
115
+ let origin = 0;
116
+ let scope = EMPTY_SCOPE;
117
+ if (isRelative) {
118
+ origin = parseColor(args[1]);
119
+ const [k1, k2, k3] = model.keys;
120
+ model.fromSrgb((0, bits_1.getRed)(origin) / 255, (0, bits_1.getGreen)(origin) / 255, (0, bits_1.getBlue)(origin) / 255, ORIGIN_CHANNELS);
121
+ scope = new Map();
122
+ scope.set(k1, ORIGIN_CHANNELS[0]);
123
+ scope.set(k2, ORIGIN_CHANNELS[1]);
124
+ scope.set(k3, ORIGIN_CHANNELS[2]);
125
+ scope.set('alpha', (0, bits_1.getAlpha)(origin) / 255);
126
+ }
127
+ const t1 = args[channelStart];
128
+ const t2 = args[channelStart + 1];
129
+ const t3 = args[channelStart + 2];
130
+ if (t1 === undefined || t2 === undefined || t3 === undefined) {
131
+ fail(`"${name}()" needs three channels`);
132
+ }
133
+ const c1 = evalChannel(t1, scope, model.ranges[0], model.hues[0]);
134
+ const c2 = evalChannel(t2, scope, model.ranges[1], model.hues[1]);
135
+ const c3 = evalChannel(t3, scope, model.ranges[2], model.hues[2]);
136
+ // Optional alpha: `… / <alpha>`, or a bare fourth value in legacy comma
137
+ // syntax. Omitted alpha inherits the origin's (relative) or is opaque.
138
+ let alphaByte = isRelative ? (0, bits_1.getAlpha)(origin) : 255;
139
+ const rest = channelStart + 3;
140
+ const next = args[rest];
141
+ if (next !== undefined) {
142
+ if (next === '/') {
143
+ const alphaToken = args[rest + 1];
144
+ if (alphaToken === undefined || args[rest + 2] !== undefined) {
145
+ fail(`invalid alpha in "${name}()"`);
146
+ }
147
+ alphaByte = (0, bytes_1.clampByte)(evalChannel(alphaToken, scope, 1, false) * 255);
148
+ }
149
+ else if (hadCommas && args[rest + 1] === undefined) {
150
+ alphaByte = (0, bytes_1.clampByte)(evalChannel(next, scope, 1, false) * 255);
151
+ }
152
+ else {
153
+ fail(`unexpected "${next}" in "${name}()"`);
154
+ }
155
+ }
156
+ return model.toColor(c1, c2, c3, alphaByte);
157
+ }
158
+ //# sourceMappingURL=relative.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relative.js","sourceRoot":"","sources":["../../src/parsing/relative.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface Tokens {
2
+ /** Function name, lowercased (e.g. "rgb", "oklch", "color-mix"). */
3
+ name: string;
4
+ /**
5
+ * Top-level argument tokens, split on whitespace at paren depth 0. Nested
6
+ * function calls (origins, `calc(...)`) stay whole. The separators `/` (alpha)
7
+ * and `,` (color-mix groups) are emitted as their own "/" and "," tokens.
8
+ */
9
+ tokens: string[];
10
+ }
11
+ /**
12
+ * Tokenize a CSS color function string, e.g. "oklch(from green l c h / .5)".
13
+ * @returns the function name and its top-level tokens, or null if the input is
14
+ * not a function call (no parentheses).
15
+ */
16
+ export declare function tokenize(input: string): Tokens | null;