color-bits 1.1.1 → 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.
- package/.claude/settings.local.json +9 -0
- package/README.md +29 -13
- package/benchmarks/compare-oklab.ts +44 -0
- package/benchmarks/compare-srgb.ts +59 -0
- package/benchmarks/compare.ts +46 -0
- package/benchmarks/parse.ts +41 -0
- package/build/conversion/channels.d.ts +61 -0
- package/build/conversion/channels.js +353 -0
- package/build/conversion/channels.js.map +1 -0
- package/build/{convert.d.ts → conversion/color-spaces.d.ts} +25 -23
- package/build/conversion/color-spaces.js +263 -0
- package/build/conversion/color-spaces.js.map +1 -0
- package/build/core/bits.d.ts +28 -0
- package/build/{core.js → core/bits.js} +25 -26
- package/build/core/bits.js.map +1 -0
- package/build/core/bytes.d.ts +5 -0
- package/build/core/bytes.js +12 -0
- package/build/core/bytes.js.map +1 -0
- package/build/css.d.ts +1 -0
- package/build/css.js +18 -0
- package/build/css.js.map +1 -0
- package/build/formatting/index.d.ts +27 -0
- package/build/{format.js → formatting/index.js} +13 -67
- package/build/formatting/index.js.map +1 -0
- package/build/index.d.ts +6 -4
- package/build/index.js +6 -4
- package/build/index.js.map +1 -1
- package/build/namedColors.d.ts +1 -0
- package/build/namedColors.js +18 -0
- package/build/namedColors.js.map +1 -0
- package/build/operations/adjust.d.ts +19 -0
- package/build/operations/adjust.js +40 -0
- package/build/operations/adjust.js.map +1 -0
- package/build/operations/blend.d.ts +9 -0
- package/build/operations/blend.js +19 -0
- package/build/operations/blend.js.map +1 -0
- package/build/operations/color-mix.d.ts +20 -0
- package/build/operations/color-mix.js +144 -0
- package/build/operations/color-mix.js.map +1 -0
- package/build/operations/luminance.d.ts +7 -0
- package/build/operations/luminance.js +20 -0
- package/build/operations/luminance.js.map +1 -0
- package/build/parsing/calc.d.ts +8 -0
- package/build/parsing/calc.js +205 -0
- package/build/parsing/calc.js.map +1 -0
- package/build/parsing/color-mix.d.ts +8 -0
- package/build/parsing/color-mix.js +70 -0
- package/build/parsing/color-mix.js.map +1 -0
- package/build/parsing/css.d.ts +23 -0
- package/build/parsing/css.js +115 -0
- package/build/parsing/css.js.map +1 -0
- package/build/parsing/fast.d.ts +19 -0
- package/build/parsing/fast.js +184 -0
- package/build/parsing/fast.js.map +1 -0
- package/build/parsing/named-colors.d.ts +12 -0
- package/build/parsing/named-colors.js +68 -0
- package/build/parsing/named-colors.js.map +1 -0
- package/build/parsing/relative.d.ts +9 -0
- package/build/parsing/relative.js +158 -0
- package/build/parsing/relative.js.map +1 -0
- package/build/parsing/tokenizer.d.ts +16 -0
- package/build/parsing/tokenizer.js +78 -0
- package/build/parsing/tokenizer.js.map +1 -0
- package/build/parsing/values.d.ts +41 -0
- package/build/parsing/values.js +139 -0
- package/build/parsing/values.js.map +1 -0
- package/package.json +15 -3
- package/benchmarks/index.ts +0 -35
- package/build/bit.d.ts +0 -3
- package/build/bit.js +0 -29
- package/build/bit.js.map +0 -1
- package/build/convert.js +0 -347
- package/build/convert.js.map +0 -1
- package/build/core.d.ts +0 -27
- package/build/core.js.map +0 -1
- package/build/format.d.ts +0 -27
- package/build/format.js.map +0 -1
- package/build/functions.d.ts +0 -33
- package/build/functions.js +0 -95
- package/build/functions.js.map +0 -1
- package/build/parse.d.ts +0 -17
- package/build/parse.js +0 -392
- 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;
|