@rickosborne/css 2025.2.16 → 2025.3.4

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/README.md CHANGED
@@ -275,18 +275,6 @@ isTransparentHex: (hex: string) => boolean
275
275
  Whether the given hex would produce a fully transparent (alpha 0) color.
276
276
 
277
277
 
278
- #### readFromCSS
279
-
280
- <a id="api-readfromcss"></a>
281
-
282
- ```typescript
283
- readFromCSS: (text: string) => CSSTokenReader
284
- ```
285
-
286
- Minimal CSS pull parser, which only supports the happy-path tokens expected in a CSS color expression. Does not support anywhere near the full CSS Colors spec, but it'll do in a pinch.
287
-
288
-
289
-
290
278
  #### toCSSColorName
291
279
 
292
280
  <a id="api-tocsscolorname"></a>
@@ -297,14 +285,6 @@ toCSSColorName: (name: unknown) => CSSColorName | undefined
297
285
 
298
286
  ### Interfaces
299
287
 
300
- #### CSSColorToken
301
-
302
- <a id="api-csscolortoken"></a>
303
-
304
- ```typescript
305
- export interface CSSColorToken<Type extends string = string>
306
- ```
307
-
308
288
  #### CSSErrorOptions
309
289
 
310
290
  <a id="api-csserroroptions"></a>
@@ -313,62 +293,6 @@ export interface CSSColorToken<Type extends string = string>
313
293
  export interface CSSErrorOptions extends ErrorOptions
314
294
  ```
315
295
 
316
- #### CSSFunctionToken
317
-
318
- <a id="api-cssfunctiontoken"></a>
319
-
320
- ```typescript
321
- export interface CSSFunctionToken extends CSSColorToken<"function">
322
- ```
323
-
324
- #### CSSHexHashToken
325
-
326
- <a id="api-csshexhashtoken"></a>
327
-
328
- ```typescript
329
- export interface CSSHexHashToken extends CSSColorToken<"hex">
330
- ```
331
-
332
- #### CSSKeywordToken
333
-
334
- <a id="api-csskeywordtoken"></a>
335
-
336
- ```typescript
337
- export interface CSSKeywordToken extends CSSColorToken<"keyword">
338
- ```
339
-
340
- #### CSSLiteralToken
341
-
342
- <a id="api-cssliteraltoken"></a>
343
-
344
- ```typescript
345
- export interface CSSLiteralToken extends CSSColorToken<"literal">
346
- ```
347
-
348
- #### CSSNumberToken
349
-
350
- <a id="api-cssnumbertoken"></a>
351
-
352
- ```typescript
353
- export interface CSSNumberToken extends CSSColorToken<"number">
354
- ```
355
-
356
- #### CSSTokenReader
357
-
358
- <a id="api-csstokenreader"></a>
359
-
360
- ```typescript
361
- export interface CSSTokenReader
362
- ```
363
-
364
- #### CSSTokenReaderMatcher
365
-
366
- <a id="api-csstokenreadermatcher"></a>
367
-
368
- ```typescript
369
- export interface CSSTokenReaderMatcher<Type extends CSSToken["type"] = CSSToken["type"]>
370
- ```
371
-
372
296
  #### FunctionColorToken
373
297
 
374
298
  <a id="api-functioncolortoken"></a>
@@ -458,14 +382,6 @@ type CSSLengthUnit = CSSRelativeLengthUnit | CSSAbsoluteLengthUnit;
458
382
  type CSSRelativeLengthUnit = "em" | "ex" | "cap" | "ch" | "ic" | "rem" | "lh" | "rlh" | "vw" | "vh" | "vi" | "vb" | "vmin" | "vmax" | "svw" | "lvw" | "dvw" | "svh" | "lvh" | "dvh" | "svi" | "lvi" | "dvi" | "svb" | "lvb" | "dvb" | "svmin" | "lvmin" | "dvmin" | "svmax" | "lvmax" | "dvmax";
459
383
  ```
460
384
 
461
- #### CSSToken
462
-
463
- <a id="api-csstoken"></a>
464
-
465
- ```typescript
466
- type CSSToken = CSSKeywordToken | CSSFunctionToken | CSSHexHashToken | CSSLiteralToken | CSSNumberToken;
467
- ```
468
-
469
385
  #### DimensionPair
470
386
 
471
387
  <a id="api-dimensionpair"></a>
package/color-parser.cjs CHANGED
@@ -23,110 +23,134 @@ __export(color_parser_exports, {
23
23
  colorTokensFromCSS: () => colorTokensFromCSS
24
24
  });
25
25
  module.exports = __toCommonJS(color_parser_exports);
26
+ var import_foundation = require("@rickosborne/foundation");
27
+ var import_guard = require("@rickosborne/guard");
26
28
  var import_colors = require("./colors.cjs");
27
29
  var import_css_error = require("./css-error.cjs");
28
30
  var import_href = require("./href.cjs");
29
- var import_tokenizer = require("./tokenizer.cjs");
30
31
  const COLOR_FUNCTIONS = Object.freeze(["color", "rgb", "rgba", "hsl", "hsla", "hwb"]);
31
- const colorTokensFromCSS = /* @__PURE__ */ __name((text) => {
32
- if (text.trim() === "") {
33
- return void 0;
32
+ const _CSSColorTokenizer = class _CSSColorTokenizer extends import_foundation.StringTokenizer {
33
+ static forText(text) {
34
+ return new _CSSColorTokenizer(text[Symbol.iterator](), text);
34
35
  }
35
- const reader = (0, import_tokenizer.readFromCSS)(text);
36
- const kwOrFn = reader.pull(
37
- "hex",
38
- {
39
- match: COLOR_FUNCTIONS,
40
- type: "function"
41
- },
42
- "keyword"
43
- );
44
- if (kwOrFn == null) return void 0;
45
- if (kwOrFn.type === "keyword") {
46
- const keyword = kwOrFn.keyword;
47
- const name = (0, import_colors.toCSSColorName)(keyword);
36
+ consumeColor() {
37
+ this.consumeSpace();
38
+ const char = this.peek();
39
+ if (char == null) {
40
+ return void 0;
41
+ }
42
+ if (char === "#") {
43
+ return this.consumeHex();
44
+ }
45
+ const literal = this.consumeLiteral();
46
+ if (COLOR_FUNCTIONS.includes(literal)) {
47
+ return this.consumeFunctionCall(literal);
48
+ }
49
+ const name = (0, import_colors.toCSSColorName)(literal);
48
50
  if (name == null) {
49
- throw new import_css_error.CSSError(text, { expected: "Color name", href: import_href.HREF_COLOR, message: `Unknown keyword: ${keyword}` });
51
+ throw this.fail(`Unknown keyword: ${literal}`, { expected: "Color name", href: import_href.HREF_COLOR });
50
52
  }
51
53
  return { name };
52
54
  }
53
- if (kwOrFn.type === "hex") {
54
- return { hex: kwOrFn.hex };
55
- }
56
- const functionName = kwOrFn.name;
57
- let space = void 0;
58
- const fail = /* @__PURE__ */ __name((message, options = {}) => {
59
- throw new import_css_error.CSSError(text, { ...options, message });
60
- }, "fail");
61
- if (kwOrFn.name === "color") {
62
- const spaceKw = reader.pull({
63
- type: "keyword"
64
- });
65
- if (spaceKw == null) {
66
- return fail(`Missing color space`, { href: import_href.HREF_COLOR_FN });
55
+ consumeFunctionCall(functionName) {
56
+ this.consumeSpace();
57
+ this.consumeExact("(");
58
+ let space = void 0;
59
+ if (functionName === "color") {
60
+ space = this.consumeLiteral(() => this.fail("Missing color space", { href: import_href.HREF_COLOR_FN }));
61
+ }
62
+ const components = [];
63
+ const breakAfterComponent = /* @__PURE__ */ __name(() => {
64
+ this.consumeSpace();
65
+ if (components.length === 3) {
66
+ if (!this.tryConsume(",")) {
67
+ this.tryConsume("/");
68
+ }
69
+ } else {
70
+ this.tryConsume(",");
71
+ }
72
+ if (components.length >= 3) {
73
+ if (this.tryConsume(")")) {
74
+ return true;
75
+ }
76
+ }
77
+ return false;
78
+ }, "breakAfterComponent");
79
+ while (!this.done) {
80
+ if (components.length >= 4) {
81
+ throw this.fail(`Malformed ${functionName}() color`);
82
+ }
83
+ this.consumeSpace();
84
+ const component = this.tryConsumeColorComponent();
85
+ if (component != null) {
86
+ components.push(component);
87
+ if (breakAfterComponent()) {
88
+ break;
89
+ }
90
+ } else {
91
+ throw this.fail(`Malformed ${functionName}() color`);
92
+ }
67
93
  }
68
- space = spaceKw.keyword;
94
+ return {
95
+ components,
96
+ functionName,
97
+ ...space == null ? {} : { space }
98
+ };
69
99
  }
70
- let functionDone = false;
71
- const components = [];
72
- const breakAfterNumber = /* @__PURE__ */ __name(() => {
73
- if (components.length === 3) {
74
- reader.pull({ match: [",", "/"], type: "literal" });
75
- } else {
76
- reader.pull({ match: [","], type: "literal" });
100
+ consumeHex() {
101
+ return { hex: this.consumeWhile((t, i) => i === 0 ? t === "#" : (0, import_guard.isHexDigit)(t)) };
102
+ }
103
+ consumeLiteral(errorProvider = () => new SyntaxError(`Expected a literal at ${this.at}`)) {
104
+ const literal = this.tryConsumeLiteral();
105
+ if (literal != null) {
106
+ return literal;
77
107
  }
78
- if (components.length >= 3) {
79
- const paren = reader.pull({ match: [")"], type: "literal" });
80
- if (paren != null) {
81
- functionDone = true;
82
- return true;
83
- }
108
+ throw errorProvider();
109
+ }
110
+ fail(message, options = {}) {
111
+ return new import_css_error.CSSError(this.text, { ...options, message });
112
+ }
113
+ tryConsumeColorComponent() {
114
+ if (this.tryConsume("none")) {
115
+ return [0, void 0];
84
116
  }
85
- return false;
86
- }, "breakAfterNumber");
87
- while (!functionDone) {
88
- if (components.length >= 4) {
89
- return fail(`Malformed ${functionName}() color`);
117
+ const maybeNumber = this.tryConsumeNumber();
118
+ if (maybeNumber == null) {
119
+ return void 0;
90
120
  }
91
- const token = reader.pull(
92
- "number",
93
- { match: ["none"], type: "keyword" }
94
- );
95
- if (token == null) {
96
- return fail(`Malformed ${functionName}() color`);
121
+ this.consumeSpace();
122
+ let unit;
123
+ if (this.tryConsume("%")) {
124
+ unit = "%";
125
+ } else {
126
+ unit = this.tryConsumeLiteral();
97
127
  }
98
- if (token.type === "keyword") {
99
- if (token.keyword === "none") {
100
- components.push([0, void 0]);
101
- if (breakAfterNumber()) {
102
- break;
103
- }
104
- continue;
128
+ this.consumeSpace();
129
+ return [maybeNumber, unit];
130
+ }
131
+ tryConsumeLiteral() {
132
+ const literal = this.consumeWhile((t, i) => i === 0 ? new RegExp("^\\p{ID_Start}$", "u").test(t) : /^[-\p{ID_Continue}]$/u.test(t));
133
+ return literal === "" ? void 0 : literal;
134
+ }
135
+ tryConsumeNumber() {
136
+ const sign = this.tryConsume("-") ? -1 : 1;
137
+ const intText = this.consumeWhile(import_guard.isDigit);
138
+ if (intText === "") {
139
+ if (sign < 0) {
140
+ throw this.fail(`Expected a number at ${this.at}`);
105
141
  }
142
+ return void 0;
106
143
  }
107
- if (token.type === "number") {
108
- const unitToken = reader.pull(
109
- "keyword",
110
- { match: ["%"], type: "literal" }
111
- );
112
- let unit;
113
- if ((unitToken == null ? void 0 : unitToken.type) === "literal") {
114
- unit = unitToken.literal;
115
- } else if ((unitToken == null ? void 0 : unitToken.type) === "keyword") {
116
- unit = unitToken.keyword;
117
- } else {
118
- unit = void 0;
119
- }
120
- components.push([token.value, unit]);
121
- if (breakAfterNumber()) {
122
- break;
123
- }
144
+ if (this.tryConsume(".")) {
145
+ const fracText = this.consumeWhile(import_guard.isDigit);
146
+ return sign * Number.parseFloat(`${intText}.${fracText}`);
124
147
  }
148
+ return sign * Number.parseInt(intText, 10);
125
149
  }
126
- return {
127
- components,
128
- functionName,
129
- ...space == null ? {} : { space }
130
- };
150
+ };
151
+ __name(_CSSColorTokenizer, "CSSColorTokenizer");
152
+ let CSSColorTokenizer = _CSSColorTokenizer;
153
+ const colorTokensFromCSS = /* @__PURE__ */ __name((text) => {
154
+ return CSSColorTokenizer.forText(text).consumeColor();
131
155
  }, "colorTokensFromCSS");
132
156
  //# sourceMappingURL=color-parser.cjs.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/packages/css/color-parser.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"color-parser.d.ts","sourceRoot":"","sources":["../../../src/packages/css/color-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAEjF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AACjF,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,gBAAgB,EAAE,CAAmE,CAAC;AAE7H,eAAO,MAAM,kBAAkB,SACxB,MAAM,KACV,cAAc,GAAG,SAyGnB,CAAC"}
1
+ {"version":3,"file":"color-parser.d.ts","sourceRoot":"","sources":["../../../src/packages/css/color-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAEjF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AACjF,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,gBAAgB,EAAE,CAAmE,CAAC;AAoI7H,eAAO,MAAM,kBAAkB,SACxB,MAAM,KACV,cAAc,GAAG,SAEnB,CAAC"}
package/color-parser.mjs CHANGED
@@ -1,110 +1,134 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { StringTokenizer } from "@rickosborne/foundation";
4
+ import { isDigit, isHexDigit } from "@rickosborne/guard";
3
5
  import { toCSSColorName } from "./colors.mjs";
4
6
  import { CSSError } from "./css-error.mjs";
5
7
  import { HREF_COLOR, HREF_COLOR_FN } from "./href.mjs";
6
- import { readFromCSS } from "./tokenizer.mjs";
7
8
  const COLOR_FUNCTIONS = Object.freeze(["color", "rgb", "rgba", "hsl", "hsla", "hwb"]);
8
- const colorTokensFromCSS = /* @__PURE__ */ __name((text) => {
9
- if (text.trim() === "") {
10
- return void 0;
9
+ const _CSSColorTokenizer = class _CSSColorTokenizer extends StringTokenizer {
10
+ static forText(text) {
11
+ return new _CSSColorTokenizer(text[Symbol.iterator](), text);
11
12
  }
12
- const reader = readFromCSS(text);
13
- const kwOrFn = reader.pull(
14
- "hex",
15
- {
16
- match: COLOR_FUNCTIONS,
17
- type: "function"
18
- },
19
- "keyword"
20
- );
21
- if (kwOrFn == null) return void 0;
22
- if (kwOrFn.type === "keyword") {
23
- const keyword = kwOrFn.keyword;
24
- const name = toCSSColorName(keyword);
13
+ consumeColor() {
14
+ this.consumeSpace();
15
+ const char = this.peek();
16
+ if (char == null) {
17
+ return void 0;
18
+ }
19
+ if (char === "#") {
20
+ return this.consumeHex();
21
+ }
22
+ const literal = this.consumeLiteral();
23
+ if (COLOR_FUNCTIONS.includes(literal)) {
24
+ return this.consumeFunctionCall(literal);
25
+ }
26
+ const name = toCSSColorName(literal);
25
27
  if (name == null) {
26
- throw new CSSError(text, { expected: "Color name", href: HREF_COLOR, message: `Unknown keyword: ${keyword}` });
28
+ throw this.fail(`Unknown keyword: ${literal}`, { expected: "Color name", href: HREF_COLOR });
27
29
  }
28
30
  return { name };
29
31
  }
30
- if (kwOrFn.type === "hex") {
31
- return { hex: kwOrFn.hex };
32
- }
33
- const functionName = kwOrFn.name;
34
- let space = void 0;
35
- const fail = /* @__PURE__ */ __name((message, options = {}) => {
36
- throw new CSSError(text, { ...options, message });
37
- }, "fail");
38
- if (kwOrFn.name === "color") {
39
- const spaceKw = reader.pull({
40
- type: "keyword"
41
- });
42
- if (spaceKw == null) {
43
- return fail(`Missing color space`, { href: HREF_COLOR_FN });
32
+ consumeFunctionCall(functionName) {
33
+ this.consumeSpace();
34
+ this.consumeExact("(");
35
+ let space = void 0;
36
+ if (functionName === "color") {
37
+ space = this.consumeLiteral(() => this.fail("Missing color space", { href: HREF_COLOR_FN }));
38
+ }
39
+ const components = [];
40
+ const breakAfterComponent = /* @__PURE__ */ __name(() => {
41
+ this.consumeSpace();
42
+ if (components.length === 3) {
43
+ if (!this.tryConsume(",")) {
44
+ this.tryConsume("/");
45
+ }
46
+ } else {
47
+ this.tryConsume(",");
48
+ }
49
+ if (components.length >= 3) {
50
+ if (this.tryConsume(")")) {
51
+ return true;
52
+ }
53
+ }
54
+ return false;
55
+ }, "breakAfterComponent");
56
+ while (!this.done) {
57
+ if (components.length >= 4) {
58
+ throw this.fail(`Malformed ${functionName}() color`);
59
+ }
60
+ this.consumeSpace();
61
+ const component = this.tryConsumeColorComponent();
62
+ if (component != null) {
63
+ components.push(component);
64
+ if (breakAfterComponent()) {
65
+ break;
66
+ }
67
+ } else {
68
+ throw this.fail(`Malformed ${functionName}() color`);
69
+ }
44
70
  }
45
- space = spaceKw.keyword;
71
+ return {
72
+ components,
73
+ functionName,
74
+ ...space == null ? {} : { space }
75
+ };
46
76
  }
47
- let functionDone = false;
48
- const components = [];
49
- const breakAfterNumber = /* @__PURE__ */ __name(() => {
50
- if (components.length === 3) {
51
- reader.pull({ match: [",", "/"], type: "literal" });
52
- } else {
53
- reader.pull({ match: [","], type: "literal" });
77
+ consumeHex() {
78
+ return { hex: this.consumeWhile((t, i) => i === 0 ? t === "#" : isHexDigit(t)) };
79
+ }
80
+ consumeLiteral(errorProvider = () => new SyntaxError(`Expected a literal at ${this.at}`)) {
81
+ const literal = this.tryConsumeLiteral();
82
+ if (literal != null) {
83
+ return literal;
54
84
  }
55
- if (components.length >= 3) {
56
- const paren = reader.pull({ match: [")"], type: "literal" });
57
- if (paren != null) {
58
- functionDone = true;
59
- return true;
60
- }
85
+ throw errorProvider();
86
+ }
87
+ fail(message, options = {}) {
88
+ return new CSSError(this.text, { ...options, message });
89
+ }
90
+ tryConsumeColorComponent() {
91
+ if (this.tryConsume("none")) {
92
+ return [0, void 0];
61
93
  }
62
- return false;
63
- }, "breakAfterNumber");
64
- while (!functionDone) {
65
- if (components.length >= 4) {
66
- return fail(`Malformed ${functionName}() color`);
94
+ const maybeNumber = this.tryConsumeNumber();
95
+ if (maybeNumber == null) {
96
+ return void 0;
67
97
  }
68
- const token = reader.pull(
69
- "number",
70
- { match: ["none"], type: "keyword" }
71
- );
72
- if (token == null) {
73
- return fail(`Malformed ${functionName}() color`);
98
+ this.consumeSpace();
99
+ let unit;
100
+ if (this.tryConsume("%")) {
101
+ unit = "%";
102
+ } else {
103
+ unit = this.tryConsumeLiteral();
74
104
  }
75
- if (token.type === "keyword") {
76
- if (token.keyword === "none") {
77
- components.push([0, void 0]);
78
- if (breakAfterNumber()) {
79
- break;
80
- }
81
- continue;
105
+ this.consumeSpace();
106
+ return [maybeNumber, unit];
107
+ }
108
+ tryConsumeLiteral() {
109
+ const literal = this.consumeWhile((t, i) => i === 0 ? new RegExp("^\\p{ID_Start}$", "u").test(t) : /^[-\p{ID_Continue}]$/u.test(t));
110
+ return literal === "" ? void 0 : literal;
111
+ }
112
+ tryConsumeNumber() {
113
+ const sign = this.tryConsume("-") ? -1 : 1;
114
+ const intText = this.consumeWhile(isDigit);
115
+ if (intText === "") {
116
+ if (sign < 0) {
117
+ throw this.fail(`Expected a number at ${this.at}`);
82
118
  }
119
+ return void 0;
83
120
  }
84
- if (token.type === "number") {
85
- const unitToken = reader.pull(
86
- "keyword",
87
- { match: ["%"], type: "literal" }
88
- );
89
- let unit;
90
- if ((unitToken == null ? void 0 : unitToken.type) === "literal") {
91
- unit = unitToken.literal;
92
- } else if ((unitToken == null ? void 0 : unitToken.type) === "keyword") {
93
- unit = unitToken.keyword;
94
- } else {
95
- unit = void 0;
96
- }
97
- components.push([token.value, unit]);
98
- if (breakAfterNumber()) {
99
- break;
100
- }
121
+ if (this.tryConsume(".")) {
122
+ const fracText = this.consumeWhile(isDigit);
123
+ return sign * Number.parseFloat(`${intText}.${fracText}`);
101
124
  }
125
+ return sign * Number.parseInt(intText, 10);
102
126
  }
103
- return {
104
- components,
105
- functionName,
106
- ...space == null ? {} : { space }
107
- };
127
+ };
128
+ __name(_CSSColorTokenizer, "CSSColorTokenizer");
129
+ let CSSColorTokenizer = _CSSColorTokenizer;
130
+ const colorTokensFromCSS = /* @__PURE__ */ __name((text) => {
131
+ return CSSColorTokenizer.forText(text).consumeColor();
108
132
  }, "colorTokensFromCSS");
109
133
  export {
110
134
  COLOR_FUNCTIONS,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/packages/css/color-parser.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/index.cjs CHANGED
@@ -22,6 +22,5 @@ __reExport(index_exports, require("./css-error.cjs"), module.exports);
22
22
  __reExport(index_exports, require("./distance.cjs"), module.exports);
23
23
  __reExport(index_exports, require("./format.cjs"), module.exports);
24
24
  __reExport(index_exports, require("./href.cjs"), module.exports);
25
- __reExport(index_exports, require("./tokenizer.cjs"), module.exports);
26
25
  __reExport(index_exports, require("./units.cjs"), module.exports);
27
26
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/packages/css/index.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,uBAAd;AACA,0BAAc,8BADd;AAEA,0BAAc,wBAFd;AAGA,0BAAc,2BAHd;AAIA,0BAAc,0BAJd;AAKA,0BAAc,wBALd;AAMA,0BAAc,sBANd;AAOA,0BAAc,2BAPd;AAQA,0BAAc,uBARd;",
4
+ "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,uBAAd;AACA,0BAAc,8BADd;AAEA,0BAAc,wBAFd;AAGA,0BAAc,2BAHd;AAIA,0BAAc,0BAJd;AAKA,0BAAc,wBALd;AAMA,0BAAc,sBANd;AAOA,0BAAc,uBAPd;",
5
5
  "names": []
6
6
  }
package/index.d.ts CHANGED
@@ -5,6 +5,5 @@ export * from "./css-error";
5
5
  export * from "./distance";
6
6
  export * from "./format";
7
7
  export * from "./href";
8
- export * from "./tokenizer";
9
8
  export * from "./units";
10
9
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packages/css/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packages/css/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
package/index.mjs CHANGED
@@ -5,6 +5,5 @@ export * from "./css-error.mjs";
5
5
  export * from "./distance.mjs";
6
6
  export * from "./format.mjs";
7
7
  export * from "./href.mjs";
8
- export * from "./tokenizer.mjs";
9
8
  export * from "./units.mjs";
10
9
  //# sourceMappingURL=index.mjs.map
package/index.mjs.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/packages/css/index.ts"],
4
- "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -4,9 +4,9 @@
4
4
  "url": "https://rickosborne.org"
5
5
  },
6
6
  "dependencies": {
7
- "@rickosborne/foundation": "2025.2.16",
8
- "@rickosborne/guard": "2025.2.16",
9
- "@rickosborne/typical": "2025.2.16"
7
+ "@rickosborne/foundation": "2025.3.4",
8
+ "@rickosborne/guard": "2025.3.4",
9
+ "@rickosborne/typical": "2025.3.4"
10
10
  },
11
11
  "description": "Rick Osborne's collection of CSS-related code.",
12
12
  "engines": {
@@ -67,12 +67,6 @@
67
67
  "require": "./href.cjs",
68
68
  "default": "./href.mjs"
69
69
  },
70
- "./tokenizer": {
71
- "types": "./tokenizer.d.ts",
72
- "import": "./tokenizer.mjs",
73
- "require": "./tokenizer.cjs",
74
- "default": "./tokenizer.mjs"
75
- },
76
70
  "./units": {
77
71
  "types": "./units.d.ts",
78
72
  "import": "./units.mjs",
@@ -82,12 +76,12 @@
82
76
  },
83
77
  "git": {
84
78
  "authorName": "Rick Osborne",
85
- "commitDateISO": "2025-02-17T01:56:13.000Z",
86
- "commitHash": "2752126d79472c1f03b198ee33bcc30ff3a945a1",
87
- "commitLink": "https://github.com/rickosborne/es-js-ts/commits/2752126d79472c1f03b198ee33bcc30ff3a945a1",
88
- "parentHash": "94ad06ec519f22510af76f7ed91b46920aab1c7b",
79
+ "commitDateISO": "2025-03-04T05:14:45.000Z",
80
+ "commitHash": "6071cb511bb7f4cd0d99a077bb1affbaecb11780",
81
+ "commitLink": "https://github.com/rickosborne/es-js-ts/commits/6071cb511bb7f4cd0d99a077bb1affbaecb11780",
82
+ "parentHash": "f2b2d42c3564ccab51d8b3b847e89ff74ae82dd5",
89
83
  "signingKeyId": "8e61c433fe39d4a4679ce1d5b873fb3c48464f3c",
90
- "tag": "v2025.2.16"
84
+ "tag": "v2025.3.4"
91
85
  },
92
86
  "homepage": "https://github.com/rickosborne/es-js-ts",
93
87
  "keywords": [
@@ -110,5 +104,5 @@
110
104
  },
111
105
  "types": "./index.d.ts",
112
106
  "typings": "./index.d.ts",
113
- "version": "2025.2.16"
107
+ "version": "2025.3.4"
114
108
  }
package/tokenizer.cjs DELETED
@@ -1,87 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
- var tokenizer_exports = {};
21
- __export(tokenizer_exports, {
22
- readFromCSS: () => readFromCSS
23
- });
24
- module.exports = __toCommonJS(tokenizer_exports);
25
- var import_css_error = require("./css-error.cjs");
26
- const readFromCSS = /* @__PURE__ */ __name((text) => {
27
- let remain = text.trim();
28
- const done = /* @__PURE__ */ __name(() => remain.length === 0, "done");
29
- return {
30
- pull(...matchers) {
31
- if (done()) {
32
- return void 0;
33
- }
34
- for (const matcherOrType of matchers) {
35
- const matcher = typeof matcherOrType === "string" ? { type: matcherOrType } : matcherOrType;
36
- const { type, match } = matcher;
37
- let pattern;
38
- let builder;
39
- const matchSet = match == null ? /* @__PURE__ */ new Set() : match instanceof Set ? match : typeof match === "string" ? new Set(match) : new Set(match);
40
- switch (type) {
41
- case "number": {
42
- pattern = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?/;
43
- builder = /* @__PURE__ */ __name((f) => ({ type: "number", value: parseFloat(f) }), "builder");
44
- break;
45
- }
46
- case "function": {
47
- pattern = /^(\w+)\(/;
48
- builder = /* @__PURE__ */ __name((name) => ({ name, type: "function" }), "builder");
49
- break;
50
- }
51
- case "hex": {
52
- pattern = /^#[a-fA-F0-9]+/;
53
- builder = /* @__PURE__ */ __name((hex) => ({ hex, type: "hex" }), "builder");
54
- break;
55
- }
56
- case "keyword": {
57
- pattern = new RegExp("^\\p{ID_Start}[-\\p{ID_Continue}]*", "u");
58
- builder = /* @__PURE__ */ __name((keyword) => ({ keyword, type: "keyword" }), "builder");
59
- break;
60
- }
61
- case "literal": {
62
- if (matchSet.size == 0) {
63
- throw new import_css_error.CSSError(text, { expected: "match[]", message: "Unspecified literal" });
64
- }
65
- pattern = new RegExp("^".concat(Array.from(matchSet).map((t) => t.replace(/([\\()[\].^${}])/g, "\\$1")).join("|")));
66
- builder = /* @__PURE__ */ __name((literal) => ({ literal, type: "literal" }), "builder");
67
- break;
68
- }
69
- default: {
70
- throw new import_css_error.CSSError(type, { expected: "type", message: `Unknown token type: ${type}` });
71
- }
72
- }
73
- const peek = pattern.exec(remain);
74
- if (peek != null) {
75
- let remove = peek[0];
76
- let matched = peek[1] ?? peek[0];
77
- if (matchSet.has(matched) || matchSet.size === 0) {
78
- remain = remain.substring(remove.length).trim();
79
- return builder(matched);
80
- }
81
- }
82
- }
83
- return void 0;
84
- }
85
- };
86
- }, "readFromCSS");
87
- //# sourceMappingURL=tokenizer.cjs.map
package/tokenizer.cjs.map DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/packages/css/tokenizer.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAyB;AA2ClB,MAAM,cAAc,wBAC1B,SACoB;AACpB,MAAI,SAAS,KAAK,KAAK;AACvB,QAAM,OAAO,6BAAM,OAAO,WAAW,GAAxB;AACb,SAAO;AAAA,IACN,QAAuC,UAA8F;AACpI,UAAI,KAAK,GAAG;AACX,eAAO;AAAA,MACR;AACA,iBAAW,iBAAiB,UAAU;AACrC,cAAM,UAAU,OAAO,kBAAkB,WAAW,EAAE,MAAM,cAAc,IAAI;AAC9E,cAAM,EAAE,MAAM,MAAM,IAAI;AACxB,YAAI;AACJ,YAAI;AACJ,cAAM,WAAW,SAAS,OAAO,oBAAI,IAAY,IAAI,iBAAiB,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,IAAY,KAAK,IAAI,IAAI,IAAY,KAAK;AAC9J,gBAAQ,MAAM;AAAA,UACb,KAAK,UAAU;AACd,sBAAU;AACV,sBAAU,wBAAC,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,CAAC,EAAE,IAA/C;AACV;AAAA,UACD;AAAA,UACA,KAAK,YAAY;AAChB,sBAAU;AACV,sBAAU,wBAAC,UAAU,EAAE,MAAM,MAAM,WAAW,IAApC;AACV;AAAA,UACD;AAAA,UACA,KAAK,OAAO;AACX,sBAAU;AACV,sBAAU,wBAAC,SAAS,EAAE,KAAK,MAAM,MAAM,IAA7B;AACV;AAAA,UACD;AAAA,UACA,KAAK,WAAW;AACf,sBAAU,WAAC,sCAAiC,GAAC;AAC7C,sBAAU,wBAAC,aAAa,EAAE,SAAS,MAAM,UAAU,IAAzC;AACV;AAAA,UACD;AAAA,UACA,KAAK,WAAW;AACf,gBAAI,SAAS,QAAQ,GAAG;AACvB,oBAAM,IAAI,0BAAS,MAAM,EAAE,UAAU,WAAW,SAAS,sBAAsB,CAAC;AAAA,YACjF;AACA,sBAAU,IAAI,OAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,qBAAqB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AAClH,sBAAU,wBAAC,aAAa,EAAE,SAAS,MAAM,UAAU,IAAzC;AACV;AAAA,UACD;AAAA,UACA,SAAS;AACR,kBAAM,IAAI,0BAAS,MAAM,EAAE,UAAU,QAAQ,SAAS,uBAAwB,IAAK,GAAG,CAAC;AAAA,UACxF;AAAA,QACD;AACA,cAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,YAAI,QAAQ,MAAM;AACjB,cAAI,SAAS,KAAM,CAAE;AACrB,cAAI,UAAU,KAAM,CAAE,KAAK,KAAM,CAAE;AACnC,cAAI,SAAS,IAAI,OAAO,KAAK,SAAS,SAAS,GAAG;AACjD,qBAAS,OAAO,UAAU,OAAO,MAAM,EAAE,KAAK;AAC9C,mBAAO,QAAQ,OAAO;AAAA,UACvB;AAAA,QACD;AAAA,MACD;AACA,aAAO;AAAA,IACR;AAAA,EACD;AACD,GA9D2B;",
5
- "names": []
6
- }
package/tokenizer.d.ts DELETED
@@ -1,34 +0,0 @@
1
- export interface CSSColorToken<Type extends string = string> {
2
- type: Type;
3
- }
4
- export interface CSSLiteralToken extends CSSColorToken<"literal"> {
5
- literal: string;
6
- }
7
- export interface CSSHexHashToken extends CSSColorToken<"hex"> {
8
- hex: string;
9
- }
10
- export interface CSSKeywordToken extends CSSColorToken<"keyword"> {
11
- keyword: string;
12
- }
13
- export interface CSSFunctionToken extends CSSColorToken<"function"> {
14
- name: string;
15
- }
16
- export interface CSSNumberToken extends CSSColorToken<"number"> {
17
- value: number;
18
- }
19
- export interface CSSTokenReaderMatcher<Type extends CSSToken["type"] = CSSToken["type"]> {
20
- match?: string[] | readonly string[] | Set<string> | undefined;
21
- type: Type;
22
- }
23
- export type CSSToken = CSSKeywordToken | CSSFunctionToken | CSSHexHashToken | CSSLiteralToken | CSSNumberToken;
24
- export interface CSSTokenReader {
25
- pull<Type extends CSSToken["type"]>(...matchers: (Type | CSSTokenReaderMatcher<Type>)[]): CSSColorToken<Type> & CSSToken | undefined;
26
- }
27
- /**
28
- * Minimal CSS pull parser, which only supports the happy-path
29
- * tokens expected in a CSS color expression. Does not support
30
- * anywhere near the full CSS Colors spec, but it'll do in a pinch.
31
- * @see {@link https://www.w3.org/TR/css-color-4/ | CSS Color Level 4}
32
- */
33
- export declare const readFromCSS: (text: string) => CSSTokenReader;
34
- //# sourceMappingURL=tokenizer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../../src/packages/css/tokenizer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IAC1D,IAAI,EAAE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa,CAAC,SAAS,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa,CAAC,KAAK,CAAC;IAC5D,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa,CAAC,SAAS,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa,CAAC,UAAU,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAe,SAAQ,aAAa,CAAC,QAAQ,CAAC;IAC9D,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB,CAAC,IAAI,SAAS,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IACtF,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/D,IAAI,EAAE,IAAI,CAAC;CACX;AAED,MAAM,MAAM,QAAQ,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,GAAG,eAAe,GAAG,cAAc,CAAC;AAE/G,MAAM,WAAW,cAAc;IAC9B,IAAI,CAAC,IAAI,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;CACrI;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,SACjB,MAAM,KACV,cA4DF,CAAC"}
package/tokenizer.mjs DELETED
@@ -1,68 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
- import { CSSError } from "./css-error.mjs";
4
- const readFromCSS = /* @__PURE__ */ __name((text) => {
5
- let remain = text.trim();
6
- const done = /* @__PURE__ */ __name(() => remain.length === 0, "done");
7
- return {
8
- pull(...matchers) {
9
- if (done()) {
10
- return void 0;
11
- }
12
- for (const matcherOrType of matchers) {
13
- const matcher = typeof matcherOrType === "string" ? { type: matcherOrType } : matcherOrType;
14
- const { type, match } = matcher;
15
- let pattern;
16
- let builder;
17
- const matchSet = match == null ? /* @__PURE__ */ new Set() : match instanceof Set ? match : typeof match === "string" ? new Set(match) : new Set(match);
18
- switch (type) {
19
- case "number": {
20
- pattern = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?/;
21
- builder = /* @__PURE__ */ __name((f) => ({ type: "number", value: parseFloat(f) }), "builder");
22
- break;
23
- }
24
- case "function": {
25
- pattern = /^(\w+)\(/;
26
- builder = /* @__PURE__ */ __name((name) => ({ name, type: "function" }), "builder");
27
- break;
28
- }
29
- case "hex": {
30
- pattern = /^#[a-fA-F0-9]+/;
31
- builder = /* @__PURE__ */ __name((hex) => ({ hex, type: "hex" }), "builder");
32
- break;
33
- }
34
- case "keyword": {
35
- pattern = new RegExp("^\\p{ID_Start}[-\\p{ID_Continue}]*", "u");
36
- builder = /* @__PURE__ */ __name((keyword) => ({ keyword, type: "keyword" }), "builder");
37
- break;
38
- }
39
- case "literal": {
40
- if (matchSet.size == 0) {
41
- throw new CSSError(text, { expected: "match[]", message: "Unspecified literal" });
42
- }
43
- pattern = new RegExp("^".concat(Array.from(matchSet).map((t) => t.replace(/([\\()[\].^${}])/g, "\\$1")).join("|")));
44
- builder = /* @__PURE__ */ __name((literal) => ({ literal, type: "literal" }), "builder");
45
- break;
46
- }
47
- default: {
48
- throw new CSSError(type, { expected: "type", message: `Unknown token type: ${type}` });
49
- }
50
- }
51
- const peek = pattern.exec(remain);
52
- if (peek != null) {
53
- let remove = peek[0];
54
- let matched = peek[1] ?? peek[0];
55
- if (matchSet.has(matched) || matchSet.size === 0) {
56
- remain = remain.substring(remove.length).trim();
57
- return builder(matched);
58
- }
59
- }
60
- }
61
- return void 0;
62
- }
63
- };
64
- }, "readFromCSS");
65
- export {
66
- readFromCSS
67
- };
68
- //# sourceMappingURL=tokenizer.mjs.map
package/tokenizer.mjs.map DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/packages/css/tokenizer.ts"],
4
- "mappings": ";;AAAA,SAAS,gBAAgB;AA2ClB,MAAM,cAAc,wBAC1B,SACoB;AACpB,MAAI,SAAS,KAAK,KAAK;AACvB,QAAM,OAAO,6BAAM,OAAO,WAAW,GAAxB;AACb,SAAO;AAAA,IACN,QAAuC,UAA8F;AACpI,UAAI,KAAK,GAAG;AACX,eAAO;AAAA,MACR;AACA,iBAAW,iBAAiB,UAAU;AACrC,cAAM,UAAU,OAAO,kBAAkB,WAAW,EAAE,MAAM,cAAc,IAAI;AAC9E,cAAM,EAAE,MAAM,MAAM,IAAI;AACxB,YAAI;AACJ,YAAI;AACJ,cAAM,WAAW,SAAS,OAAO,oBAAI,IAAY,IAAI,iBAAiB,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,IAAY,KAAK,IAAI,IAAI,IAAY,KAAK;AAC9J,gBAAQ,MAAM;AAAA,UACb,KAAK,UAAU;AACd,sBAAU;AACV,sBAAU,wBAAC,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,CAAC,EAAE,IAA/C;AACV;AAAA,UACD;AAAA,UACA,KAAK,YAAY;AAChB,sBAAU;AACV,sBAAU,wBAAC,UAAU,EAAE,MAAM,MAAM,WAAW,IAApC;AACV;AAAA,UACD;AAAA,UACA,KAAK,OAAO;AACX,sBAAU;AACV,sBAAU,wBAAC,SAAS,EAAE,KAAK,MAAM,MAAM,IAA7B;AACV;AAAA,UACD;AAAA,UACA,KAAK,WAAW;AACf,sBAAU,WAAC,sCAAiC,GAAC;AAC7C,sBAAU,wBAAC,aAAa,EAAE,SAAS,MAAM,UAAU,IAAzC;AACV;AAAA,UACD;AAAA,UACA,KAAK,WAAW;AACf,gBAAI,SAAS,QAAQ,GAAG;AACvB,oBAAM,IAAI,SAAS,MAAM,EAAE,UAAU,WAAW,SAAS,sBAAsB,CAAC;AAAA,YACjF;AACA,sBAAU,IAAI,OAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,qBAAqB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AAClH,sBAAU,wBAAC,aAAa,EAAE,SAAS,MAAM,UAAU,IAAzC;AACV;AAAA,UACD;AAAA,UACA,SAAS;AACR,kBAAM,IAAI,SAAS,MAAM,EAAE,UAAU,QAAQ,SAAS,uBAAwB,IAAK,GAAG,CAAC;AAAA,UACxF;AAAA,QACD;AACA,cAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,YAAI,QAAQ,MAAM;AACjB,cAAI,SAAS,KAAM,CAAE;AACrB,cAAI,UAAU,KAAM,CAAE,KAAK,KAAM,CAAE;AACnC,cAAI,SAAS,IAAI,OAAO,KAAK,SAAS,SAAS,GAAG;AACjD,qBAAS,OAAO,UAAU,OAAO,MAAM,EAAE,KAAK;AAC9C,mBAAO,QAAQ,OAAO;AAAA,UACvB;AAAA,QACD;AAAA,MACD;AACA,aAAO;AAAA,IACR;AAAA,EACD;AACD,GA9D2B;",
5
- "names": []
6
- }