@rickosborne/css 2025.2.16
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 +736 -0
- package/angle.cjs +57 -0
- package/angle.cjs.map +6 -0
- package/angle.d.ts +16 -0
- package/angle.d.ts.map +1 -0
- package/angle.mjs +38 -0
- package/angle.mjs.map +6 -0
- package/color-parser.cjs +132 -0
- package/color-parser.cjs.map +6 -0
- package/color-parser.d.ts +28 -0
- package/color-parser.d.ts.map +1 -0
- package/color-parser.mjs +113 -0
- package/color-parser.mjs.map +6 -0
- package/colors.cjs +269 -0
- package/colors.cjs.map +6 -0
- package/colors.d.ts +193 -0
- package/colors.d.ts.map +1 -0
- package/colors.mjs +250 -0
- package/colors.mjs.map +6 -0
- package/css-error.cjs +39 -0
- package/css-error.cjs.map +6 -0
- package/css-error.d.ts +13 -0
- package/css-error.d.ts.map +1 -0
- package/css-error.mjs +20 -0
- package/css-error.mjs.map +6 -0
- package/distance.cjs +66 -0
- package/distance.cjs.map +6 -0
- package/distance.d.ts +37 -0
- package/distance.d.ts.map +1 -0
- package/distance.mjs +47 -0
- package/distance.mjs.map +6 -0
- package/format.cjs +78 -0
- package/format.cjs.map +6 -0
- package/format.d.ts +18 -0
- package/format.d.ts.map +1 -0
- package/format.mjs +59 -0
- package/format.mjs.map +6 -0
- package/href.cjs +37 -0
- package/href.cjs.map +6 -0
- package/href.d.ts +29 -0
- package/href.d.ts.map +1 -0
- package/href.mjs +17 -0
- package/href.mjs.map +6 -0
- package/index.cjs +27 -0
- package/index.cjs.map +6 -0
- package/index.d.ts +10 -0
- package/index.d.ts.map +1 -0
- package/index.mjs +10 -0
- package/index.mjs.map +6 -0
- package/package.json +114 -0
- package/tokenizer.cjs +87 -0
- package/tokenizer.cjs.map +6 -0
- package/tokenizer.d.ts +34 -0
- package/tokenizer.d.ts.map +1 -0
- package/tokenizer.mjs +68 -0
- package/tokenizer.mjs.map +6 -0
- package/units.cjs +68 -0
- package/units.cjs.map +6 -0
- package/units.d.ts +15 -0
- package/units.d.ts.map +1 -0
- package/units.mjs +49 -0
- package/units.mjs.map +6 -0
package/angle.cjs
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
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 angle_exports = {};
|
|
21
|
+
__export(angle_exports, {
|
|
22
|
+
ANGLE_CONVERSIONS: () => ANGLE_CONVERSIONS,
|
|
23
|
+
ANGLE_UNITS: () => ANGLE_UNITS,
|
|
24
|
+
angle01FromCSS: () => angle01FromCSS,
|
|
25
|
+
isAngleUnit: () => isAngleUnit
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(angle_exports);
|
|
28
|
+
var import_css_error = require("./css-error.cjs");
|
|
29
|
+
var import_href = require("./href.cjs");
|
|
30
|
+
var import_units = require("./units.cjs");
|
|
31
|
+
const ANGLE_UNITS = Object.freeze(["deg", "grad", "rad", "turn", "%"]);
|
|
32
|
+
let angleUnitsSet;
|
|
33
|
+
const isAngleUnit = /* @__PURE__ */ __name((obj) => {
|
|
34
|
+
if (typeof obj !== "string") {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
angleUnitsSet ??= new Set(ANGLE_UNITS);
|
|
38
|
+
return angleUnitsSet.has(obj);
|
|
39
|
+
}, "isAngleUnit");
|
|
40
|
+
const ANGLE_CONVERSIONS = Object.freeze({
|
|
41
|
+
"%": 100,
|
|
42
|
+
deg: 360,
|
|
43
|
+
grad: 400,
|
|
44
|
+
rad: Math.PI * 2,
|
|
45
|
+
turn: 1
|
|
46
|
+
});
|
|
47
|
+
const angle01FromCSS = /* @__PURE__ */ __name((text, defaultUnit = "deg") => {
|
|
48
|
+
if (text == null) {
|
|
49
|
+
return void 0;
|
|
50
|
+
}
|
|
51
|
+
const [value, unit = defaultUnit] = (0, import_units.dimensionFromCSS)(text);
|
|
52
|
+
if (!(unit in ANGLE_CONVERSIONS)) {
|
|
53
|
+
throw new import_css_error.CSSError(text, { expected: "Angle", href: import_href.HREF_ANGLE, message: `Unknown CSS angle unit: ${unit}` });
|
|
54
|
+
}
|
|
55
|
+
return (0, import_units.convertBetweenUnits)(value, unit, "turn", ANGLE_CONVERSIONS);
|
|
56
|
+
}, "angle01FromCSS");
|
|
57
|
+
//# sourceMappingURL=angle.cjs.map
|
package/angle.cjs.map
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/packages/css/angle.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAyB;AACzB,kBAA2B;AAC3B,mBAAsD;AAW/C,MAAM,cAAwC,OAAO,OAAO,CAAE,OAAO,QAAQ,OAAO,QAAQ,GAAI,CAAC;AACxG,IAAI;AAKG,MAAM,cAAc,wBAAC,QAAsC;AACjE,MAAI,OAAO,QAAQ,UAAU;AAC5B,WAAO;AAAA,EACR;AACA,oBAAkB,IAAI,IAAI,WAAW;AACrC,SAAO,cAAc,IAAI,GAAmB;AAC7C,GAN2B;AAQpB,MAAM,oBAA4D,OAAO,OAAO;AAAA,EACtF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK,KAAK,KAAK;AAAA,EACf,MAAM;AACP,CAAC;AAEM,MAAM,iBAAiB,wBAAC,MAA0B,cAA4B,UAA8B;AAClH,MAAI,QAAQ,MAAM;AACjB,WAAO;AAAA,EACR;AACA,QAAM,CAAE,OAAO,OAAO,WAAY,QAAI,+BAAiB,IAAI;AAC3D,MAAI,EAAE,QAAQ,oBAAoB;AACjC,UAAM,IAAI,0BAAS,MAAM,EAAE,UAAU,SAAS,MAAM,wBAAY,SAAS,2BAA4B,IAAK,GAAG,CAAC;AAAA,EAC/G;AACA,aAAO,kCAA0C,OAAO,MAAsB,QAAQ,iBAAiB;AACxG,GAT8B;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/angle.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit for a CSS angle.
|
|
3
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/angle | CSS angle on MDN}
|
|
4
|
+
*/
|
|
5
|
+
export type CSSAngleUnit = "%" | "deg" | "grad" | "rad" | "turn";
|
|
6
|
+
/**
|
|
7
|
+
* List of {@link CSSAngleUnit}.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ANGLE_UNITS: Readonly<CSSAngleUnit[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Type guard for {@link CSSAngleUnit}.
|
|
12
|
+
*/
|
|
13
|
+
export declare const isAngleUnit: (obj: unknown) => obj is CSSAngleUnit;
|
|
14
|
+
export declare const ANGLE_CONVERSIONS: Readonly<Record<CSSAngleUnit, number>>;
|
|
15
|
+
export declare const angle01FromCSS: (text: string | undefined, defaultUnit?: CSSAngleUnit) => number | undefined;
|
|
16
|
+
//# sourceMappingURL=angle.d.ts.map
|
package/angle.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angle.d.ts","sourceRoot":"","sources":["../../../src/packages/css/angle.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAwD,CAAC;AAG1G;;GAEG;AACH,eAAO,MAAM,WAAW,QAAS,OAAO,KAAG,GAAG,IAAI,YAMjD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAMnE,CAAC;AAEH,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,SAAS,gBAAe,YAAY,KAAW,MAAM,GAAG,SASrG,CAAC"}
|
package/angle.mjs
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { CSSError } from "./css-error.mjs";
|
|
4
|
+
import { HREF_ANGLE } from "./href.mjs";
|
|
5
|
+
import { convertBetweenUnits, dimensionFromCSS } from "./units.mjs";
|
|
6
|
+
const ANGLE_UNITS = Object.freeze(["deg", "grad", "rad", "turn", "%"]);
|
|
7
|
+
let angleUnitsSet;
|
|
8
|
+
const isAngleUnit = /* @__PURE__ */ __name((obj) => {
|
|
9
|
+
if (typeof obj !== "string") {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
angleUnitsSet ??= new Set(ANGLE_UNITS);
|
|
13
|
+
return angleUnitsSet.has(obj);
|
|
14
|
+
}, "isAngleUnit");
|
|
15
|
+
const ANGLE_CONVERSIONS = Object.freeze({
|
|
16
|
+
"%": 100,
|
|
17
|
+
deg: 360,
|
|
18
|
+
grad: 400,
|
|
19
|
+
rad: Math.PI * 2,
|
|
20
|
+
turn: 1
|
|
21
|
+
});
|
|
22
|
+
const angle01FromCSS = /* @__PURE__ */ __name((text, defaultUnit = "deg") => {
|
|
23
|
+
if (text == null) {
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
const [value, unit = defaultUnit] = dimensionFromCSS(text);
|
|
27
|
+
if (!(unit in ANGLE_CONVERSIONS)) {
|
|
28
|
+
throw new CSSError(text, { expected: "Angle", href: HREF_ANGLE, message: `Unknown CSS angle unit: ${unit}` });
|
|
29
|
+
}
|
|
30
|
+
return convertBetweenUnits(value, unit, "turn", ANGLE_CONVERSIONS);
|
|
31
|
+
}, "angle01FromCSS");
|
|
32
|
+
export {
|
|
33
|
+
ANGLE_CONVERSIONS,
|
|
34
|
+
ANGLE_UNITS,
|
|
35
|
+
angle01FromCSS,
|
|
36
|
+
isAngleUnit
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=angle.mjs.map
|
package/angle.mjs.map
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/packages/css/angle.ts"],
|
|
4
|
+
"mappings": ";;AAAA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB,wBAAwB;AAW/C,MAAM,cAAwC,OAAO,OAAO,CAAE,OAAO,QAAQ,OAAO,QAAQ,GAAI,CAAC;AACxG,IAAI;AAKG,MAAM,cAAc,wBAAC,QAAsC;AACjE,MAAI,OAAO,QAAQ,UAAU;AAC5B,WAAO;AAAA,EACR;AACA,oBAAkB,IAAI,IAAI,WAAW;AACrC,SAAO,cAAc,IAAI,GAAmB;AAC7C,GAN2B;AAQpB,MAAM,oBAA4D,OAAO,OAAO;AAAA,EACtF,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK,KAAK,KAAK;AAAA,EACf,MAAM;AACP,CAAC;AAEM,MAAM,iBAAiB,wBAAC,MAA0B,cAA4B,UAA8B;AAClH,MAAI,QAAQ,MAAM;AACjB,WAAO;AAAA,EACR;AACA,QAAM,CAAE,OAAO,OAAO,WAAY,IAAI,iBAAiB,IAAI;AAC3D,MAAI,EAAE,QAAQ,oBAAoB;AACjC,UAAM,IAAI,SAAS,MAAM,EAAE,UAAU,SAAS,MAAM,YAAY,SAAS,2BAA4B,IAAK,GAAG,CAAC;AAAA,EAC/G;AACA,SAAO,oBAA0C,OAAO,MAAsB,QAAQ,iBAAiB;AACxG,GAT8B;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/color-parser.cjs
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
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 color_parser_exports = {};
|
|
21
|
+
__export(color_parser_exports, {
|
|
22
|
+
COLOR_FUNCTIONS: () => COLOR_FUNCTIONS,
|
|
23
|
+
colorTokensFromCSS: () => colorTokensFromCSS
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(color_parser_exports);
|
|
26
|
+
var import_colors = require("./colors.cjs");
|
|
27
|
+
var import_css_error = require("./css-error.cjs");
|
|
28
|
+
var import_href = require("./href.cjs");
|
|
29
|
+
var import_tokenizer = require("./tokenizer.cjs");
|
|
30
|
+
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;
|
|
34
|
+
}
|
|
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);
|
|
48
|
+
if (name == null) {
|
|
49
|
+
throw new import_css_error.CSSError(text, { expected: "Color name", href: import_href.HREF_COLOR, message: `Unknown keyword: ${keyword}` });
|
|
50
|
+
}
|
|
51
|
+
return { name };
|
|
52
|
+
}
|
|
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 });
|
|
67
|
+
}
|
|
68
|
+
space = spaceKw.keyword;
|
|
69
|
+
}
|
|
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" });
|
|
77
|
+
}
|
|
78
|
+
if (components.length >= 3) {
|
|
79
|
+
const paren = reader.pull({ match: [")"], type: "literal" });
|
|
80
|
+
if (paren != null) {
|
|
81
|
+
functionDone = true;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}, "breakAfterNumber");
|
|
87
|
+
while (!functionDone) {
|
|
88
|
+
if (components.length >= 4) {
|
|
89
|
+
return fail(`Malformed ${functionName}() color`);
|
|
90
|
+
}
|
|
91
|
+
const token = reader.pull(
|
|
92
|
+
"number",
|
|
93
|
+
{ match: ["none"], type: "keyword" }
|
|
94
|
+
);
|
|
95
|
+
if (token == null) {
|
|
96
|
+
return fail(`Malformed ${functionName}() color`);
|
|
97
|
+
}
|
|
98
|
+
if (token.type === "keyword") {
|
|
99
|
+
if (token.keyword === "none") {
|
|
100
|
+
components.push([0, void 0]);
|
|
101
|
+
if (breakAfterNumber()) {
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
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
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
components,
|
|
128
|
+
functionName,
|
|
129
|
+
...space == null ? {} : { space }
|
|
130
|
+
};
|
|
131
|
+
}, "colorTokensFromCSS");
|
|
132
|
+
//# sourceMappingURL=color-parser.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/packages/css/color-parser.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CSSColorName } from "./colors.js";
|
|
2
|
+
import type { DimensionPair } from "./units.js";
|
|
3
|
+
export interface HexColorToken {
|
|
4
|
+
components?: never;
|
|
5
|
+
functionName?: never;
|
|
6
|
+
hex: string;
|
|
7
|
+
name?: never;
|
|
8
|
+
space?: never;
|
|
9
|
+
}
|
|
10
|
+
export interface NameColorToken {
|
|
11
|
+
components?: never;
|
|
12
|
+
functionName?: never;
|
|
13
|
+
hex?: never;
|
|
14
|
+
name: CSSColorName;
|
|
15
|
+
space?: never;
|
|
16
|
+
}
|
|
17
|
+
export interface FunctionColorToken {
|
|
18
|
+
components: DimensionPair[];
|
|
19
|
+
functionName: string;
|
|
20
|
+
hex?: never;
|
|
21
|
+
name?: never;
|
|
22
|
+
space?: string | undefined;
|
|
23
|
+
}
|
|
24
|
+
export type CSSColorTokens = NameColorToken | HexColorToken | FunctionColorToken;
|
|
25
|
+
export type CSSColorFunction = "color" | "rgb" | "rgba" | "hsl" | "hsla" | "hwb";
|
|
26
|
+
export declare const COLOR_FUNCTIONS: Readonly<CSSColorFunction[]>;
|
|
27
|
+
export declare const colorTokensFromCSS: (text: string) => CSSColorTokens | undefined;
|
|
28
|
+
//# sourceMappingURL=color-parser.d.ts.map
|
|
@@ -0,0 +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"}
|
package/color-parser.mjs
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { toCSSColorName } from "./colors.mjs";
|
|
4
|
+
import { CSSError } from "./css-error.mjs";
|
|
5
|
+
import { HREF_COLOR, HREF_COLOR_FN } from "./href.mjs";
|
|
6
|
+
import { readFromCSS } from "./tokenizer.mjs";
|
|
7
|
+
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;
|
|
11
|
+
}
|
|
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);
|
|
25
|
+
if (name == null) {
|
|
26
|
+
throw new CSSError(text, { expected: "Color name", href: HREF_COLOR, message: `Unknown keyword: ${keyword}` });
|
|
27
|
+
}
|
|
28
|
+
return { name };
|
|
29
|
+
}
|
|
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 });
|
|
44
|
+
}
|
|
45
|
+
space = spaceKw.keyword;
|
|
46
|
+
}
|
|
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" });
|
|
54
|
+
}
|
|
55
|
+
if (components.length >= 3) {
|
|
56
|
+
const paren = reader.pull({ match: [")"], type: "literal" });
|
|
57
|
+
if (paren != null) {
|
|
58
|
+
functionDone = true;
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}, "breakAfterNumber");
|
|
64
|
+
while (!functionDone) {
|
|
65
|
+
if (components.length >= 4) {
|
|
66
|
+
return fail(`Malformed ${functionName}() color`);
|
|
67
|
+
}
|
|
68
|
+
const token = reader.pull(
|
|
69
|
+
"number",
|
|
70
|
+
{ match: ["none"], type: "keyword" }
|
|
71
|
+
);
|
|
72
|
+
if (token == null) {
|
|
73
|
+
return fail(`Malformed ${functionName}() color`);
|
|
74
|
+
}
|
|
75
|
+
if (token.type === "keyword") {
|
|
76
|
+
if (token.keyword === "none") {
|
|
77
|
+
components.push([0, void 0]);
|
|
78
|
+
if (breakAfterNumber()) {
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
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
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
components,
|
|
105
|
+
functionName,
|
|
106
|
+
...space == null ? {} : { space }
|
|
107
|
+
};
|
|
108
|
+
}, "colorTokensFromCSS");
|
|
109
|
+
export {
|
|
110
|
+
COLOR_FUNCTIONS,
|
|
111
|
+
colorTokensFromCSS
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=color-parser.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/packages/css/color-parser.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|