aboutsummaryrefslogtreecommitdiffstats
path: root/vanilla/node_modules/@csstools
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-13 21:34:48 -0800
committerAdam Mathes <adam@adammathes.com>2026-02-13 21:34:48 -0800
commit76cb9c2a39d477a64824a985ade40507e3bbade1 (patch)
tree41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/@csstools
parent819a39a21ac992b1393244a4c283bbb125208c69 (diff)
downloadneko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz
neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2
neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/@csstools')
-rw-r--r--vanilla/node_modules/@csstools/color-helpers/CHANGELOG.md16
-rw-r--r--vanilla/node_modules/@csstools/color-helpers/LICENSE.md18
-rw-r--r--vanilla/node_modules/@csstools/color-helpers/README.md32
-rw-r--r--vanilla/node_modules/@csstools/color-helpers/dist/index.d.ts429
-rw-r--r--vanilla/node_modules/@csstools/color-helpers/dist/index.mjs263
-rw-r--r--vanilla/node_modules/@csstools/color-helpers/package.json55
-rw-r--r--vanilla/node_modules/@csstools/css-calc/CHANGELOG.md9
-rw-r--r--vanilla/node_modules/@csstools/css-calc/LICENSE.md20
-rw-r--r--vanilla/node_modules/@csstools/css-calc/README.md132
-rw-r--r--vanilla/node_modules/@csstools/css-calc/dist/index.d.ts101
-rw-r--r--vanilla/node_modules/@csstools/css-calc/dist/index.mjs1
-rw-r--r--vanilla/node_modules/@csstools/css-calc/package.json59
-rw-r--r--vanilla/node_modules/@csstools/css-color-parser/CHANGELOG.md9
-rw-r--r--vanilla/node_modules/@csstools/css-color-parser/LICENSE.md20
-rw-r--r--vanilla/node_modules/@csstools/css-color-parser/README.md37
-rw-r--r--vanilla/node_modules/@csstools/css-color-parser/dist/index.d.ts168
-rw-r--r--vanilla/node_modules/@csstools/css-color-parser/dist/index.mjs1
-rw-r--r--vanilla/node_modules/@csstools/css-color-parser/package.json64
-rw-r--r--vanilla/node_modules/@csstools/css-parser-algorithms/CHANGELOG.md11
-rw-r--r--vanilla/node_modules/@csstools/css-parser-algorithms/LICENSE.md20
-rw-r--r--vanilla/node_modules/@csstools/css-parser-algorithms/README.md119
-rw-r--r--vanilla/node_modules/@csstools/css-parser-algorithms/dist/index.d.ts604
-rw-r--r--vanilla/node_modules/@csstools/css-parser-algorithms/dist/index.mjs1
-rw-r--r--vanilla/node_modules/@csstools/css-parser-algorithms/package.json58
-rw-r--r--vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/CHANGELOG.md9
-rw-r--r--vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/LICENSE.md18
-rw-r--r--vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/README.md43
-rw-r--r--vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/dist/index.d.ts5
-rw-r--r--vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/dist/index.json913
-rw-r--r--vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/package.json48
-rw-r--r--vanilla/node_modules/@csstools/css-tokenizer/CHANGELOG.md10
-rw-r--r--vanilla/node_modules/@csstools/css-tokenizer/LICENSE.md20
-rw-r--r--vanilla/node_modules/@csstools/css-tokenizer/README.md111
-rw-r--r--vanilla/node_modules/@csstools/css-tokenizer/dist/index.d.ts593
-rw-r--r--vanilla/node_modules/@csstools/css-tokenizer/dist/index.mjs1
-rw-r--r--vanilla/node_modules/@csstools/css-tokenizer/package.json55
36 files changed, 4073 insertions, 0 deletions
diff --git a/vanilla/node_modules/@csstools/color-helpers/CHANGELOG.md b/vanilla/node_modules/@csstools/color-helpers/CHANGELOG.md
new file mode 100644
index 0000000..4ddee56
--- /dev/null
+++ b/vanilla/node_modules/@csstools/color-helpers/CHANGELOG.md
@@ -0,0 +1,16 @@
+# Changes to Color Helpers
+
+### 6.0.1
+
+_January 25, 2026_
+
+- Match latest changes made in `csswg-drafts` for:
+ - `gam_2020`
+ - `Lab_to_LCH`
+ - `lin_2020`
+ - `OKLab_to_OKLCH`
+ - `sRGB_to_HSL`
+ - `XYZ_D50_to_HWB`
+
+
+[Full CHANGELOG](https://github.com/csstools/postcss-plugins/tree/main/packages/color-helpers/CHANGELOG.md)
diff --git a/vanilla/node_modules/@csstools/color-helpers/LICENSE.md b/vanilla/node_modules/@csstools/color-helpers/LICENSE.md
new file mode 100644
index 0000000..e8ae93b
--- /dev/null
+++ b/vanilla/node_modules/@csstools/color-helpers/LICENSE.md
@@ -0,0 +1,18 @@
+MIT No Attribution (MIT-0)
+
+Copyright © CSSTools Contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the “Software”), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vanilla/node_modules/@csstools/color-helpers/README.md b/vanilla/node_modules/@csstools/color-helpers/README.md
new file mode 100644
index 0000000..97528d0
--- /dev/null
+++ b/vanilla/node_modules/@csstools/color-helpers/README.md
@@ -0,0 +1,32 @@
+# Color Helpers <img src="https://cssdb.org/images/css.svg" alt="for CSS" width="90" height="90" align="right">
+
+[<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/color-helpers.svg" height="20">][npm-url]
+[<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/actions/workflows/test.yml/badge.svg?branch=main" height="20">][cli-url]
+[<img alt="Discord" src="https://shields.io/badge/Discord-5865F2?logo=discord&logoColor=white">][discord]
+
+## Usage
+
+Add [Color Helpers] to your project:
+
+```bash
+npm install @csstools/color-helpers --save-dev
+```
+
+This package exists to join all the different color functions scattered among the Colors 4 and Colors 5 plugins we maintain such as:
+
+* [PostCSS Color Function]
+* [PostCSS Lab Function]
+* [PostCSS OKLab Function]
+
+## Copyright
+
+This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/tree/main/css-color-4. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+
+[cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
+[discord]: https://discord.gg/bUadyRwkJS
+[npm-url]: https://www.npmjs.com/package/@csstools/color-helpers
+
+[Color Helpers]: https://github.com/csstools/postcss-plugins/tree/main/packages/color-helpers
+[PostCSS Color Function]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-color-function
+[PostCSS Lab Function]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-lab-functionw
+[PostCSS OKLab Function]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-oklab-function
diff --git a/vanilla/node_modules/@csstools/color-helpers/dist/index.d.ts b/vanilla/node_modules/@csstools/color-helpers/dist/index.d.ts
new file mode 100644
index 0000000..2eb948c
--- /dev/null
+++ b/vanilla/node_modules/@csstools/color-helpers/dist/index.d.ts
@@ -0,0 +1,429 @@
+/**
+ * @param {Color} color [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function a98_RGB_to_XYZ_D50(x: Color): Color;
+
+export declare function clip(color: Color): Color;
+
+export declare type Color = [number, number, number];
+
+/**
+ * WCAG 2.1 contrast ratio
+ */
+export declare function contrast_ratio_wcag_2_1(color1: Color, color2: Color): number;
+
+/**
+ * Convert an array of linear-light display-p3 RGB in the range 0.0-1.0
+ * to gamma corrected form
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */
+export declare function gam_P3(RGB: Color): Color;
+
+/**
+ * Convert an array of linear-light sRGB values in the range 0.0-1.0 to gamma corrected form
+ * Extended transfer function:
+ * For negative values, linear portion extends on reflection
+ * of axis, then uses reflected pow below that
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://en.wikipedia.org/wiki/SRGB
+ */
+export declare function gam_sRGB(RGB: Color): Color;
+
+/**
+ * @param {Color} color [h, s, l]
+ * - Hue as degrees 0..360;
+ * - Saturation as number 0..100;
+ * - Lightness as number 0..100;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function HSL_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @param {Color} color [h, w, b]
+ * - Hue as degrees 0..360;
+ * - Whiteness as number 0..100;
+ * - Blackness as number 0..100;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function HWB_to_XYZ_D50(x: Color): Color;
+
+export declare function inGamut(x: Color): boolean;
+
+/**
+ * @param {Color} color [l, a, b]
+ * - Lightness as number 0..100;
+ * - a as number -160..160;
+ * - b as number -160..160;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function Lab_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @param {Color} color [l, c, h]
+ * - Lightness as number 0..100;
+ * - Chroma as number 0..230;
+ * - Hue as degrees 0..360;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function LCH_to_XYZ_D50(x: Color): Color;
+
+/**
+ * Convert an array of display-p3 RGB values in the range 0.0 - 1.0
+ * to linear light (un-companded) form.
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */
+export declare function lin_P3(RGB: Color): Color;
+
+/**
+ * Convert an array of linear-light display-p3 values to CIE XYZ
+ * using D65 (no chromatic adaptation)
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
+ */
+export declare function lin_P3_to_XYZ(rgb: Color): Color;
+
+/**
+ * @param {Color} color [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function lin_P3_to_XYZ_D50(x: Color): Color;
+
+/**
+ * Convert an array of of sRGB values where in-gamut values are in the range
+ * [0 - 1] to linear light (un-companded) form.
+ * Extended transfer function:
+ * For negative values, linear portion is extended on reflection of axis,
+ * then reflected power function is used.
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://en.wikipedia.org/wiki/SRGB
+ */
+export declare function lin_sRGB(RGB: Color): Color;
+
+/**
+ * Convert an array of linear-light sRGB values to CIE XYZ
+ * using sRGB's own white, D65 (no chromatic adaptation)
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */
+export declare function lin_sRGB_to_XYZ(rgb: Color): Color;
+
+/**
+ * @param {Color} color [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function lin_sRGB_to_XYZ_D50(x: Color): Color;
+
+export declare function mapGamut(startOKLCH: Color, toDestination: (x: Color) => Color, fromDestination: (x: Color) => Color): Color;
+
+/**
+ * @license MIT https://github.com/facelessuser/coloraide/blob/main/LICENSE.md
+ */
+export declare function mapGamutRayTrace(startOKLCH: Color, toLinear: (x: Color) => Color, fromLinear: (x: Color) => Color): Color;
+
+export declare const namedColors: Record<string, Color>;
+
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js
+ */
+export declare function OKLab_to_OKLCH(OKLab: Color): Color;
+
+/**
+ * Given OKLab, convert to XYZ relative to D65
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js
+ */
+export declare function OKLab_to_XYZ(OKLab: Color): Color;
+
+/**
+ * @param {Color} color [l, a, b]
+ * - Lightness as number 0..1;
+ * - a as number 0..0.5;
+ * - b as number 0..0.5;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function OKLab_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js
+ */
+export declare function OKLCH_to_OKLab(OKLCH: Color): Color;
+
+/**
+ * @param {Color} color [l, c, h]
+ * - Lightness as number 0..1;
+ * - Chroma as number 0..0.5;
+ * - Hue as degrees 0..360;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function OKLCH_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @param {Color} color [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function P3_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @param {Color} color [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function ProPhoto_RGB_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @param {Color} color [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function rec_2020_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @param {Color} color [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function sRGB_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} a98 sRGB [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ */
+export declare function XYZ_D50_to_a98_RGB(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} HSL [r, g, b]
+ * - Hue as degrees 0..360;
+ * - Saturation as number 0..100;
+ * - Lightness as number 0..100;
+ */
+export declare function XYZ_D50_to_HSL(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} HWB [r, g, b]
+ * - Hue as degrees 0..360;
+ * - Whiteness as number 0..100;
+ * - Blackness as number 0..100;
+ */
+export declare function XYZ_D50_to_HWB(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} Lab [r, g, b]
+ * - Lightness as number 0..100;
+ * - a as number -160..160;
+ * - b as number -160..160;
+ */
+export declare function XYZ_D50_to_Lab(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} LCH [r, g, b]
+ * - Lightness as number 0..100;
+ * - Chroma as number 0..230;
+ * - Hue as degrees 0..360;
+ */
+export declare function XYZ_D50_to_LCH(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} P3 [r, g, b]
+ * - R as number 0..1;
+ * - G as number 0..1;
+ * - B as number 0..1;
+ */
+export declare function XYZ_D50_to_lin_P3(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} linear sRGB [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ */
+export declare function XYZ_D50_to_lin_sRGB(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} OKLab [r, g, b]
+ * - Lightness as number 0..1;
+ * - a as number 0..0.5;
+ * - b as number 0..0.5;
+ */
+export declare function XYZ_D50_to_OKLab(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} OKLCH [r, g, b]
+ * - Lightness as number 0..1;
+ * - Chroma as number 0..0.5;
+ * - Hue as degrees 0..360;
+ */
+export declare function XYZ_D50_to_OKLCH(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} P3 [r, g, b]
+ * - R as number 0..1;
+ * - G as number 0..1;
+ * - B as number 0..1;
+ */
+export declare function XYZ_D50_to_P3(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} ProPhoto [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ */
+export declare function XYZ_D50_to_ProPhoto(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} rec 2020 [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ */
+export declare function XYZ_D50_to_rec_2020(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} sRGB [r, g, b]
+ * - Red as number 0..1;
+ * - Green as number 0..1;
+ * - Blue as number 0..1;
+ */
+export declare function XYZ_D50_to_sRGB(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function XYZ_D50_to_XYZ_D50(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} D65 XYZ [x, y, z]
+ */
+export declare function XYZ_D50_to_XYZ_D65(x: Color): Color;
+
+/**
+ * @param {Color} color [x, y, z]
+ * - X as number 0..1;
+ * - Y as number 0..1;
+ * - Z as number 0..1;
+ * @return {Color} D50 XYZ [x, y, z]
+ */
+export declare function XYZ_D65_to_XYZ_D50(x: Color): Color;
+
+/**
+ * Convert XYZ to linear-light P3
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */
+export declare function XYZ_to_lin_P3(XYZ: Color): Color;
+
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */
+export declare function XYZ_to_lin_sRGB(XYZ: Color): Color;
+
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ *
+ * XYZ <-> LMS matrices recalculated for consistent reference white
+ * @see https://github.com/w3c/csswg-drafts/issues/6642#issuecomment-943521484
+ */
+export declare function XYZ_to_OKLab(XYZ: Color): Color;
+
+export { }
diff --git a/vanilla/node_modules/@csstools/color-helpers/dist/index.mjs b/vanilla/node_modules/@csstools/color-helpers/dist/index.mjs
new file mode 100644
index 0000000..904e6ca
--- /dev/null
+++ b/vanilla/node_modules/@csstools/color-helpers/dist/index.mjs
@@ -0,0 +1,263 @@
+function multiplyMatrices(t,n){return[t[0]*n[0]+t[1]*n[1]+t[2]*n[2],t[3]*n[0]+t[4]*n[1]+t[5]*n[2],t[6]*n[0]+t[7]*n[1]+t[8]*n[2]]}const t=[.955473421488075,-.02309845494876471,.06325924320057072,-.0283697093338637,1.0099953980813041,.021041441191917323,.012314014864481998,-.020507649298898964,1.330365926242124];
+/**
+ * Bradford chromatic adaptation from D50 to D65
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function D50_to_D65(n){return multiplyMatrices(t,n)}const n=[1.0479297925449969,.022946870601609652,-.05019226628920524,.02962780877005599,.9904344267538799,-.017073799063418826,-.009243040646204504,.015055191490298152,.7518742814281371];
+/**
+ * Bradford chromatic adaptation from D65 to D50
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html
+ */function D65_to_D50(t){return multiplyMatrices(n,t)}
+/**
+ * @param {number} hue - Hue as degrees 0..360
+ * @param {number} sat - Saturation as percentage 0..100
+ * @param {number} light - Lightness as percentage 0..100
+ * @return {number[]} Array of sRGB components; in-gamut colors in range [0..1]
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/hslToRgb.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/hslToRgb.js
+ */function HSL_to_sRGB(t){let n=t[0]%360;const _=t[1]/100,o=t[2]/100;return n<0&&(n+=360),[HSL_to_sRGB_channel(0,n,_,o),HSL_to_sRGB_channel(8,n,_,o),HSL_to_sRGB_channel(4,n,_,o)]}function HSL_to_sRGB_channel(t,n,_,o){const e=(t+n/30)%12;return o-_*Math.min(o,1-o)*Math.max(-1,Math.min(e-3,9-e,1))}
+/**
+ * @param {number} hue - Hue as degrees 0..360
+ * @param {number} white - Whiteness as percentage 0..100
+ * @param {number} black - Blackness as percentage 0..100
+ * @return {number[]} Array of RGB components 0..1
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/hwbToRgb.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/hwbToRgb.js
+ */function HWB_to_sRGB(t){const n=t[0],_=t[1]/100,o=t[2]/100;if(_+o>=1){const t=_/(_+o);return[t,t,t]}const e=HSL_to_sRGB([n,100,50]),a=1-_-o;return[e[0]*a+_,e[1]*a+_,e[2]*a+_]}
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function LCH_to_Lab(t){const n=t[2]*Math.PI/180;return[t[0],t[1]*Math.cos(n),t[1]*Math.sin(n)]}
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function Lab_to_LCH(t){const n=Math.sqrt(Math.pow(t[1],2)+Math.pow(t[2],2));let _=180*Math.atan2(t[2],t[1])/Math.PI;return _<0&&(_+=360),n<=.0015&&(_=NaN),[t[0],n,_]}const _=[.3457/.3585,1,.2958/.3585];
+/**
+ * Convert Lab to D50-adapted XYZ
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
+ */function Lab_to_XYZ(t){const n=24389/27,o=216/24389,e=(t[0]+16)/116,a=t[1]/500+e,r=e-t[2]/200;return[(Math.pow(a,3)>o?Math.pow(a,3):(116*a-16)/n)*_[0],(t[0]>8?Math.pow((t[0]+16)/116,3):t[0]/n)*_[1],(Math.pow(r,3)>o?Math.pow(r,3):(116*r-16)/n)*_[2]]}
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js
+ */function OKLCH_to_OKLab(t){const n=t[2]*Math.PI/180;return[t[0],t[1]*Math.cos(n),t[1]*Math.sin(n)]}
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js
+ */function OKLab_to_OKLCH(t){const n=Math.sqrt(t[1]**2+t[2]**2);let _=180*Math.atan2(t[2],t[1])/Math.PI;return _<0&&(_+=360),n<=4e-6&&(_=NaN),[t[0],n,_]}const o=[1.2268798758459243,-.5578149944602171,.2813910456659647,-.0405757452148008,1.112286803280317,-.0717110580655164,-.0763729366746601,-.4214933324022432,1.5869240198367816],e=[1,.3963377773761749,.2158037573099136,1,-.1055613458156586,-.0638541728258133,1,-.0894841775298119,-1.2914855480194092];
+/**
+ * Given OKLab, convert to XYZ relative to D65
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js
+ */
+function OKLab_to_XYZ(t){const n=multiplyMatrices(e,t);return multiplyMatrices(o,[n[0]**3,n[1]**3,n[2]**3])}
+/**
+ * Assuming XYZ is relative to D50, convert to CIE Lab
+ * from CIE standard, which now defines these as a rational fraction
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function XYZ_to_Lab(t){const n=compute_f(t[0]/_[0]),o=compute_f(t[1]/_[1]);return[116*o-16,500*(n-o),200*(o-compute_f(t[2]/_[2]))]}const a=216/24389,r=24389/27;function compute_f(t){return t>a?Math.cbrt(t):(r*t+16)/116}const l=[.819022437996703,.3619062600528904,-.1288737815209879,.0329836539323885,.9292868615863434,.0361446663506424,.0481771893596242,.2642395317527308,.6335478284694309],i=[.210454268309314,.7936177747023054,-.0040720430116193,1.9779985324311684,-2.42859224204858,.450593709617411,.0259040424655478,.7827717124575296,-.8086757549230774];
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ *
+ * XYZ <-> LMS matrices recalculated for consistent reference white
+ * @see https://github.com/w3c/csswg-drafts/issues/6642#issuecomment-943521484
+ */
+function XYZ_to_OKLab(t){const n=multiplyMatrices(l,t);return multiplyMatrices(i,[Math.cbrt(n[0]),Math.cbrt(n[1]),Math.cbrt(n[2])])}const c=[30757411/17917100,-6372589/17917100,-4539589/17917100,-.666684351832489,1.616481236634939,467509/29648200,792561/44930125,-1921689/44930125,.942103121235474];
+/**
+ * Convert XYZ to linear-light rec2020
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */const u=[446124/178915,-333277/357830,-72051/178915,-14852/17905,63121/35810,423/17905,11844/330415,-50337/660830,316169/330415];
+/**
+ * Convert XYZ to linear-light P3
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function XYZ_to_lin_P3(t){return multiplyMatrices(u,t)}const s=[1.3457868816471583,-.25557208737979464,-.05110186497554526,-.5446307051249019,1.5082477428451468,.02052744743642139,0,0,1.2119675456389452];
+/**
+ * Convert D50 XYZ to linear-light prophoto-rgb
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
+ */const h=[1829569/896150,-506331/896150,-308931/896150,-851781/878810,1648619/878810,36519/878810,16779/1248040,-147721/1248040,1266979/1248040];
+/**
+ * Convert XYZ to linear-light a98-rgb
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */const m=[12831/3959,-329/214,-1974/3959,-851781/878810,1648619/878810,36519/878810,705/12673,-2585/12673,705/667];
+/**
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function XYZ_to_lin_sRGB(t){return multiplyMatrices(m,t)}
+/**
+ * Convert an array of linear-light rec2020 RGB in the range 0.0-1.0
+ * to gamma corrected form ITU-R BT.2020-2 p.4
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function gam_2020_channel(t){const n=t<0?-1:1,_=Math.abs(t);return n*Math.pow(_,1/2.4)}
+/**
+ * Convert an array of linear-light sRGB values in the range 0.0-1.0 to gamma corrected form
+ * Extended transfer function:
+ * For negative values, linear portion extends on reflection
+ * of axis, then uses reflected pow below that
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://en.wikipedia.org/wiki/SRGB
+ */function gam_sRGB(t){return[gam_sRGB_channel(t[0]),gam_sRGB_channel(t[1]),gam_sRGB_channel(t[2])]}function gam_sRGB_channel(t){const n=t<0?-1:1,_=Math.abs(t);return _>.0031308?n*(1.055*Math.pow(_,1/2.4)-.055):12.92*t}
+/**
+ * Convert an array of linear-light display-p3 RGB in the range 0.0-1.0
+ * to gamma corrected form
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function gam_P3(t){return gam_sRGB(t)}
+/**
+ * Convert an array of linear-light prophoto-rgb in the range 0.0-1.0
+ * to gamma corrected form.
+ * Transfer curve is gamma 1.8 with a small linear portion.
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */const D=1/512;function gam_ProPhoto_channel(t){const n=t<0?-1:1,_=Math.abs(t);return _>=D?n*Math.pow(_,1/1.8):16*t}
+/**
+ * Convert an array of linear-light a98-rgb in the range 0.0-1.0
+ * to gamma corrected form. Negative values are also now accepted
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function gam_a98rgb_channel(t){const n=t<0?-1:1,_=Math.abs(t);return n*Math.pow(_,256/563)}
+/**
+ * Convert an array of rec2020 RGB values in the range 0.0 - 1.0
+ * to linear light (un-companded) form.
+ * ITU-R BT.2020-2 p.4
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function lin_2020_channel(t){const n=t<0?-1:1,_=Math.abs(t);return n*Math.pow(_,2.4)}const b=[63426534/99577255,20160776/139408157,47086771/278816314,26158966/99577255,.677998071518871,8267143/139408157,0,19567812/697040785,1.0609850577107909];
+/**
+ * Convert an array of linear-light rec2020 values to CIE XYZ
+ * using D65 (no chromatic adaptation)
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
+ */
+/**
+ * Convert an array of of sRGB values where in-gamut values are in the range
+ * [0 - 1] to linear light (un-companded) form.
+ * Extended transfer function:
+ * For negative values, linear portion is extended on reflection of axis,
+ * then reflected power function is used.
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://en.wikipedia.org/wiki/SRGB
+ */
+function lin_sRGB(t){return[lin_sRGB_channel(t[0]),lin_sRGB_channel(t[1]),lin_sRGB_channel(t[2])]}function lin_sRGB_channel(t){const n=t<0?-1:1,_=Math.abs(t);return _<=.04045?t/12.92:n*Math.pow((_+.055)/1.055,2.4)}
+/**
+ * Convert an array of display-p3 RGB values in the range 0.0 - 1.0
+ * to linear light (un-companded) form.
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function lin_P3(t){return lin_sRGB(t)}const g=[608311/1250200,189793/714400,198249/1000160,35783/156275,247089/357200,198249/2500400,0,32229/714400,5220557/5000800];
+/**
+ * Convert an array of linear-light display-p3 values to CIE XYZ
+ * using D65 (no chromatic adaptation)
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
+ */function lin_P3_to_XYZ(t){return multiplyMatrices(g,t)}
+/**
+ * Convert an array of prophoto-rgb values where in-gamut Colors are in the
+ * range [0.0 - 1.0] to linear light (un-companded) form. Transfer curve is
+ * gamma 1.8 with a small linear portion. Extended transfer function
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */const X=16/512;function lin_ProPhoto_channel(t){const n=t<0?-1:1,_=Math.abs(t);return _<=X?t/16:n*Math.pow(_,1.8)}const Y=[.7977666449006423,.13518129740053308,.0313477341283922,.2880748288194013,.711835234241873,8993693872564e-17,0,0,.8251046025104602];
+/**
+ * Convert an array of linear-light prophoto-rgb values to CIE D50 XYZ.
+ * Matrix cannot be expressed in rational form, but is calculated to 64 bit accuracy.
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see see https://github.com/w3c/csswg-drafts/issues/7675
+ */function lin_a98rgb_channel(t){const n=t<0?-1:1,_=Math.abs(t);return n*Math.pow(_,563/256)}const Z=[573536/994567,263643/1420810,187206/994567,591459/1989134,6239551/9945670,374412/4972835,53769/1989134,351524/4972835,4929758/4972835];
+/**
+ * Convert an array of linear-light a98-rgb values to CIE XYZ
+ * http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
+ * has greater numerical precision than section 4.3.5.3 of
+ * https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf
+ * but the values below were calculated from first principles
+ * from the chromaticity coordinates of R G B W
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
+ * @see https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/matrixmaker.html
+ */const f=[506752/1228815,87881/245763,12673/70218,87098/409605,175762/245763,12673/175545,7918/409605,87881/737289,1001167/1053270];
+/**
+ * Convert an array of linear-light sRGB values to CIE XYZ
+ * using sRGB's own white, D65 (no chromatic adaptation)
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */function lin_sRGB_to_XYZ(t){return multiplyMatrices(f,t)}
+/**
+ * Convert an array of gamma-corrected sRGB values in the 0.0 to 1.0 range to HSL.
+ *
+ * @param {Color} RGB [r, g, b]
+ * - Red component 0..1
+ * - Green component 0..1
+ * - Blue component 0..1
+ * @return {number[]} Array of HSL values: Hue as degrees 0..360, Saturation and Lightness as percentages 0..100
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/utilities.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ *
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/better-rgbToHsl.js
+ */function sRGB_to_HSL(t){const n=t[0],_=t[1],o=t[2],e=Math.max(n,_,o),a=Math.min(n,_,o),r=(a+e)/2,l=e-a;let i=Number.NaN,c=0;if(0!==Math.round(1e5*l)){const t=Math.round(1e5*r);switch(c=0===t||1e5===t?0:(e-r)/Math.min(r,1-r),e){case n:i=(_-o)/l+(_<o?6:0);break;case _:i=(o-n)/l+2;break;case o:i=(n-_)/l+4}i*=60}c<0&&(i+=180,c=Math.abs(c)),i>=360&&(i-=360);return c<=1e-5&&(i=NaN),[i,100*c,100*r]}function sRGB_to_Hue(t){const n=t[0],_=t[1],o=t[2],e=Math.max(n,_,o),a=Math.min(n,_,o);let r=Number.NaN;const l=e-a;if(0!==l){switch(e){case n:r=(_-o)/l+(_<o?6:0);break;case _:r=(o-n)/l+2;break;case o:r=(n-_)/l+4}r*=60}return r>=360&&(r-=360),r}function sRGB_to_XYZ_D50(t){let n=t;return n=lin_sRGB(n),n=lin_sRGB_to_XYZ(n),n=D65_to_D50(n),n}function XYZ_D50_to_sRGB(t){let n=t;return n=D50_to_D65(n),n=XYZ_to_lin_sRGB(n),n=gam_sRGB(n),n}function HSL_to_XYZ_D50(t){let n=t;return n=HSL_to_sRGB(n),n=lin_sRGB(n),n=lin_sRGB_to_XYZ(n),n=D65_to_D50(n),n}function XYZ_D50_to_HSL(t){let n=t;return n=D50_to_D65(n),n=XYZ_to_lin_sRGB(n),n=gam_sRGB(n),n=sRGB_to_HSL(n),n}function HWB_to_XYZ_D50(t){let n=t;return n=HWB_to_sRGB(n),n=lin_sRGB(n),n=lin_sRGB_to_XYZ(n),n=D65_to_D50(n),n}function XYZ_D50_to_HWB(t){let n=t;n=D50_to_D65(n),n=XYZ_to_lin_sRGB(n);const _=gam_sRGB(n),o=Math.min(_[0],_[1],_[2]),e=1-Math.max(_[0],_[1],_[2]);let a=sRGB_to_Hue(_);return o+e>=.99999&&(a=NaN),[a,100*o,100*e]}function Lab_to_XYZ_D50(t){let n=t;return n=Lab_to_XYZ(n),n}function XYZ_D50_to_Lab(t){let n=t;return n=XYZ_to_Lab(n),n}function LCH_to_XYZ_D50(t){let n=t;return n=LCH_to_Lab(n),n=Lab_to_XYZ(n),n}function XYZ_D50_to_LCH(t){let n=t;return n=XYZ_to_Lab(n),n=Lab_to_LCH(n),n}function OKLab_to_XYZ_D50(t){let n=t;return n=OKLab_to_XYZ(n),n=D65_to_D50(n),n}function XYZ_D50_to_OKLab(t){let n=t;return n=D50_to_D65(n),n=XYZ_to_OKLab(n),n}function OKLCH_to_XYZ_D50(t){let n=t;return n=OKLCH_to_OKLab(n),n=OKLab_to_XYZ(n),n=D65_to_D50(n),n}function XYZ_D50_to_OKLCH(t){let n=t;return n=D50_to_D65(n),n=XYZ_to_OKLab(n),n=OKLab_to_OKLCH(n),n}function lin_sRGB_to_XYZ_D50(t){let n=t;return n=lin_sRGB_to_XYZ(n),n=D65_to_D50(n),n}function XYZ_D50_to_lin_sRGB(t){let n=t;return n=D50_to_D65(n),n=XYZ_to_lin_sRGB(n),n}function a98_RGB_to_XYZ_D50(t){let n=t;
+/**
+ * Convert an array of a98-rgb values in the range 0.0 - 1.0
+ * to linear light (un-companded) form. Negative values are also now accepted
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/conversions.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ */
+var _;return n=[lin_a98rgb_channel((_=n)[0]),lin_a98rgb_channel(_[1]),lin_a98rgb_channel(_[2])],n=multiplyMatrices(Z,n),n=D65_to_D50(n),n}function XYZ_D50_to_a98_RGB(t){let n=t;var _;return n=D50_to_D65(n),n=multiplyMatrices(h,n),n=[gam_a98rgb_channel((_=n)[0]),gam_a98rgb_channel(_[1]),gam_a98rgb_channel(_[2])],n}function P3_to_XYZ_D50(t){let n=t;return n=lin_P3(n),n=lin_P3_to_XYZ(n),n=D65_to_D50(n),n}function XYZ_D50_to_P3(t){let n=t;return n=D50_to_D65(n),n=XYZ_to_lin_P3(n),n=gam_P3(n),n}function lin_P3_to_XYZ_D50(t){let n=t;return n=lin_P3_to_XYZ(n),n=D65_to_D50(n),n}function XYZ_D50_to_lin_P3(t){let n=t;return n=D50_to_D65(n),n=XYZ_to_lin_P3(n),n}function rec_2020_to_XYZ_D50(t){let n=t;var _;return n=[lin_2020_channel((_=n)[0]),lin_2020_channel(_[1]),lin_2020_channel(_[2])],n=multiplyMatrices(b,n),n=D65_to_D50(n),n}function XYZ_D50_to_rec_2020(t){let n=t;var _;return n=D50_to_D65(n),n=multiplyMatrices(c,n),n=[gam_2020_channel((_=n)[0]),gam_2020_channel(_[1]),gam_2020_channel(_[2])],n}function ProPhoto_RGB_to_XYZ_D50(t){let n=t;var _;return n=[lin_ProPhoto_channel((_=n)[0]),lin_ProPhoto_channel(_[1]),lin_ProPhoto_channel(_[2])],n=multiplyMatrices(Y,n),n}function XYZ_D50_to_ProPhoto(t){let n=t;var _;return n=multiplyMatrices(s,n),n=[gam_ProPhoto_channel((_=n)[0]),gam_ProPhoto_channel(_[1]),gam_ProPhoto_channel(_[2])],n}function XYZ_D65_to_XYZ_D50(t){let n=t;return n=D65_to_D50(n),n}function XYZ_D50_to_XYZ_D65(t){let n=t;return n=D50_to_D65(n),n}function XYZ_D50_to_XYZ_D50(t){return t}function inGamut(t){return t[0]>=-1e-4&&t[0]<=1.0001&&t[1]>=-1e-4&&t[1]<=1.0001&&t[2]>=-1e-4&&t[2]<=1.0001}function clip(t){return[t[0]<0?0:t[0]>1?1:t[0],t[1]<0?0:t[1]>1?1:t[1],t[2]<0?0:t[2]>1?1:t[2]]}
+/**
+ * @description Calculate deltaE OK which is the simple root sum of squares
+ * @param {number[]} reference - Array of OKLab values: L as 0..1, a and b as -1..1
+ * @param {number[]} sample - Array of OKLab values: L as 0..1, a and b as -1..1
+ * @return {number} How different a color sample is from reference
+ *
+ * @license W3C https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
+ * @copyright This software or document includes material copied from or derived from https://github.com/w3c/csswg-drafts/blob/main/css-color-4/deltaEOK.js. Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang).
+ * @see https://github.com/w3c/csswg-drafts/blob/main/css-color-4/deltaEOK.js
+ */function deltaEOK(t,n){const[_,o,e]=t,[a,r,l]=n,i=_-a,c=o-r,u=e-l;return Math.sqrt(i**2+c**2+u**2)}const M=.02,p=1e-4;function mapGamut(t,n,_){const o=t;let e=clip(n(o)),a=deltaEOK(OKLCH_to_OKLab(_(e)),OKLCH_to_OKLab(o));if(a<M)return e;let r=0,l=o[1],i=!0;for(;l-r>p;){const t=(r+l)/2;if(o[1]=t,i&&inGamut(n(o)))r=t;else if(e=clip(n(o)),a=deltaEOK(OKLCH_to_OKLab(_(e)),OKLCH_to_OKLab(o)),a<M){if(M-a<p)return e;i=!1,r=t}else l=t}return clip(n([...o]))}
+/**
+ * @license MIT https://github.com/facelessuser/coloraide/blob/main/LICENSE.md
+ */function mapGamutRayTrace(t,n,_){const o=t[0],e=t[2];let a=n(t);const r=n([o,0,e]);for(let t=0;t<4;t++){if(t>0){const t=_(a);t[0]=o,t[2]=e,a=n(t)}const l=rayTraceBox(r,a);if(!l)break;a=l}return clip(a)}function rayTraceBox(t,n){let _=1/0,o=-1/0;const e=[0,0,0];for(let a=0;a<3;a++){const r=t[a],l=n[a]-r;e[a]=l;const i=0,c=1;if(l){const t=1/l,n=(i-r)*t,e=(c-r)*t;o=Math.max(Math.min(n,e),o),_=Math.min(Math.max(n,e),_)}else if(r<i||r>c)return!1}return!(o>_||_<0)&&(o<0&&(o=_),!!isFinite(o)&&[t[0]+e[0]*o,t[1]+e[1]*o,t[2]+e[2]*o])}const d={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};function luminance(t){const[n,_,o]=t.map(t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4));return.2126*n+.7152*_+.0722*o}function contrast_ratio_wcag_2_1(t,n){const _=luminance(t),o=luminance(n);return(Math.max(_,o)+.05)/(Math.min(_,o)+.05)}export{HSL_to_XYZ_D50,HWB_to_XYZ_D50,LCH_to_XYZ_D50,Lab_to_XYZ_D50,OKLCH_to_OKLab,OKLCH_to_XYZ_D50,OKLab_to_OKLCH,OKLab_to_XYZ,OKLab_to_XYZ_D50,P3_to_XYZ_D50,ProPhoto_RGB_to_XYZ_D50,XYZ_D50_to_HSL,XYZ_D50_to_HWB,XYZ_D50_to_LCH,XYZ_D50_to_Lab,XYZ_D50_to_OKLCH,XYZ_D50_to_OKLab,XYZ_D50_to_P3,XYZ_D50_to_ProPhoto,XYZ_D50_to_XYZ_D50,XYZ_D50_to_XYZ_D65,XYZ_D50_to_a98_RGB,XYZ_D50_to_lin_P3,XYZ_D50_to_lin_sRGB,XYZ_D50_to_rec_2020,XYZ_D50_to_sRGB,XYZ_D65_to_XYZ_D50,XYZ_to_OKLab,XYZ_to_lin_P3,XYZ_to_lin_sRGB,a98_RGB_to_XYZ_D50,clip,contrast_ratio_wcag_2_1,gam_P3,gam_sRGB,inGamut,lin_P3,lin_P3_to_XYZ,lin_P3_to_XYZ_D50,lin_sRGB,lin_sRGB_to_XYZ,lin_sRGB_to_XYZ_D50,mapGamut,mapGamutRayTrace,d as namedColors,rec_2020_to_XYZ_D50,sRGB_to_XYZ_D50};
diff --git a/vanilla/node_modules/@csstools/color-helpers/package.json b/vanilla/node_modules/@csstools/color-helpers/package.json
new file mode 100644
index 0000000..b16eddb
--- /dev/null
+++ b/vanilla/node_modules/@csstools/color-helpers/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "@csstools/color-helpers",
+ "description": "Color helpers to ease transformation between formats, gamut, etc",
+ "version": "6.0.1",
+ "contributors": [
+ {
+ "name": "Antonio Laguna",
+ "email": "antonio@laguna.es",
+ "url": "https://antonio.laguna.es"
+ },
+ {
+ "name": "Romain Menke",
+ "email": "romainmenke@gmail.com"
+ }
+ ],
+ "license": "MIT-0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.mjs"
+ }
+ },
+ "files": [
+ "CHANGELOG.md",
+ "LICENSE.md",
+ "README.md",
+ "dist"
+ ],
+ "scripts": {},
+ "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/color-helpers#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/csstools/postcss-plugins.git",
+ "directory": "packages/color-helpers"
+ },
+ "bugs": "https://github.com/csstools/postcss-plugins/issues",
+ "keywords": [
+ "colors",
+ "css"
+ ]
+}
diff --git a/vanilla/node_modules/@csstools/css-calc/CHANGELOG.md b/vanilla/node_modules/@csstools/css-calc/CHANGELOG.md
new file mode 100644
index 0000000..e0d6799
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-calc/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Changes to CSS Calc
+
+### 3.1.1
+
+_February 13, 2026_
+
+- Fix missing whitespace between components after solving calc expressions (e.g. `calc(10px)calc(20px)` now serializes as `10px 20px`)
+
+[Full CHANGELOG](https://github.com/csstools/postcss-plugins/tree/main/packages/css-calc/CHANGELOG.md)
diff --git a/vanilla/node_modules/@csstools/css-calc/LICENSE.md b/vanilla/node_modules/@csstools/css-calc/LICENSE.md
new file mode 100644
index 0000000..af5411f
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-calc/LICENSE.md
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright 2022 Romain Menke, Antonio Laguna <antonio@laguna.es>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vanilla/node_modules/@csstools/css-calc/README.md b/vanilla/node_modules/@csstools/css-calc/README.md
new file mode 100644
index 0000000..1e20fae
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-calc/README.md
@@ -0,0 +1,132 @@
+# CSS Calc <img src="https://cssdb.org/images/css.svg" alt="for CSS" width="90" height="90" align="right">
+
+[<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/css-calc.svg" height="20">][npm-url]
+[<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/actions/workflows/test.yml/badge.svg?branch=main" height="20">][cli-url]
+[<img alt="Discord" src="https://shields.io/badge/Discord-5865F2?logo=discord&logoColor=white">][discord]
+
+Implemented from : https://drafts.csswg.org/css-values-4/ on 2023-02-17
+
+## Usage
+
+Add [CSS calc] to your project:
+
+```bash
+npm install @csstools/css-calc @csstools/css-parser-algorithms @csstools/css-tokenizer --save-dev
+```
+
+### With string values :
+
+```mjs
+import { calc } from '@csstools/css-calc';
+
+// '20'
+console.log(calc('calc(10 * 2)'));
+```
+
+### With component values :
+
+```mjs
+import { stringify, tokenizer } from '@csstools/css-tokenizer';
+import { parseCommaSeparatedListOfComponentValues } from '@csstools/css-parser-algorithms';
+import { calcFromComponentValues } from '@csstools/css-calc';
+
+const t = tokenizer({
+ css: 'calc(10 * 2)',
+});
+
+const tokens = [];
+
+{
+ while (!t.endOfFile()) {
+ tokens.push(t.nextToken());
+ }
+
+ tokens.push(t.nextToken()); // EOF-token
+}
+
+const result = parseCommaSeparatedListOfComponentValues(tokens, {});
+
+// filter or mutate the component values
+
+const calcResult = calcFromComponentValues(result, { precision: 5, toCanonicalUnits: true });
+
+// filter or mutate the component values even further
+
+const calcResultStr = calcResult.map((componentValues) => {
+ return componentValues.map((x) => stringify(...x.tokens())).join('');
+}).join(',');
+
+// '20'
+console.log(calcResultStr);
+```
+
+### Options
+
+#### `precision` :
+
+The default precision is fairly high.
+It aims to be high enough to make rounding unnoticeable in the browser.
+
+You can set it to a lower number to suit your needs.
+
+```mjs
+import { calc } from '@csstools/css-calc';
+
+// '0.3'
+console.log(calc('calc(1 / 3)', { precision: 1 }));
+// '0.33'
+console.log(calc('calc(1 / 3)', { precision: 2 }));
+```
+
+#### `globals` :
+
+Pass global values as a map of key value pairs.
+
+> Example : Relative color syntax (`lch(from pink calc(l / 2) c h)`) exposes color channel information as ident tokens.
+> By passing globals for `l`, `c` and `h` it is possible to solve nested `calc()`'s.
+
+```mjs
+import { calc } from '@csstools/css-calc';
+
+const globals = new Map([
+ ['a', '10px'],
+ ['b', '2rem'],
+]);
+
+// '20px'
+console.log(calc('calc(a * 2)', { globals: globals }));
+// '6rem'
+console.log(calc('calc(b * 3)', { globals: globals }));
+```
+
+#### `toCanonicalUnits` :
+
+By default this package will try to preserve units.
+The heuristic to do this is very simplistic.
+We take the first unit we encounter and try to convert other dimensions to that unit.
+
+This better matches what users expect from a CSS dev tool.
+
+If you want to have outputs that are closes to CSS serialized values you can pass `toCanonicalUnits: true`.
+
+```mjs
+import { calc } from '@csstools/css-calc';
+
+// '20hz'
+console.log(calc('calc(0.01khz + 10hz)', { toCanonicalUnits: true }));
+
+// '20hz'
+console.log(calc('calc(10hz + 0.01khz)', { toCanonicalUnits: true }));
+
+// '0.02khz' !!!
+console.log(calc('calc(0.01khz + 10hz)', { toCanonicalUnits: false }));
+
+// '20hz'
+console.log(calc('calc(10hz + 0.01khz)', { toCanonicalUnits: false }));
+```
+
+[cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
+[discord]: https://discord.gg/bUadyRwkJS
+[npm-url]: https://www.npmjs.com/package/@csstools/css-calc
+
+[CSS calc]: https://github.com/csstools/postcss-plugins/tree/main/packages/css-calc
diff --git a/vanilla/node_modules/@csstools/css-calc/dist/index.d.ts b/vanilla/node_modules/@csstools/css-calc/dist/index.d.ts
new file mode 100644
index 0000000..28b8481
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-calc/dist/index.d.ts
@@ -0,0 +1,101 @@
+import { ComponentValue } from '@csstools/css-parser-algorithms';
+import type { TokenDimension } from '@csstools/css-tokenizer';
+import type { TokenNumber } from '@csstools/css-tokenizer';
+import type { TokenPercentage } from '@csstools/css-tokenizer';
+
+export declare function calc(css: string, options?: conversionOptions): string;
+
+export declare function calcFromComponentValues(componentValuesList: Array<Array<ComponentValue>>, options?: conversionOptions): Array<Array<ComponentValue>>;
+
+export declare type conversionOptions = {
+ /**
+ * If a calc expression can not be solved the parse error might be reported through this callback.
+ * Not all cases are covered. Open an issue if you need specific errors reported.
+ *
+ * Values are recursively visited and at each nesting level an attempt is made to solve the expression.
+ * Errors can be reported multiple times as a result of this.
+ */
+ onParseError?: (error: ParseError) => void;
+ /**
+ * Pass global values as a map of key value pairs.
+ */
+ globals?: GlobalsWithStrings;
+ /**
+ * The default precision is fairly high.
+ * It aims to be high enough to make rounding unnoticeable in the browser.
+ * You can set it to a lower number to suite your needs.
+ */
+ precision?: number;
+ /**
+ * By default this package will try to preserve units.
+ * The heuristic to do this is very simplistic.
+ * We take the first unit we encounter and try to convert other dimensions to that unit.
+ *
+ * This better matches what users expect from a CSS dev tool.
+ *
+ * If you want to have outputs that are closes to CSS serialized values you can set `true`.
+ */
+ toCanonicalUnits?: boolean;
+ /**
+ * Convert NaN, Infinity, ... into standard representable values.
+ */
+ censorIntoStandardRepresentableValues?: boolean;
+ /**
+ * Some percentages resolve against other values and might be negative or positive depending on context.
+ * Raw percentages are more likely to be safe to simplify outside of a browser context
+ *
+ * @see https://drafts.csswg.org/css-values-4/#calc-simplification
+ */
+ rawPercentages?: boolean;
+ /**
+ * The values used to generate random value cache keys.
+ */
+ randomCaching?: {
+ /**
+ * The name of the property the random function is used in.
+ */
+ propertyName: string;
+ /**
+ * N is the index of the random function among other random functions in the same property value.
+ */
+ propertyN: number;
+ /**
+ * An element ID identifying the element the style is being applied to.
+ * When omitted any `random()` call will not be computed.
+ */
+ elementID: string;
+ /**
+ * A document ID identifying the Document the styles are from.
+ * When omitted any `random()` call will not be computed.
+ */
+ documentID: string;
+ };
+};
+
+export declare type GlobalsWithStrings = Map<string, TokenDimension | TokenNumber | TokenPercentage | string>;
+
+export declare const mathFunctionNames: Set<string>;
+
+/**
+ * Any errors are reported through the `onParseError` callback.
+ */
+export declare class ParseError extends Error {
+ /** The index of the start character of the current token. */
+ sourceStart: number;
+ /** The index of the end character of the current token. */
+ sourceEnd: number;
+ constructor(message: string, sourceStart: number, sourceEnd: number);
+}
+
+export declare const ParseErrorMessage: {
+ UnexpectedAdditionOfDimensionOrPercentageWithNumber: string;
+ UnexpectedSubtractionOfDimensionOrPercentageWithNumber: string;
+};
+
+export declare class ParseErrorWithComponentValues extends ParseError {
+ /** The associated component values. */
+ componentValues: Array<ComponentValue>;
+ constructor(message: string, componentValues: Array<ComponentValue>);
+}
+
+export { }
diff --git a/vanilla/node_modules/@csstools/css-calc/dist/index.mjs b/vanilla/node_modules/@csstools/css-calc/dist/index.mjs
new file mode 100644
index 0000000..4471bb9
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-calc/dist/index.mjs
@@ -0,0 +1 @@
+import{sourceIndices as e,TokenNode as n,isTokenNode as t,isWhitespaceNode as r,isCommentNode as a,isWhiteSpaceOrCommentNode as u,isSimpleBlockNode as o,isFunctionNode as i,FunctionNode as l,WhitespaceNode as c,parseCommaSeparatedListOfComponentValues as s,walk as v}from"@csstools/css-parser-algorithms";import{isTokenDimension as f,TokenType as m,NumberType as p,mutateUnit as C,isTokenNumber as d,isTokenPercentage as g,isTokenIdent as D,isTokenNumeric as N,isTokenOpenParen as h,isTokenDelim as B,isTokenComma as A,isToken as b,tokenizer as F,tokenize as w,stringify as E,isTokenColon as S,isTokenSemicolon as I}from"@csstools/css-tokenizer";class ParseError extends Error{sourceStart;sourceEnd;constructor(e,n,t){super(e),this.name="ParseError",this.sourceStart=n,this.sourceEnd=t}}class ParseErrorWithComponentValues extends ParseError{componentValues;constructor(n,t){super(n,...e(t)),this.componentValues=t}}const y={UnexpectedAdditionOfDimensionOrPercentageWithNumber:"Unexpected addition of a dimension or percentage with a number.",UnexpectedSubtractionOfDimensionOrPercentageWithNumber:"Unexpected subtraction of a dimension or percentage with a number."},M=/[A-Z]/g;function toLowerCaseAZ(e){return e.replace(M,e=>String.fromCharCode(e.charCodeAt(0)+32))}const T={cm:"px",in:"px",mm:"px",pc:"px",pt:"px",px:"px",q:"px",deg:"deg",grad:"deg",rad:"deg",turn:"deg",ms:"s",s:"s",hz:"hz",khz:"hz"},x=new Map([["cm",e=>e],["mm",e=>10*e],["q",e=>40*e],["in",e=>e/2.54],["pc",e=>e/2.54*6],["pt",e=>e/2.54*72],["px",e=>e/2.54*96]]),P=new Map([["deg",e=>e],["grad",e=>e/.9],["rad",e=>e/180*Math.PI],["turn",e=>e/360]]),k=new Map([["deg",e=>.9*e],["grad",e=>e],["rad",e=>.9*e/180*Math.PI],["turn",e=>.9*e/360]]),O=new Map([["hz",e=>e],["khz",e=>e/1e3]]),W=new Map([["cm",e=>2.54*e],["mm",e=>25.4*e],["q",e=>25.4*e*4],["in",e=>e],["pc",e=>6*e],["pt",e=>72*e],["px",e=>96*e]]),U=new Map([["hz",e=>1e3*e],["khz",e=>e]]),L=new Map([["cm",e=>e/10],["mm",e=>e],["q",e=>4*e],["in",e=>e/25.4],["pc",e=>e/25.4*6],["pt",e=>e/25.4*72],["px",e=>e/25.4*96]]),V=new Map([["ms",e=>e],["s",e=>e/1e3]]),$=new Map([["cm",e=>e/6*2.54],["mm",e=>e/6*25.4],["q",e=>e/6*25.4*4],["in",e=>e/6],["pc",e=>e],["pt",e=>e/6*72],["px",e=>e/6*96]]),Z=new Map([["cm",e=>e/72*2.54],["mm",e=>e/72*25.4],["q",e=>e/72*25.4*4],["in",e=>e/72],["pc",e=>e/72*6],["pt",e=>e],["px",e=>e/72*96]]),z=new Map([["cm",e=>e/96*2.54],["mm",e=>e/96*25.4],["q",e=>e/96*25.4*4],["in",e=>e/96],["pc",e=>e/96*6],["pt",e=>e/96*72],["px",e=>e]]),q=new Map([["cm",e=>e/4/10],["mm",e=>e/4],["q",e=>e],["in",e=>e/4/25.4],["pc",e=>e/4/25.4*6],["pt",e=>e/4/25.4*72],["px",e=>e/4/25.4*96]]),G=new Map([["deg",e=>180*e/Math.PI],["grad",e=>180*e/Math.PI/.9],["rad",e=>e],["turn",e=>180*e/Math.PI/360]]),R=new Map([["ms",e=>1e3*e],["s",e=>e]]),j=new Map([["deg",e=>360*e],["grad",e=>360*e/.9],["rad",e=>360*e/180*Math.PI],["turn",e=>e]]),Y=new Map([["cm",x],["mm",L],["q",q],["in",W],["pc",$],["pt",Z],["px",z],["ms",V],["s",R],["deg",P],["grad",k],["rad",G],["turn",j],["hz",O],["khz",U]]);function convertUnit(e,n){if(!f(e))return n;if(!f(n))return n;const t=toLowerCaseAZ(e[4].unit),r=toLowerCaseAZ(n[4].unit);if(t===r)return n;const a=Y.get(r);if(!a)return n;const u=a.get(t);if(!u)return n;const o=u(n[4].value),i=[m.Dimension,"",n[2],n[3],{...n[4],signCharacter:o<0?"-":void 0,type:Number.isInteger(o)?p.Integer:p.Number,value:o}];return C(i,e[4].unit),i}function toCanonicalUnit(e){if(!f(e))return e;const n=toLowerCaseAZ(e[4].unit),t=T[n];if(n===t)return e;const r=Y.get(n);if(!r)return e;const a=r.get(t);if(!a)return e;const u=a(e[4].value),o=[m.Dimension,"",e[2],e[3],{...e[4],signCharacter:u<0?"-":void 0,type:Number.isInteger(u)?p.Integer:p.Number,value:u}];return C(o,t),o}function addition(e,t){if(2!==e.length)return-1;const r=e[0].value;let a=e[1].value;if(d(r)&&d(a)){const e=r[4].value+a[4].value;return new n([m.Number,e.toString(),r[2],a[3],{value:e,type:r[4].type===p.Integer&&a[4].type===p.Integer?p.Integer:p.Number}])}if(g(r)&&g(a)){const e=r[4].value+a[4].value;return new n([m.Percentage,e.toString()+"%",r[2],a[3],{value:e}])}if(f(r)&&f(a)&&(a=convertUnit(r,a),toLowerCaseAZ(r[4].unit)===toLowerCaseAZ(a[4].unit))){const e=r[4].value+a[4].value;return new n([m.Dimension,e.toString()+r[4].unit,r[2],a[3],{value:e,type:r[4].type===p.Integer&&a[4].type===p.Integer?p.Integer:p.Number,unit:r[4].unit}])}return(d(r)&&(f(a)||g(a))||d(a)&&(f(r)||g(r)))&&t.onParseError?.(new ParseErrorWithComponentValues(y.UnexpectedAdditionOfDimensionOrPercentageWithNumber,e)),-1}function division(e){if(2!==e.length)return-1;const t=e[0].value,r=e[1].value;if(d(t)&&d(r)){const e=t[4].value/r[4].value;return new n([m.Number,e.toString(),t[2],r[3],{value:e,type:Number.isInteger(e)?p.Integer:p.Number}])}if(g(t)&&d(r)){const e=t[4].value/r[4].value;return new n([m.Percentage,e.toString()+"%",t[2],r[3],{value:e}])}if(f(t)&&d(r)){const e=t[4].value/r[4].value;return new n([m.Dimension,e.toString()+t[4].unit,t[2],r[3],{value:e,type:Number.isInteger(e)?p.Integer:p.Number,unit:t[4].unit}])}return-1}function isCalculation(e){return!!e&&"object"==typeof e&&"inputs"in e&&Array.isArray(e.inputs)&&"operation"in e}function solve(e,n){if(-1===e)return-1;const r=[];for(let a=0;a<e.inputs.length;a++){const u=e.inputs[a];if(t(u)){r.push(u);continue}const o=solve(u,n);if(-1===o)return-1;r.push(o)}return e.operation(r,n)}function multiplication(e){if(2!==e.length)return-1;const t=e[0].value,r=e[1].value;if(d(t)&&d(r)){const e=t[4].value*r[4].value;return new n([m.Number,e.toString(),t[2],r[3],{value:e,type:t[4].type===p.Integer&&r[4].type===p.Integer?p.Integer:p.Number}])}if(g(t)&&d(r)){const e=t[4].value*r[4].value;return new n([m.Percentage,e.toString()+"%",t[2],r[3],{value:e}])}if(d(t)&&g(r)){const e=t[4].value*r[4].value;return new n([m.Percentage,e.toString()+"%",t[2],r[3],{value:e}])}if(f(t)&&d(r)){const e=t[4].value*r[4].value;return new n([m.Dimension,e.toString()+t[4].unit,t[2],r[3],{value:e,type:t[4].type===p.Integer&&r[4].type===p.Integer?p.Integer:p.Number,unit:t[4].unit}])}if(d(t)&&f(r)){const e=t[4].value*r[4].value;return new n([m.Dimension,e.toString()+r[4].unit,t[2],r[3],{value:e,type:t[4].type===p.Integer&&r[4].type===p.Integer?p.Integer:p.Number,unit:r[4].unit}])}return-1}function resolveGlobalsAndConstants(e,r){for(let a=0;a<e.length;a++){const u=e[a];if(!t(u))continue;const o=u.value;if(!D(o))continue;const i=toLowerCaseAZ(o[4].value);switch(i){case"e":e.splice(a,1,new n([m.Number,Math.E.toString(),o[2],o[3],{value:Math.E,type:p.Number}]));break;case"pi":e.splice(a,1,new n([m.Number,Math.PI.toString(),o[2],o[3],{value:Math.PI,type:p.Number}]));break;case"infinity":e.splice(a,1,new n([m.Number,"infinity",o[2],o[3],{value:1/0,type:p.Number}]));break;case"-infinity":e.splice(a,1,new n([m.Number,"-infinity",o[2],o[3],{value:-1/0,type:p.Number}]));break;case"nan":e.splice(a,1,new n([m.Number,"NaN",o[2],o[3],{value:Number.NaN,type:p.Number}]));break;default:if(r.has(i)){const t=r.get(i);e.splice(a,1,new n(t))}}}return e}function unary(e){if(1!==e.length)return-1;const n=e[0].value;return N(n)?e[0]:-1}function resultToCalculation(e,n,t){return f(n)?dimensionToCalculation(e,n[4].unit,t):g(n)?percentageToCalculation(e,t):d(n)?numberToCalculation(e,t):-1}function dimensionToCalculation(e,t,r){const a=e.tokens();return{inputs:[new n([m.Dimension,r.toString()+t,a[0][2],a[a.length-1][3],{value:r,type:Number.isInteger(r)?p.Integer:p.Number,unit:t}])],operation:unary}}function percentageToCalculation(e,t){const r=e.tokens();return{inputs:[new n([m.Percentage,t.toString()+"%",r[0][2],r[r.length-1][3],{value:t}])],operation:unary}}function numberToCalculation(e,t){const r=e.tokens();return{inputs:[new n([m.Number,t.toString(),r[0][2],r[r.length-1][3],{value:t,type:Number.isInteger(t)?p.Integer:p.Number}])],operation:unary}}function solveACos(e,n){const t=n.value;if(!d(t))return-1;return dimensionToCalculation(e,"rad",Math.acos(t[4].value))}function solveASin(e,n){const t=n.value;if(!d(t))return-1;return dimensionToCalculation(e,"rad",Math.asin(t[4].value))}function solveATan(e,n){const t=n.value;if(!d(t))return-1;return dimensionToCalculation(e,"rad",Math.atan(t[4].value))}function isDimensionOrNumber(e){return f(e)||d(e)}function arrayOfSameNumeric(e){if(0===e.length)return!0;const n=e[0];if(!N(n))return!1;if(1===e.length)return!0;if(f(n)){const t=toLowerCaseAZ(n[4].unit);for(let r=1;r<e.length;r++){const a=e[r];if(n[0]!==a[0])return!1;if(t!==toLowerCaseAZ(a[4].unit))return!1}return!0}for(let t=1;t<e.length;t++){const r=e[t];if(n[0]!==r[0])return!1}return!0}function twoOfSameNumeric(e,n){return!!N(e)&&(f(e)?e[0]===n[0]&&toLowerCaseAZ(e[4].unit)===toLowerCaseAZ(n[4].unit):e[0]===n[0])}function solveATan2(e,n,t){const r=n.value;if(!isDimensionOrNumber(r))return-1;const a=convertUnit(r,t.value);if(!twoOfSameNumeric(r,a))return-1;return dimensionToCalculation(e,"rad",Math.atan2(r[4].value,a[4].value))}function solveAbs(e,n,t){const r=n.value;if(!N(r))return-1;if(!t.rawPercentages&&g(r))return-1;return resultToCalculation(e,r,Math.abs(r[4].value))}function solveClamp(e,n,r,a,u){if(!t(n)||!t(r)||!t(a))return-1;const o=n.value;if(!N(o))return-1;if(!u.rawPercentages&&g(o))return-1;const i=convertUnit(o,r.value);if(!twoOfSameNumeric(o,i))return-1;const l=convertUnit(o,a.value);if(!twoOfSameNumeric(o,l))return-1;return resultToCalculation(e,o,Math.max(o[4].value,Math.min(i[4].value,l[4].value)))}function solveCos(e,n){const t=n.value;if(!isDimensionOrNumber(t))return-1;let r=t[4].value;if(f(t))switch(t[4].unit.toLowerCase()){case"rad":break;case"deg":r=P.get("rad")(t[4].value);break;case"grad":r=k.get("rad")(t[4].value);break;case"turn":r=j.get("rad")(t[4].value);break;default:return-1}return r=Math.cos(r),numberToCalculation(e,r)}function solveExp(e,n){const t=n.value;if(!d(t))return-1;return numberToCalculation(e,Math.exp(t[4].value))}function solveHypot(e,n,r){if(!n.every(t))return-1;const a=n[0].value;if(!N(a))return-1;if(!r.rawPercentages&&g(a))return-1;const u=n.map(e=>convertUnit(a,e.value));if(!arrayOfSameNumeric(u))return-1;const o=u.map(e=>e[4].value),i=Math.hypot(...o);return resultToCalculation(e,a,i)}function solveMax(e,n,r){if(!n.every(t))return-1;const a=n[0].value;if(!N(a))return-1;if(!r.rawPercentages&&g(a))return-1;const u=n.map(e=>convertUnit(a,e.value));if(!arrayOfSameNumeric(u))return-1;const o=u.map(e=>e[4].value),i=Math.max(...o);return resultToCalculation(e,a,i)}function solveMin(e,n,r){if(!n.every(t))return-1;const a=n[0].value;if(!N(a))return-1;if(!r.rawPercentages&&g(a))return-1;const u=n.map(e=>convertUnit(a,e.value));if(!arrayOfSameNumeric(u))return-1;const o=u.map(e=>e[4].value),i=Math.min(...o);return resultToCalculation(e,a,i)}function solveMod(e,n,t){const r=n.value;if(!N(r))return-1;const a=convertUnit(r,t.value);if(!twoOfSameNumeric(r,a))return-1;let u;return u=0===a[4].value?Number.NaN:Number.isFinite(r[4].value)&&(Number.isFinite(a[4].value)||(a[4].value!==Number.POSITIVE_INFINITY||r[4].value!==Number.NEGATIVE_INFINITY&&!Object.is(0*r[4].value,-0))&&(a[4].value!==Number.NEGATIVE_INFINITY||r[4].value!==Number.POSITIVE_INFINITY&&!Object.is(0*r[4].value,0)))?Number.isFinite(a[4].value)?(r[4].value%a[4].value+a[4].value)%a[4].value:r[4].value:Number.NaN,resultToCalculation(e,r,u)}function solvePow(e,n,t){const r=n.value,a=t.value;if(!d(r))return-1;if(!twoOfSameNumeric(r,a))return-1;return numberToCalculation(e,Math.pow(r[4].value,a[4].value))}function solveRem(e,n,t){const r=n.value;if(!N(r))return-1;const a=convertUnit(r,t.value);if(!twoOfSameNumeric(r,a))return-1;let u;return u=0===a[4].value?Number.NaN:Number.isFinite(r[4].value)?Number.isFinite(a[4].value)?r[4].value%a[4].value:r[4].value:Number.NaN,resultToCalculation(e,r,u)}function solveRound(e,n,t,r,a){const u=t.value;if(!N(u))return-1;if(!a.rawPercentages&&g(u))return-1;const o=convertUnit(u,r.value);if(!twoOfSameNumeric(u,o))return-1;let i;if(0===o[4].value)i=Number.NaN;else if(Number.isFinite(u[4].value)||Number.isFinite(o[4].value))if(!Number.isFinite(u[4].value)&&Number.isFinite(o[4].value))i=u[4].value;else if(Number.isFinite(u[4].value)&&!Number.isFinite(o[4].value))switch(n){case"down":i=u[4].value<0?-1/0:Object.is(-0,0*u[4].value)?-0:0;break;case"up":i=u[4].value>0?1/0:Object.is(0,0*u[4].value)?0:-0;break;default:i=Object.is(0,0*u[4].value)?0:-0}else if(Number.isFinite(o[4].value))switch(n){case"down":i=Math.floor(u[4].value/o[4].value)*o[4].value;break;case"up":i=Math.ceil(u[4].value/o[4].value)*o[4].value;break;case"to-zero":i=Math.trunc(u[4].value/o[4].value)*o[4].value;break;default:{let e=Math.floor(u[4].value/o[4].value)*o[4].value,n=Math.ceil(u[4].value/o[4].value)*o[4].value;if(e>n){const t=e;e=n,n=t}const t=Math.abs(u[4].value-e),r=Math.abs(u[4].value-n);i=t===r?n:t<r?e:n;break}}else i=u[4].value;else i=Number.NaN;return resultToCalculation(e,u,i)}function solveSign(e,n,t){const r=n.value;if(!N(r))return-1;if(!t.rawPercentages&&g(r))return-1;return numberToCalculation(e,Math.sign(r[4].value))}function solveSin(e,n){const t=n.value;if(!isDimensionOrNumber(t))return-1;let r=t[4].value;if(f(t))switch(toLowerCaseAZ(t[4].unit)){case"rad":break;case"deg":r=P.get("rad")(t[4].value);break;case"grad":r=k.get("rad")(t[4].value);break;case"turn":r=j.get("rad")(t[4].value);break;default:return-1}return r=Math.sin(r),numberToCalculation(e,r)}function solveSqrt(e,n){const t=n.value;if(!d(t))return-1;return numberToCalculation(e,Math.sqrt(t[4].value))}function solveTan(e,n){const t=n.value;if(!isDimensionOrNumber(t))return-1;const r=t[4].value;let a=0,u=t[4].value;if(f(t))switch(toLowerCaseAZ(t[4].unit)){case"rad":a=G.get("deg")(r);break;case"deg":a=r,u=P.get("rad")(r);break;case"grad":a=k.get("deg")(r),u=k.get("rad")(r);break;case"turn":a=j.get("deg")(r),u=j.get("rad")(r);break;default:return-1}const o=a/90;return u=a%90==0&&o%2!=0?o>0?1/0:-1/0:Math.tan(u),numberToCalculation(e,u)}function subtraction(e,t){if(2!==e.length)return-1;const r=e[0].value;let a=e[1].value;if(d(r)&&d(a)){const e=r[4].value-a[4].value;return new n([m.Number,e.toString(),r[2],a[3],{value:e,type:r[4].type===p.Integer&&a[4].type===p.Integer?p.Integer:p.Number}])}if(g(r)&&g(a)){const e=r[4].value-a[4].value;return new n([m.Percentage,e.toString()+"%",r[2],a[3],{value:e}])}if(f(r)&&f(a)&&(a=convertUnit(r,a),toLowerCaseAZ(r[4].unit)===toLowerCaseAZ(a[4].unit))){const e=r[4].value-a[4].value;return new n([m.Dimension,e.toString()+r[4].unit,r[2],a[3],{value:e,type:r[4].type===p.Integer&&a[4].type===p.Integer?p.Integer:p.Number,unit:r[4].unit}])}return(d(r)&&(f(a)||g(a))||d(a)&&(f(r)||g(r)))&&t.onParseError?.(new ParseErrorWithComponentValues(y.UnexpectedSubtractionOfDimensionOrPercentageWithNumber,e)),-1}function solveLog(e,n){if(1===n.length){const r=n[0];if(!r||!t(r))return-1;const a=r.value;if(!d(a))return-1;return numberToCalculation(e,Math.log(a[4].value))}if(2===n.length){const r=n[0];if(!r||!t(r))return-1;const a=r.value;if(!d(a))return-1;const u=n[1];if(!u||!t(u))return-1;const o=u.value;if(!d(o))return-1;return numberToCalculation(e,Math.log(a[4].value)/Math.log(o[4].value))}return-1}const _=/^none$/i;function isNone(e){if(Array.isArray(e)){const n=e.filter(e=>!(r(e)&&a(e)));return 1===n.length&&isNone(n[0])}if(!t(e))return!1;const n=e.value;return!!D(n)&&_.test(n[4].value)}const H=String.fromCodePoint(0);function solveRandom(e,n,t,r,a,u){if(-1===n.fixed&&!u.randomCaching)return-1;u.randomCaching||(u.randomCaching={propertyName:"",propertyN:0,elementID:"",documentID:""}),u.randomCaching&&!u.randomCaching.propertyN&&(u.randomCaching.propertyN=0);const o=t.value;if(!N(o))return-1;const i=convertUnit(o,r.value);if(!twoOfSameNumeric(o,i))return-1;let l=null;if(a&&(l=convertUnit(o,a.value),!twoOfSameNumeric(o,l)))return-1;if(!Number.isFinite(o[4].value))return resultToCalculation(e,o,Number.NaN);if(!Number.isFinite(i[4].value))return resultToCalculation(e,o,Number.NaN);if(!Number.isFinite(i[4].value-o[4].value))return resultToCalculation(e,o,Number.NaN);if(l&&!Number.isFinite(l[4].value))return resultToCalculation(e,o,o[4].value);const c=-1===n.fixed?sfc32(crc32([n.dashedIdent?n.dashedIdent:`${u.randomCaching?.propertyName} ${u.randomCaching.propertyN++}`,n.elementShared?"":u.randomCaching.elementID,u.randomCaching.documentID].join(H))):()=>n.fixed;let s=o[4].value,v=i[4].value;if(s>v&&([s,v]=[v,s]),l&&(l[4].value<=0||Math.abs(s-v)/l[4].value>1e10)&&(l=null),l){const n=Math.max(l[4].value/1e3,1e-9),t=[s];let r=0;for(;;){r+=l[4].value;const e=s+r;if(!(e+n<v)){t.push(v);break}if(t.push(e),e+l[4].value-n>v)break}const a=c();return resultToCalculation(e,o,Number(t[Math.floor(t.length*a)].toFixed(5)))}const f=c();return resultToCalculation(e,o,Number((f*(v-s)+s).toFixed(5)))}function sfc32(e=.34944106645296036,n=.19228640875738723,t=.8784393832007205,r=.04850964319275053){return()=>{const a=((e|=0)+(n|=0)|0)+(r|=0)|0;return r=r+1|0,e=n^n>>>9,n=(t|=0)+(t<<3)|0,t=(t=t<<21|t>>>11)+a|0,(a>>>0)/4294967296}}function crc32(e){let n=0,t=0,r=0;n^=-1;for(let a=0,u=e.length;a<u;a++)r=255&(n^e.charCodeAt(a)),t=Number("0x"+"00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D".substring(9*r,9*r+8)),n=n>>>8^t;return(-1^n)>>>0}const J=new Map([["abs",function abs(e,n,t){return singleNodeSolver(e,n,t,solveAbs)}],["acos",function acos(e,n,t){return singleNodeSolver(e,n,t,solveACos)}],["asin",function asin(e,n,t){return singleNodeSolver(e,n,t,solveASin)}],["atan",function atan(e,n,t){return singleNodeSolver(e,n,t,solveATan)}],["atan2",function atan2(e,n,t){return twoCommaSeparatedNodesSolver(e,n,t,solveATan2)}],["calc",calc$1],["clamp",function clamp(r,a,o){const i=resolveGlobalsAndConstants([...r.value.filter(e=>!u(e))],a),c=[],s=[],v=[];{let e=c;for(let n=0;n<i.length;n++){const r=i[n];if(t(r)&&A(r.value)){if(e===v)return-1;if(e===s){e=v;continue}if(e===c){e=s;continue}return-1}e.push(r)}}const f=isNone(c),p=isNone(v);if(f&&p)return calc$1(calcWrapper(r,s),a,o);const C=solve(calc$1(calcWrapper(r,s),a,o),o);if(-1===C)return-1;if(f){const t=solve(calc$1(calcWrapper(r,v),a,o),o);return-1===t?-1:solveMin((d=r,g=C,D=t,new l([m.Function,"min(",d.name[2],d.name[3],{value:"min"}],[m.CloseParen,")",d.endToken[2],d.endToken[3],void 0],[g,new n([m.Comma,",",...e(g),void 0]),D])),[C,t],o)}if(p){const e=solve(calc$1(calcWrapper(r,c),a,o),o);return-1===e?-1:solveMax(maxWrapper(r,e,C),[e,C],o)}var d,g,D;const N=solve(calc$1(calcWrapper(r,c),a,o),o);if(-1===N)return-1;const h=solve(calc$1(calcWrapper(r,v),a,o),o);if(-1===h)return-1;return solveClamp(r,N,C,h,o)}],["cos",function cos(e,n,t){return singleNodeSolver(e,n,t,solveCos)}],["exp",function exp(e,n,t){return singleNodeSolver(e,n,t,solveExp)}],["hypot",function hypot(e,n,t){return variadicNodesSolver(e,n,t,solveHypot)}],["log",function log(e,n,t){return variadicNodesSolver(e,n,t,solveLog)}],["max",function max(e,n,t){return variadicNodesSolver(e,n,t,solveMax)}],["min",function min(e,n,t){return variadicNodesSolver(e,n,t,solveMin)}],["mod",function mod(e,n,t){return twoCommaSeparatedNodesSolver(e,n,t,solveMod)}],["pow",function pow(e,n,t){return twoCommaSeparatedNodesSolver(e,n,t,solvePow)}],["random",function random(e,n,t){const r=parseRandomValueSharing(e,e.value.filter(e=>!u(e)),n,t);if(-1===r)return-1;const[a,o]=r,i=variadicArguments(e,o,n,t);if(-1===i)return-1;const[l,c,s]=i;if(!l||!c)return-1;return solveRandom(e,a,l,c,s,t)}],["rem",function rem(e,n,t){return twoCommaSeparatedNodesSolver(e,n,t,solveRem)}],["round",function round(e,r,a){const o=resolveGlobalsAndConstants([...e.value.filter(e=>!u(e))],r);let i="",l=!1;const c=[],s=[];{let e=c;for(let n=0;n<o.length;n++){const r=o[n];if(!i&&0===c.length&&0===s.length&&t(r)&&D(r.value)){const e=r.value[4].value.toLowerCase();if(K.has(e)){i=e;continue}}if(t(r)&&A(r.value)){if(e===s)return-1;if(e===c&&i&&0===c.length)continue;if(e===c){l=!0,e=s;continue}return-1}e.push(r)}}const v=solve(calc$1(calcWrapper(e,c),r,a),a);if(-1===v)return-1;l||0!==s.length||s.push(new n([m.Number,"1",v.value[2],v.value[3],{value:1,type:p.Integer}]));const f=solve(calc$1(calcWrapper(e,s),r,a),a);if(-1===f)return-1;i||(i="nearest");return solveRound(e,i,v,f,a)}],["sign",function sign(e,n,t){return singleNodeSolver(e,n,t,solveSign)}],["sin",function sin(e,n,t){return singleNodeSolver(e,n,t,solveSin)}],["sqrt",function sqrt(e,n,t){return singleNodeSolver(e,n,t,solveSqrt)}],["tan",function tan(e,n,t){return singleNodeSolver(e,n,t,solveTan)}]]);function calc$1(e,n,r){const a=resolveGlobalsAndConstants([...e.value.filter(e=>!u(e))],n);if(1===a.length&&t(a[0]))return{inputs:[a[0]],operation:unary};let l=0;for(;l<a.length;){const e=a[l];if(o(e)&&h(e.startToken)){const t=calc$1(e,n,r);if(-1===t)return-1;a.splice(l,1,t);continue}if(i(e)){const t=J.get(e.getName().toLowerCase());if(!t)return-1;const u=t(e,n,r);if(-1===u)return-1;a.splice(l,1,u);continue}l++}if(l=0,1===a.length&&isCalculation(a[0]))return a[0];for(;l<a.length;){const e=a[l];if(!e||!t(e)&&!isCalculation(e)){l++;continue}const n=a[l+1];if(!n||!t(n)){l++;continue}const r=n.value;if(!B(r)||"*"!==r[4].value&&"/"!==r[4].value){l++;continue}const u=a[l+2];if(!u||!t(u)&&!isCalculation(u))return-1;"*"!==r[4].value?"/"!==r[4].value?l++:a.splice(l,3,{inputs:[e,u],operation:division}):a.splice(l,3,{inputs:[e,u],operation:multiplication})}if(l=0,1===a.length&&isCalculation(a[0]))return a[0];for(;l<a.length;){const e=a[l];if(!e||!t(e)&&!isCalculation(e)){l++;continue}const n=a[l+1];if(!n||!t(n)){l++;continue}const r=n.value;if(!B(r)||"+"!==r[4].value&&"-"!==r[4].value){l++;continue}const u=a[l+2];if(!u||!t(u)&&!isCalculation(u))return-1;"+"!==r[4].value?"-"!==r[4].value?l++:a.splice(l,3,{inputs:[e,u],operation:subtraction}):a.splice(l,3,{inputs:[e,u],operation:addition})}return 1===a.length&&isCalculation(a[0])?a[0]:-1}function singleNodeSolver(e,n,t,r){const a=singleArgument(e,n,t);return-1===a?-1:r(e,a,t)}function singleArgument(e,n,t){const r=resolveGlobalsAndConstants([...e.value.filter(e=>!u(e))],n),a=solve(calc$1(calcWrapper(e,r),n,t),t);return-1===a?-1:a}function twoCommaSeparatedNodesSolver(e,n,t,r){const a=twoCommaSeparatedArguments(e,n,t);if(-1===a)return-1;const[u,o]=a;return r(e,u,o,t)}function twoCommaSeparatedArguments(e,n,r){const a=resolveGlobalsAndConstants([...e.value.filter(e=>!u(e))],n),o=[],i=[];{let e=o;for(let n=0;n<a.length;n++){const r=a[n];if(t(r)&&A(r.value)){if(e===i)return-1;if(e===o){e=i;continue}return-1}e.push(r)}}const l=solve(calc$1(calcWrapper(e,o),n,r),r);if(-1===l)return-1;const c=solve(calc$1(calcWrapper(e,i),n,r),r);return-1===c?-1:[l,c]}function variadicNodesSolver(e,n,t,r){const a=variadicArguments(e,e.value,n,t);return-1===a?-1:r(e,a,t)}function variadicArguments(e,n,r,a){const o=resolveGlobalsAndConstants([...n.filter(e=>!u(e))],r),i=[];{const n=[];let u=[];for(let e=0;e<o.length;e++){const r=o[e];t(r)&&A(r.value)?(n.push(u),u=[]):u.push(r)}n.push(u);for(let t=0;t<n.length;t++){if(0===n[t].length)return-1;const u=solve(calc$1(calcWrapper(e,n[t]),r,a),a);if(-1===u)return-1;i.push(u)}}return i}const K=new Set(["nearest","up","down","to-zero"]);function parseRandomValueSharing(e,n,r,a){const u={isAuto:!1,dashedIdent:"",fixed:-1,elementShared:!1},o=n[0];if(!t(o)||!D(o.value))return[u,n];for(let o=0;o<n.length;o++){const i=n[o];if(!t(i))return-1;if(A(i.value))return[u,n.slice(o+1)];if(!D(i.value))return-1;const l=i.value[4].value.toLowerCase();if("element-shared"!==l){if("fixed"===l){if(u.elementShared||u.dashedIdent||u.isAuto)return-1;o++;const t=n[o];if(!t)return-1;const i=solve(calc$1(calcWrapper(e,[t]),r,a),a);if(-1===i)return-1;if(!d(i.value))return-1;if(i.value[4].value<0||i.value[4].value>1)return-1;u.fixed=Math.max(0,Math.min(i.value[4].value,1-1e-9));continue}if("auto"!==l)if(l.startsWith("--")){if(-1!==u.fixed||u.isAuto)return-1;u.dashedIdent=l}else;else{if(-1!==u.fixed||u.dashedIdent)return-1;u.isAuto=!0}}else{if(-1!==u.fixed)return-1;u.elementShared=!0}}return-1}function calcWrapper(e,n){return new l([m.Function,"calc(",e.name[2],e.name[3],{value:"calc"}],[m.CloseParen,")",e.endToken[2],e.endToken[3],void 0],n)}function maxWrapper(t,r,a){return new l([m.Function,"max(",t.name[2],t.name[3],{value:"max"}],[m.CloseParen,")",t.endToken[2],t.endToken[3],void 0],[r,new n([m.Comma,",",...e(r),void 0]),a])}function patchNaN(e){if(-1===e)return-1;if(i(e))return e;const t=e.value;return N(t)&&Number.isNaN(t[4].value)?d(t)?new l([m.Function,"calc(",t[2],t[3],{value:"calc"}],[m.CloseParen,")",t[2],t[3],void 0],[new n([m.Ident,"NaN",t[2],t[3],{value:"NaN"}])]):f(t)?new l([m.Function,"calc(",t[2],t[3],{value:"calc"}],[m.CloseParen,")",t[2],t[3],void 0],[new n([m.Ident,"NaN",t[2],t[3],{value:"NaN"}]),new c([[m.Whitespace," ",t[2],t[3],void 0]]),new n([m.Delim,"*",t[2],t[3],{value:"*"}]),new c([[m.Whitespace," ",t[2],t[3],void 0]]),new n([m.Dimension,"1"+t[4].unit,t[2],t[3],{value:1,type:p.Integer,unit:t[4].unit}])]):g(t)?new l([m.Function,"calc(",t[2],t[3],{value:"calc"}],[m.CloseParen,")",t[2],t[3],void 0],[new n([m.Ident,"NaN",t[2],t[3],{value:"NaN"}]),new c([[m.Whitespace," ",t[2],t[3],void 0]]),new n([m.Delim,"*",t[2],t[3],{value:"*"}]),new c([[m.Whitespace," ",t[2],t[3],void 0]]),new n([m.Percentage,"1%",t[2],t[3],{value:1}])]):-1:e}function patchInfinity(e){if(-1===e)return-1;if(i(e))return e;const t=e.value;if(!N(t))return e;if(Number.isFinite(t[4].value)||Number.isNaN(t[4].value))return e;let r="";return Number.NEGATIVE_INFINITY===t[4].value&&(r="-"),d(t)?new l([m.Function,"calc(",t[2],t[3],{value:"calc"}],[m.CloseParen,")",t[2],t[3],void 0],[new n([m.Ident,r+"infinity",t[2],t[3],{value:r+"infinity"}])]):f(t)?new l([m.Function,"calc(",t[2],t[3],{value:"calc"}],[m.CloseParen,")",t[2],t[3],void 0],[new n([m.Ident,r+"infinity",t[2],t[3],{value:r+"infinity"}]),new c([[m.Whitespace," ",t[2],t[3],void 0]]),new n([m.Delim,"*",t[2],t[3],{value:"*"}]),new c([[m.Whitespace," ",t[2],t[3],void 0]]),new n([m.Dimension,"1"+t[4].unit,t[2],t[3],{value:1,type:p.Integer,unit:t[4].unit}])]):new l([m.Function,"calc(",t[2],t[3],{value:"calc"}],[m.CloseParen,")",t[2],t[3],void 0],[new n([m.Ident,r+"infinity",t[2],t[3],{value:r+"infinity"}]),new c([[m.Whitespace," ",t[2],t[3],void 0]]),new n([m.Delim,"*",t[2],t[3],{value:"*"}]),new c([[m.Whitespace," ",t[2],t[3],void 0]]),new n([m.Percentage,"1%",t[2],t[3],{value:1}])])}function patchMinusZero(e){if(-1===e)return-1;if(i(e))return e;const n=e.value;return N(n)&&Object.is(-0,n[4].value)?("-0"===n[1]||(g(n)?n[1]="-0%":f(n)?n[1]="-0"+n[4].unit:n[1]="-0"),e):e}function patchPrecision(e,n=13){if(-1===e)return-1;if(n<=0)return e;if(i(e))return e;const t=e.value;if(!N(t))return e;if(Number.isInteger(t[4].value))return e;const r=Number(t[4].value.toFixed(n)).toString();return d(t)?t[1]=r:g(t)?t[1]=r+"%":f(t)&&(t[1]=r+t[4].unit),e}function patchCanonicalUnit(e){return-1===e?-1:i(e)?e:f(e.value)?(e.value=toCanonicalUnit(e.value),e):e}function patchCalcResult(e,n){let t=e;return n?.toCanonicalUnits&&(t=patchCanonicalUnit(t)),t=patchPrecision(t,n?.precision),t=patchMinusZero(t),n?.censorIntoStandardRepresentableValues||(t=patchNaN(t),t=patchInfinity(t)),t}function tokenizeGlobals(e){const n=new Map;if(!e)return n;for(const[t,r]of e)if(b(r))n.set(t,r);else if("string"==typeof r){const e=F({css:r}),a=e.nextToken();if(e.nextToken(),!e.endOfFile())continue;if(!N(a))continue;n.set(t,a);continue}return n}function calc(e,n){return calcFromComponentValues(s(w({css:e}),{}),n).map(e=>e.map(e=>E(...e.tokens())).join("")).join(",")}function calcFromComponentValues(e,n){const t=tokenizeGlobals(n?.globals);return replaceComponentValues(e,e=>{if(!i(e))return;const r=J.get(e.getName().toLowerCase());if(!r)return;const a=patchCalcResult(solve(r(e,t,n??{}),n??{}),n);return-1!==a?a:void 0})}function replaceComponentValues(n,r){for(let a=0;a<n.length;a++){const o=n[a];v(o,(n,a)=>{if("number"!=typeof a)return;const o=r(n.node);if(!o)return;const i=[o],l=n.parent.value[a-1];t(l)&&B(l.value)&&("-"===l.value[4].value||"+"===l.value[4].value)&&i.splice(0,0,new c([[m.Whitespace," ",...e(n.node),void 0]]));const s=n.parent.value[a+1];!s||u(s)||t(s)&&(A(s.value)||S(s.value)||I(s.value)||B(s.value)&&"-"!==s.value[4].value&&"+"!==s.value[4].value)||i.push(new c([[m.Whitespace," ",...e(n.node),void 0]])),n.parent.value.splice(a,1,...i)})}return n}const Q=new Set(J.keys());export{ParseError,y as ParseErrorMessage,ParseErrorWithComponentValues,calc,calcFromComponentValues,Q as mathFunctionNames};
diff --git a/vanilla/node_modules/@csstools/css-calc/package.json b/vanilla/node_modules/@csstools/css-calc/package.json
new file mode 100644
index 0000000..8635ede
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-calc/package.json
@@ -0,0 +1,59 @@
+{
+ "name": "@csstools/css-calc",
+ "description": "Solve CSS math expressions",
+ "version": "3.1.1",
+ "contributors": [
+ {
+ "name": "Antonio Laguna",
+ "email": "antonio@laguna.es",
+ "url": "https://antonio.laguna.es"
+ },
+ {
+ "name": "Romain Menke",
+ "email": "romainmenke@gmail.com"
+ }
+ ],
+ "license": "MIT",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.mjs"
+ }
+ },
+ "files": [
+ "CHANGELOG.md",
+ "LICENSE.md",
+ "README.md",
+ "dist"
+ ],
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^4.0.0",
+ "@csstools/css-tokenizer": "^4.0.0"
+ },
+ "scripts": {},
+ "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/css-calc#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/csstools/postcss-plugins.git",
+ "directory": "packages/css-calc"
+ },
+ "bugs": "https://github.com/csstools/postcss-plugins/issues",
+ "keywords": [
+ "calc",
+ "css"
+ ]
+}
diff --git a/vanilla/node_modules/@csstools/css-color-parser/CHANGELOG.md b/vanilla/node_modules/@csstools/css-color-parser/CHANGELOG.md
new file mode 100644
index 0000000..fbc25d6
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-color-parser/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Changes to CSS Color Parser
+
+### 4.0.1
+
+_January 25, 2026_
+
+- Updated [`@csstools/color-helpers`](https://github.com/csstools/postcss-plugins/tree/main/packages/color-helpers) to [`6.0.1`](https://github.com/csstools/postcss-plugins/tree/main/packages/color-helpers/CHANGELOG.md#601) (patch)
+
+[Full CHANGELOG](https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser/CHANGELOG.md)
diff --git a/vanilla/node_modules/@csstools/css-color-parser/LICENSE.md b/vanilla/node_modules/@csstools/css-color-parser/LICENSE.md
new file mode 100644
index 0000000..af5411f
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-color-parser/LICENSE.md
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright 2022 Romain Menke, Antonio Laguna <antonio@laguna.es>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vanilla/node_modules/@csstools/css-color-parser/README.md b/vanilla/node_modules/@csstools/css-color-parser/README.md
new file mode 100644
index 0000000..f886fc9
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-color-parser/README.md
@@ -0,0 +1,37 @@
+# CSS Color Parser <img src="https://cssdb.org/images/css.svg" alt="for CSS" width="90" height="90" align="right">
+
+[<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/css-color-parser.svg" height="20">][npm-url]
+[<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/actions/workflows/test.yml/badge.svg?branch=main" height="20">][cli-url]
+[<img alt="Discord" src="https://shields.io/badge/Discord-5865F2?logo=discord&logoColor=white">][discord]
+
+## Usage
+
+Add [CSS Color Parser] to your project:
+
+```bash
+npm install @csstools/css-color-parser @csstools/css-parser-algorithms @csstools/css-tokenizer --save-dev
+```
+
+```ts
+import { color } from '@csstools/css-color-parser';
+import { isFunctionNode, parseComponentValue } from '@csstools/css-parser-algorithms';
+import { serializeRGB } from '@csstools/css-color-parser';
+import { tokenize } from '@csstools/css-tokenizer';
+
+// color() expects a parsed component value.
+const hwbComponentValue = parseComponentValue(tokenize({ css: 'hwb(10deg 10% 20%)' }));
+const colorData = color(hwbComponentValue);
+if (colorData) {
+ console.log(colorData);
+
+ // serializeRGB() returns a component value.
+ const rgbComponentValue = serializeRGB(colorData);
+ console.log(rgbComponentValue.toString());
+}
+```
+
+[cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
+[discord]: https://discord.gg/bUadyRwkJS
+[npm-url]: https://www.npmjs.com/package/@csstools/css-color-parser
+
+[CSS Color Parser]: https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser
diff --git a/vanilla/node_modules/@csstools/css-color-parser/dist/index.d.ts b/vanilla/node_modules/@csstools/css-color-parser/dist/index.d.ts
new file mode 100644
index 0000000..e4b8600
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-color-parser/dist/index.d.ts
@@ -0,0 +1,168 @@
+import type { Color } from '@csstools/color-helpers';
+import type { ComponentValue } from '@csstools/css-parser-algorithms';
+import { FunctionNode } from '@csstools/css-parser-algorithms';
+
+/**
+ * Convert a color function to a `ColorData` object.
+ *
+ * @param {ComponentValue} colorNode - The color function to be converted.
+ * @returns {ColorData|false} The color function as a `ColorData` object or `false` if it could not be converted.
+ */
+export declare function color(colorNode: ComponentValue): ColorData | false;
+
+/**
+ * A color data object.
+ * It contains as much information as possible about the color and the original parsed syntax.
+ */
+export declare interface ColorData {
+ /**
+ * The color notation of the color data.
+ *
+ * We use "color notation" and not "color space" because these represent the original notation and not the actual color space.
+ * The actual color space is however always implied by the color notation.
+ */
+ colorNotation: ColorNotation;
+ /**
+ * The color channels.
+ * This is always an array of three numbers
+ * but the channels can only be interpreted by looking at the color notation.
+ */
+ channels: Color;
+ /**
+ * The alpha channel.
+ * This is either a number between `0` and `1` or a `ComponentValue` object.
+ *
+ * Since most computations are not dependent on the alpha channel,
+ * we allow things like `var(--some-alpha)` as an alpha channel value for most inputs.
+ */
+ alpha: number | ComponentValue;
+ /**
+ * Information about the original syntax.
+ */
+ syntaxFlags: Set<SyntaxFlag>;
+}
+
+/**
+ * Check if a color data object fits the `display-p3` gamut.
+ *
+ * @param {ColorData} x - The color data to be checked.
+ * @returns {boolean} Whether the color data fits the `display-p3` gamut.
+ */
+export declare function colorDataFitsDisplayP3_Gamut(x: ColorData): boolean;
+
+/**
+ * Check if a color data object fits the `sRGB` gamut.
+ *
+ * @param {ColorData} x - The color data to be checked.
+ * @returns {boolean} Whether the color data fits the `sRGB` gamut.
+ */
+export declare function colorDataFitsRGB_Gamut(x: ColorData): boolean;
+
+export declare enum ColorNotation {
+ /** Adobe 1999, expressed through `color(a98-rgb 0 0 0)` */
+ A98_RGB = "a98-rgb",
+ /** Display P3, expressed through `color(display-p3 0 0 0)` */
+ Display_P3 = "display-p3",
+ /** Display P3, expressed through `color(display-p3-linear 0 0 0)` */
+ Linear_Display_P3 = "display-p3-linear",
+ /** Hex, expressed through `#000` */
+ HEX = "hex",
+ /** HSL, expressed through `hsl(0 0% 0%)` */
+ HSL = "hsl",
+ /** HWB, expressed through `hwb(0 0% 0%)` */
+ HWB = "hwb",
+ /** LCH, expressed through `lch(0 0% 0deg)` */
+ LCH = "lch",
+ /** Lab, expressed through `lab(0 0 0)` */
+ Lab = "lab",
+ /** Linear sRGB, expressed through `color(linear-srgb 0 0 0)` */
+ Linear_sRGB = "srgb-linear",
+ /** Oklch, expressed through `oklch(0 0% 0deg)` */
+ OKLCH = "oklch",
+ /** Oklab, expressed through `oklab(0 0 0)` */
+ OKLab = "oklab",
+ /** ProPhoto RGB, expressed through `color(prophoto-rgb 0 0 0)` */
+ ProPhoto_RGB = "prophoto-rgb",
+ /** RGB, expressed through `rgb(0 0 0)` */
+ RGB = "rgb",
+ /** sRGB, expressed through `color(srgb 0 0 0)` */
+ sRGB = "srgb",
+ /** Rec. 2020, expressed through `color(rec2020 0 0 0)` */
+ Rec2020 = "rec2020",
+ /** XYZ, expressed through `color(xyz-d50 0 0 0)` */
+ XYZ_D50 = "xyz-d50",
+ /** XYZ, expressed through `color(xyz-d65 0 0 0)` */
+ XYZ_D65 = "xyz-d65"
+}
+
+export declare function serializeHSL(color: ColorData, gamutMapping?: boolean): FunctionNode;
+
+/**
+ * Convert color data to component values in the OKLCH color space.
+ * The return value can be converted to a string by calling `toString()` on it.
+ *
+ * @param {ColorData} color - The color data to be serialized.
+ * @returns {FunctionNode} The serialized color data as a FunctionNode object.
+ */
+export declare function serializeOKLCH(color: ColorData): FunctionNode;
+
+/**
+ * Convert color data to component values in the display-p3 color space.
+ * The return value can be converted to a string by calling `toString()` on it.
+ *
+ * @param {ColorData} color - The color data to be serialized.
+ * @param {boolean} gamutMapping - Whether to perform gamut mapping, defaults to `true`.
+ * @returns {FunctionNode} The serialized color data as a FunctionNode object.
+ */
+export declare function serializeP3(color: ColorData, gamutMapping?: boolean): FunctionNode;
+
+/**
+ * Convert color data to component values in the srgb color space.
+ * The return value can be converted to a string by calling `toString()` on it.
+ *
+ * @param {ColorData} color - The color data to be serialized.
+ * @param {boolean} gamutMapping - Whether to perform gamut mapping, defaults to `true`.
+ * @returns {FunctionNode} The serialized color data as a FunctionNode object.
+ */
+export declare function serializeRGB(color: ColorData, gamutMapping?: boolean): FunctionNode;
+
+export declare enum SyntaxFlag {
+ /** Is a color keyword, e.g. `transparent`, `currentColor`, ... */
+ ColorKeyword = "color-keyword",
+ /** Has an explicit alpha channel */
+ HasAlpha = "has-alpha",
+ /** Has a channel with a dimension value, e.g. `50deg` */
+ HasDimensionValues = "has-dimension-values",
+ /** Has a channel with the `none` keyword */
+ HasNoneKeywords = "has-none-keywords",
+ /** Has a channel with a number value */
+ HasNumberValues = "has-number-values",
+ /** Has an alpha channel with a percentage value */
+ HasPercentageAlpha = "has-percentage-alpha",
+ /** Has a channel with a percentage value */
+ HasPercentageValues = "has-percentage-values",
+ /** Has an alpha channel with a `var()` function value */
+ HasVariableAlpha = "has-variable-alpha",
+ /** Is Hex notation */
+ Hex = "hex",
+ /** Is legacy HSL, e.g. `hsl(50deg, 0%, 0%)` */
+ LegacyHSL = "legacy-hsl",
+ /** Is legacy RGB, e.g. `rgb(0, 0, 0)` */
+ LegacyRGB = "legacy-rgb",
+ /** Is a named color, e.g. `red`, `blue` */
+ NamedColor = "named-color",
+ /** Is a relative color syntax, e.g. `rgb(from purple r g b)` */
+ RelativeColorSyntax = "relative-color-syntax",
+ /** Is a mixed color, e.g. `color-mix(in oklch, red, blue)` */
+ ColorMix = "color-mix",
+ /** Is a variadic mixed color, e.g. `color-mix(in oklch, red)` `color-mix(in oklch, red, blue, green)` */
+ ColorMixVariadic = "color-mix-variadic",
+ /** Is a contrasting color, e.g. `contrast-color()` */
+ ContrastColor = "contrast-color",
+ /** Is a relative alpha syntax `alpha(from red / 0.5)` */
+ RelativeAlphaSyntax = "relative-alpha-syntax",
+ /** Is an experimental color syntax */
+ Experimental = "experimental"
+}
+
+export { }
diff --git a/vanilla/node_modules/@csstools/css-color-parser/dist/index.mjs b/vanilla/node_modules/@csstools/css-color-parser/dist/index.mjs
new file mode 100644
index 0000000..761cadf
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-color-parser/dist/index.mjs
@@ -0,0 +1 @@
+import{TokenType as e,NumberType as a,isTokenIdent as n,isTokenPercentage as r,isTokenNumber as o,isTokenDelim as t,isTokenNumeric as l,isTokenComma as s,isTokenDimension as u,isTokenHash as i}from"@csstools/css-tokenizer";import{XYZ_D50_to_XYZ_D65 as c,XYZ_D50_to_XYZ_D50 as h,XYZ_D50_to_OKLab as m,XYZ_D50_to_OKLCH as p,XYZ_D50_to_LCH as N,XYZ_D50_to_Lab as b,XYZ_D50_to_HWB as v,XYZ_D50_to_HSL as g,XYZ_D50_to_a98_RGB as f,XYZ_D50_to_ProPhoto as d,XYZ_D50_to_rec_2020 as y,XYZ_D50_to_lin_P3 as _,XYZ_D50_to_P3 as C,XYZ_D50_to_lin_sRGB as w,XYZ_D50_to_sRGB as x,XYZ_D65_to_XYZ_D50 as L,OKLCH_to_XYZ_D50 as H,LCH_to_XYZ_D50 as P,OKLab_to_XYZ_D50 as k,Lab_to_XYZ_D50 as S,HWB_to_XYZ_D50 as D,HSL_to_XYZ_D50 as M,ProPhoto_RGB_to_XYZ_D50 as F,a98_RGB_to_XYZ_D50 as z,rec_2020_to_XYZ_D50 as Z,lin_P3_to_XYZ_D50 as R,P3_to_XYZ_D50 as B,lin_sRGB_to_XYZ_D50 as V,sRGB_to_XYZ_D50 as T,namedColors as G,inGamut as A,clip as X,gam_sRGB as K,mapGamutRayTrace as Y,OKLCH_to_OKLab as I,OKLab_to_XYZ as O,XYZ_to_lin_sRGB as W,lin_sRGB_to_XYZ as E,XYZ_to_OKLab as U,OKLab_to_OKLCH as $,contrast_ratio_wcag_2_1 as j,gam_P3 as q,XYZ_to_lin_P3 as J,lin_P3_to_XYZ as Q}from"@csstools/color-helpers";import{isWhitespaceNode as ee,isCommentNode as ae,isTokenNode as ne,isFunctionNode as re,TokenNode as oe,isWhiteSpaceOrCommentNode as te,replaceComponentValues as le,FunctionNode as se,WhitespaceNode as ue}from"@csstools/css-parser-algorithms";import{mathFunctionNames as ie,calcFromComponentValues as ce}from"@csstools/css-calc";var he,me;function convertNaNToZero(e){return[Number.isNaN(e[0])?0:e[0],Number.isNaN(e[1])?0:e[1],Number.isNaN(e[2])?0:e[2]]}function colorData_to_XYZ_D50(e){switch(e.colorNotation){case he.HEX:case he.RGB:case he.sRGB:return{...e,colorNotation:he.XYZ_D50,channels:T(convertNaNToZero(e.channels))};case he.Linear_sRGB:return{...e,colorNotation:he.XYZ_D50,channels:V(convertNaNToZero(e.channels))};case he.Display_P3:return{...e,colorNotation:he.XYZ_D50,channels:B(convertNaNToZero(e.channels))};case he.Linear_Display_P3:return{...e,colorNotation:he.XYZ_D50,channels:R(convertNaNToZero(e.channels))};case he.Rec2020:return{...e,colorNotation:he.XYZ_D50,channels:Z(convertNaNToZero(e.channels))};case he.A98_RGB:return{...e,colorNotation:he.XYZ_D50,channels:z(convertNaNToZero(e.channels))};case he.ProPhoto_RGB:return{...e,colorNotation:he.XYZ_D50,channels:F(convertNaNToZero(e.channels))};case he.HSL:return{...e,colorNotation:he.XYZ_D50,channels:M(convertNaNToZero(e.channels))};case he.HWB:return{...e,colorNotation:he.XYZ_D50,channels:D(convertNaNToZero(e.channels))};case he.Lab:return{...e,colorNotation:he.XYZ_D50,channels:S(convertNaNToZero(e.channels))};case he.OKLab:return{...e,colorNotation:he.XYZ_D50,channels:k(convertNaNToZero(e.channels))};case he.LCH:return{...e,colorNotation:he.XYZ_D50,channels:P(convertNaNToZero(e.channels))};case he.OKLCH:return{...e,colorNotation:he.XYZ_D50,channels:H(convertNaNToZero(e.channels))};case he.XYZ_D50:return{...e,colorNotation:he.XYZ_D50,channels:h(convertNaNToZero(e.channels))};case he.XYZ_D65:return{...e,colorNotation:he.XYZ_D50,channels:L(convertNaNToZero(e.channels))};default:throw new Error("Unsupported color notation")}}!function(e){e.A98_RGB="a98-rgb",e.Display_P3="display-p3",e.Linear_Display_P3="display-p3-linear",e.HEX="hex",e.HSL="hsl",e.HWB="hwb",e.LCH="lch",e.Lab="lab",e.Linear_sRGB="srgb-linear",e.OKLCH="oklch",e.OKLab="oklab",e.ProPhoto_RGB="prophoto-rgb",e.RGB="rgb",e.sRGB="srgb",e.Rec2020="rec2020",e.XYZ_D50="xyz-d50",e.XYZ_D65="xyz-d65"}(he||(he={})),function(e){e.ColorKeyword="color-keyword",e.HasAlpha="has-alpha",e.HasDimensionValues="has-dimension-values",e.HasNoneKeywords="has-none-keywords",e.HasNumberValues="has-number-values",e.HasPercentageAlpha="has-percentage-alpha",e.HasPercentageValues="has-percentage-values",e.HasVariableAlpha="has-variable-alpha",e.Hex="hex",e.LegacyHSL="legacy-hsl",e.LegacyRGB="legacy-rgb",e.NamedColor="named-color",e.RelativeColorSyntax="relative-color-syntax",e.ColorMix="color-mix",e.ColorMixVariadic="color-mix-variadic",e.ContrastColor="contrast-color",e.RelativeAlphaSyntax="relative-alpha-syntax",e.Experimental="experimental"}(me||(me={}));const pe=new Set([he.A98_RGB,he.Display_P3,he.Linear_Display_P3,he.HEX,he.Linear_sRGB,he.ProPhoto_RGB,he.RGB,he.sRGB,he.Rec2020,he.XYZ_D50,he.XYZ_D65]);function colorDataTo(e,a){const n={...e};if(e.colorNotation!==a){const e=colorData_to_XYZ_D50(n);switch(a){case he.HEX:case he.RGB:n.colorNotation=he.RGB,n.channels=x(e.channels);break;case he.sRGB:n.colorNotation=he.sRGB,n.channels=x(e.channels);break;case he.Linear_sRGB:n.colorNotation=he.Linear_sRGB,n.channels=w(e.channels);break;case he.Display_P3:n.colorNotation=he.Display_P3,n.channels=C(e.channels);break;case he.Linear_Display_P3:n.colorNotation=he.Linear_Display_P3,n.channels=_(e.channels);break;case he.Rec2020:n.colorNotation=he.Rec2020,n.channels=y(e.channels);break;case he.ProPhoto_RGB:n.colorNotation=he.ProPhoto_RGB,n.channels=d(e.channels);break;case he.A98_RGB:n.colorNotation=he.A98_RGB,n.channels=f(e.channels);break;case he.HSL:n.colorNotation=he.HSL,n.channels=g(e.channels);break;case he.HWB:n.colorNotation=he.HWB,n.channels=v(e.channels);break;case he.Lab:n.colorNotation=he.Lab,n.channels=b(e.channels);break;case he.LCH:n.colorNotation=he.LCH,n.channels=N(e.channels);break;case he.OKLCH:n.colorNotation=he.OKLCH,n.channels=p(e.channels);break;case he.OKLab:n.colorNotation=he.OKLab,n.channels=m(e.channels);break;case he.XYZ_D50:n.colorNotation=he.XYZ_D50,n.channels=h(e.channels);break;case he.XYZ_D65:n.colorNotation=he.XYZ_D65,n.channels=c(e.channels);break;default:throw new Error("Unsupported color notation")}}else n.channels=convertNaNToZero(e.channels);if(a===e.colorNotation)n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[0,1,2]);else if(pe.has(a)&&pe.has(e.colorNotation))n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[0,1,2]);else switch(a){case he.HSL:switch(e.colorNotation){case he.HWB:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[0]);break;case he.Lab:case he.OKLab:n.channels=carryForwardMissingComponents(e.channels,[2],n.channels,[0]);break;case he.LCH:case he.OKLCH:n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[2,1,0])}break;case he.HWB:switch(e.colorNotation){case he.HSL:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[0]);break;case he.LCH:case he.OKLCH:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[2])}break;case he.Lab:case he.OKLab:switch(e.colorNotation){case he.HSL:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[2]);break;case he.Lab:case he.OKLab:n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[0,1,2]);break;case he.LCH:case he.OKLCH:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[0])}break;case he.LCH:case he.OKLCH:switch(e.colorNotation){case he.HSL:n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[2,1,0]);break;case he.HWB:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[2]);break;case he.Lab:case he.OKLab:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[0]);break;case he.LCH:case he.OKLCH:n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[0,1,2])}}return n.channels=convertPowerlessComponentsToMissingComponents(n.channels,a),n}function convertPowerlessComponentsToMissingComponents(e,a){const n=[...e];switch(a){case he.HSL:!Number.isNaN(n[1])&&reducePrecision(n[1],4)<=0&&(n[0]=Number.NaN);break;case he.HWB:Math.max(0,reducePrecision(n[1],4))+Math.max(0,reducePrecision(n[2],4))>=100&&(n[0]=Number.NaN);break;case he.LCH:!Number.isNaN(n[1])&&reducePrecision(n[1],4)<=0&&(n[2]=Number.NaN);break;case he.OKLCH:!Number.isNaN(n[1])&&reducePrecision(n[1],6)<=0&&(n[2]=Number.NaN)}return n}function convertPowerlessComponentsToZeroValuesForDisplay(e,a){const n=[...e];switch(a){case he.HSL:(reducePrecision(n[2])<=0||reducePrecision(n[2])>=100)&&(n[0]=Number.NaN,n[1]=Number.NaN),reducePrecision(n[1])<=0&&(n[0]=Number.NaN);break;case he.HWB:Math.max(0,reducePrecision(n[1]))+Math.max(0,reducePrecision(n[2]))>=100&&(n[0]=Number.NaN);break;case he.Lab:(reducePrecision(n[0])<=0||reducePrecision(n[0])>=100)&&(n[1]=Number.NaN,n[2]=Number.NaN);break;case he.LCH:reducePrecision(n[1])<=0&&(n[2]=Number.NaN),(reducePrecision(n[0])<=0||reducePrecision(n[0])>=100)&&(n[1]=Number.NaN,n[2]=Number.NaN);break;case he.OKLab:(reducePrecision(n[0])<=0||reducePrecision(n[0])>=1)&&(n[1]=Number.NaN,n[2]=Number.NaN);break;case he.OKLCH:reducePrecision(n[1])<=0&&(n[2]=Number.NaN),(reducePrecision(n[0])<=0||reducePrecision(n[0])>=1)&&(n[1]=Number.NaN,n[2]=Number.NaN)}return n}function carryForwardMissingComponents(e,a,n,r){const o=[...n];for(const n of a)Number.isNaN(e[a[n]])&&(o[r[n]]=Number.NaN);return o}function normalizeRelativeColorDataChannels(e){const a=new Map;switch(e.colorNotation){case he.RGB:case he.HEX:a.set("r",dummyNumberToken(255*e.channels[0])),a.set("g",dummyNumberToken(255*e.channels[1])),a.set("b",dummyNumberToken(255*e.channels[2])),"number"==typeof e.alpha&&a.set("alpha",dummyNumberToken(e.alpha));break;case he.HSL:a.set("h",dummyNumberToken(e.channels[0])),a.set("s",dummyNumberToken(e.channels[1])),a.set("l",dummyNumberToken(e.channels[2])),"number"==typeof e.alpha&&a.set("alpha",dummyNumberToken(e.alpha));break;case he.HWB:a.set("h",dummyNumberToken(e.channels[0])),a.set("w",dummyNumberToken(e.channels[1])),a.set("b",dummyNumberToken(e.channels[2])),"number"==typeof e.alpha&&a.set("alpha",dummyNumberToken(e.alpha));break;case he.Lab:case he.OKLab:a.set("l",dummyNumberToken(e.channels[0])),a.set("a",dummyNumberToken(e.channels[1])),a.set("b",dummyNumberToken(e.channels[2])),"number"==typeof e.alpha&&a.set("alpha",dummyNumberToken(e.alpha));break;case he.LCH:case he.OKLCH:a.set("l",dummyNumberToken(e.channels[0])),a.set("c",dummyNumberToken(e.channels[1])),a.set("h",dummyNumberToken(e.channels[2])),"number"==typeof e.alpha&&a.set("alpha",dummyNumberToken(e.alpha));break;case he.sRGB:case he.A98_RGB:case he.Display_P3:case he.Linear_Display_P3:case he.Rec2020:case he.Linear_sRGB:case he.ProPhoto_RGB:a.set("r",dummyNumberToken(e.channels[0])),a.set("g",dummyNumberToken(e.channels[1])),a.set("b",dummyNumberToken(e.channels[2])),"number"==typeof e.alpha&&a.set("alpha",dummyNumberToken(e.alpha));break;case he.XYZ_D50:case he.XYZ_D65:a.set("x",dummyNumberToken(e.channels[0])),a.set("y",dummyNumberToken(e.channels[1])),a.set("z",dummyNumberToken(e.channels[2])),"number"==typeof e.alpha&&a.set("alpha",dummyNumberToken(e.alpha))}return a}function noneToZeroInRelativeColorDataChannels(e){const a=new Map(e);for(const[n,r]of e)Number.isNaN(r[4].value)&&a.set(n,dummyNumberToken(0));return a}function dummyNumberToken(n){return Number.isNaN(n)?[e.Number,"none",-1,-1,{value:Number.NaN,type:a.Number}]:[e.Number,n.toString(),-1,-1,{value:n,type:a.Number}]}function reducePrecision(e,a=7){if(Number.isNaN(e))return 0;const n=Math.pow(10,a);return Math.round(e*n)/n}function colorDataFitsRGB_Gamut(e){const a={...e,channels:[...e.channels]};a.channels=convertPowerlessComponentsToZeroValuesForDisplay(a.channels,a.colorNotation);return!colorDataTo(a,he.RGB).channels.find(e=>e<-1e-5||e>1.00001)}function colorDataFitsDisplayP3_Gamut(e){const a={...e,channels:[...e.channels]};a.channels=convertPowerlessComponentsToZeroValuesForDisplay(a.channels,a.colorNotation);return!colorDataTo(a,he.Display_P3).channels.find(e=>e<-1e-5||e>1.00001)}function normalize(e,a,n,r){return Math.min(Math.max(e/a,n),r)}const Ne=/[A-Z]/g;function toLowerCaseAZ(e){return e.replace(Ne,e=>String.fromCharCode(e.charCodeAt(0)+32))}function normalize_Color_ChannelValues(t,l,s){if(n(t)&&"none"===toLowerCaseAZ(t[4].value))return s.syntaxFlags.add(me.HasNoneKeywords),[e.Number,"none",t[2],t[3],{value:Number.NaN,type:a.Number}];if(r(t)){3!==l&&s.syntaxFlags.add(me.HasPercentageValues);let n=normalize(t[4].value,100,-2147483647,2147483647);return 3===l&&(n=normalize(t[4].value,100,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}if(o(t)){3!==l&&s.syntaxFlags.add(me.HasNumberValues);let n=normalize(t[4].value,1,-2147483647,2147483647);return 3===l&&(n=normalize(t[4].value,1,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}return!1}const be=new Set(["srgb","srgb-linear","display-p3","display-p3-linear","a98-rgb","prophoto-rgb","rec2020","xyz","xyz-d50","xyz-d65"]);function color$1(e,a){const r=[],s=[],u=[],i=[];let c,h,m=!1,p=!1;const N={colorNotation:he.sRGB,channels:[0,0,0],alpha:1,syntaxFlags:new Set([])};let b=r;for(let o=0;o<e.value.length;o++){let v=e.value[o];if(ee(v)||ae(v))for(;ee(e.value[o+1])||ae(e.value[o+1]);)o++;else if(b===r&&r.length&&(b=s),b===s&&s.length&&(b=u),ne(v)&&t(v.value)&&"/"===v.value[4].value){if(b===i)return!1;b=i}else{if(re(v)){if(b===i&&"var"===toLowerCaseAZ(v.getName())){N.syntaxFlags.add(me.HasVariableAlpha),b.push(v);continue}if(!ie.has(toLowerCaseAZ(v.getName())))return!1;const[[e]]=ce([[v]],{censorIntoStandardRepresentableValues:!0,globals:h,precision:-1,toCanonicalUnits:!0,rawPercentages:!0});if(!e||!ne(e)||!l(e.value))return!1;Number.isNaN(e.value[4].value)&&(e.value[4].value=0),v=e}if(b===r&&0===r.length&&ne(v)&&n(v.value)&&be.has(toLowerCaseAZ(v.value[4].value))){if(m)return!1;m=toLowerCaseAZ(v.value[4].value),N.colorNotation=colorSpaceNameToColorNotation(m),p&&(p.colorNotation!==N.colorNotation&&(p=colorDataTo(p,N.colorNotation)),c=normalizeRelativeColorDataChannels(p),h=noneToZeroInRelativeColorDataChannels(c))}else if(b===r&&0===r.length&&ne(v)&&n(v.value)&&"from"===toLowerCaseAZ(v.value[4].value)){if(p)return!1;if(m)return!1;for(;ee(e.value[o+1])||ae(e.value[o+1]);)o++;if(o++,v=e.value[o],p=a(v),!1===p)return!1;p.syntaxFlags.has(me.Experimental)&&N.syntaxFlags.add(me.Experimental),N.syntaxFlags.add(me.RelativeColorSyntax)}else{if(!ne(v))return!1;if(n(v.value)&&c&&c.has(toLowerCaseAZ(v.value[4].value))){b.push(new oe(c.get(toLowerCaseAZ(v.value[4].value))));continue}b.push(v)}}}if(!m)return!1;if(1!==b.length)return!1;if(1!==r.length||1!==s.length||1!==u.length)return!1;if(!ne(r[0])||!ne(s[0])||!ne(u[0]))return!1;if(c&&!c.has("alpha"))return!1;const v=normalize_Color_ChannelValues(r[0].value,0,N);if(!v||!o(v))return!1;const g=normalize_Color_ChannelValues(s[0].value,1,N);if(!g||!o(g))return!1;const f=normalize_Color_ChannelValues(u[0].value,2,N);if(!f||!o(f))return!1;const d=[v,g,f];if(1===i.length)if(N.syntaxFlags.add(me.HasAlpha),ne(i[0])){const e=normalize_Color_ChannelValues(i[0].value,3,N);if(!e||!o(e))return!1;d.push(e)}else N.alpha=i[0];else if(c&&c.has("alpha")){const e=normalize_Color_ChannelValues(c.get("alpha"),3,N);if(!e||!o(e))return!1;d.push(e)}return N.channels=[d[0][4].value,d[1][4].value,d[2][4].value],4===d.length&&(N.alpha=d[3][4].value),N}function colorSpaceNameToColorNotation(e){switch(e){case"srgb":return he.sRGB;case"srgb-linear":return he.Linear_sRGB;case"display-p3":return he.Display_P3;case"display-p3-linear":return he.Linear_Display_P3;case"a98-rgb":return he.A98_RGB;case"prophoto-rgb":return he.ProPhoto_RGB;case"rec2020":return he.Rec2020;case"xyz":case"xyz-d65":return he.XYZ_D65;case"xyz-d50":return he.XYZ_D50;default:throw new Error("Unknown color space name: "+e)}}const ve=new Set(["srgb","srgb-linear","display-p3","display-p3-linear","a98-rgb","prophoto-rgb","rec2020","lab","oklab","xyz","xyz-d50","xyz-d65"]),ge=new Set(["hsl","hwb","lch","oklch"]),fe=new Set(["shorter","longer","increasing","decreasing"]);function colorMix(e,a){let r=null,o=null,t=null,l=!1;for(let u=0;u<e.value.length;u++){const i=e.value[u];if(!te(i)){if(!(r||ne(i)&&n(i.value)&&"in"===toLowerCaseAZ(i.value[4].value)))return colorMixRectangular("oklab",colorMixComponents(e.value,a));if(ne(i)&&n(i.value)){if(!r&&"in"===toLowerCaseAZ(i.value[4].value)){r=i;continue}if(r&&!o){o=toLowerCaseAZ(i.value[4].value);continue}if(r&&o&&!t&&ge.has(o)){t=toLowerCaseAZ(i.value[4].value);continue}if(r&&o&&t&&!l&&"hue"===toLowerCaseAZ(i.value[4].value)){l=!0;continue}return!1}return!(!ne(i)||!s(i.value))&&(!!o&&(t||l?!!(o&&t&&l&&ge.has(o)&&fe.has(t))&&colorMixPolar(o,t,colorMixComponents(e.value.slice(u+1),a)):ve.has(o)?colorMixRectangular(o,colorMixComponents(e.value.slice(u+1),a)):!!ge.has(o)&&colorMixPolar(o,"shorter",colorMixComponents(e.value.slice(u+1),a))))}}return!1}function colorMixComponents(e,a){const n=[];let o=1,t=!1,u=!1;for(let o=0;o<e.length;o++){let i=e[o];if(!te(i)){if(!ne(i)||!s(i.value)){if(!t){const e=a(i);if(e){t=e;continue}}if(!u){if(re(i)&&ie.has(toLowerCaseAZ(i.getName()))){if([[i]]=ce([[i]],{censorIntoStandardRepresentableValues:!0,precision:-1,toCanonicalUnits:!0,rawPercentages:!0}),!i||!ne(i)||!l(i.value))return!1;Number.isNaN(i.value[4].value)&&(i.value[4].value=0)}if(ne(i)&&r(i.value)&&i.value[4].value>=0){u=i.value[4].value;continue}}return!1}if(!t)return!1;n.push({color:t,percentage:u}),t=!1,u=!1}}if(!t)return!1;n.push({color:t,percentage:u});let i=0,c=0;for(let e=0;e<n.length;e++){const a=n[e].percentage;if(!1!==a){if(a<0||a>100)return!1;i+=a}else c++}const h=Math.max(0,100-i);i=0;for(let e=0;e<n.length;e++)!1===n[e].percentage&&(n[e].percentage=h/c),i+=n[e].percentage;if(0===i)return{colors:[{color:{channels:[0,0,0],colorNotation:he.sRGB,alpha:0,syntaxFlags:new Set},percentage:0}],alphaMultiplier:0};if(i>100)for(let e=0;e<n.length;e++){let a=n[e].percentage;a=a/i*100,n[e].percentage=a}if(i<100){o=i/100;for(let e=0;e<n.length;e++){let a=n[e].percentage;a=a/i*100,n[e].percentage=a}}return{colors:n,alphaMultiplier:o}}function colorMixRectangular(e,a){if(!a||!a.colors.length)return!1;const n=a.colors.slice();n.reverse();let r=he.RGB;switch(e){case"srgb":r=he.RGB;break;case"srgb-linear":r=he.Linear_sRGB;break;case"display-p3":r=he.Display_P3;break;case"display-p3-linear":r=he.Linear_Display_P3;break;case"a98-rgb":r=he.A98_RGB;break;case"prophoto-rgb":r=he.ProPhoto_RGB;break;case"rec2020":r=he.Rec2020;break;case"lab":r=he.Lab;break;case"oklab":r=he.OKLab;break;case"xyz-d50":r=he.XYZ_D50;break;case"xyz":case"xyz-d65":r=he.XYZ_D65;break;default:return!1}if(1===n.length){const e=colorDataTo(n[0].color,r);return e.colorNotation=r,e.syntaxFlags.add(me.ColorMixVariadic),"number"!=typeof e.alpha?!1:(e.alpha=e.alpha*a.alphaMultiplier,e)}for(;n.length>=2;){const e=n.pop(),a=n.pop();if(!e||!a)return!1;const o=colorMixRectangularPair(r,e.color,e.percentage,a.color,a.percentage);if(!o)return!1;n.push({color:o,percentage:e.percentage+a.percentage})}const o=n[0]?.color;return!!o&&(a.colors.some(e=>e.color.syntaxFlags.has(me.Experimental))&&o.syntaxFlags.add(me.Experimental),"number"==typeof o.alpha&&(o.alpha=o.alpha*a.alphaMultiplier,2!==a.colors.length&&o.syntaxFlags.add(me.ColorMixVariadic),o))}function colorMixRectangularPair(e,a,n,r,o){const t=n/(n+o);let l=a.alpha;if("number"!=typeof l)return!1;let s=r.alpha;if("number"!=typeof s)return!1;l=Number.isNaN(l)?s:l,s=Number.isNaN(s)?l:s;const u=colorDataTo(a,e).channels,i=colorDataTo(r,e).channels;u[0]=fillInMissingComponent(u[0],i[0]),i[0]=fillInMissingComponent(i[0],u[0]),u[1]=fillInMissingComponent(u[1],i[1]),i[1]=fillInMissingComponent(i[1],u[1]),u[2]=fillInMissingComponent(u[2],i[2]),i[2]=fillInMissingComponent(i[2],u[2]),u[0]=premultiply(u[0],l),u[1]=premultiply(u[1],l),u[2]=premultiply(u[2],l),i[0]=premultiply(i[0],s),i[1]=premultiply(i[1],s),i[2]=premultiply(i[2],s);const c=interpolate(l,s,t);return{colorNotation:e,channels:[un_premultiply(interpolate(u[0],i[0],t),c),un_premultiply(interpolate(u[1],i[1],t),c),un_premultiply(interpolate(u[2],i[2],t),c)],alpha:c,syntaxFlags:new Set([me.ColorMix])}}function colorMixPolar(e,a,n){if(!n||!n.colors.length)return!1;const r=n.colors.slice();r.reverse();let o=he.HSL;switch(e){case"hsl":o=he.HSL;break;case"hwb":o=he.HWB;break;case"lch":o=he.LCH;break;case"oklch":o=he.OKLCH;break;default:return!1}if(1===r.length){const e=colorDataTo(r[0].color,o);return e.colorNotation=o,e.syntaxFlags.add(me.ColorMixVariadic),"number"!=typeof e.alpha?!1:(e.alpha=e.alpha*n.alphaMultiplier,e)}for(;r.length>=2;){const e=r.pop(),n=r.pop();if(!e||!n)return!1;const t=colorMixPolarPair(o,a,e.color,e.percentage,n.color,n.percentage);if(!t)return!1;r.push({color:t,percentage:e.percentage+n.percentage})}const t=r[0]?.color;return!!t&&(n.colors.some(e=>e.color.syntaxFlags.has(me.Experimental))&&t.syntaxFlags.add(me.Experimental),"number"==typeof t.alpha&&(t.alpha=t.alpha*n.alphaMultiplier,2!==n.colors.length&&t.syntaxFlags.add(me.ColorMixVariadic),t))}function colorMixPolarPair(e,a,n,r,o,t){const l=r/(r+t);let s=0,u=0,i=0,c=0,h=0,m=0,p=n.alpha;if("number"!=typeof p)return!1;let N=o.alpha;if("number"!=typeof N)return!1;p=Number.isNaN(p)?N:p,N=Number.isNaN(N)?p:N;const b=colorDataTo(n,e).channels,v=colorDataTo(o,e).channels;switch(e){case he.HSL:case he.HWB:s=b[0],u=v[0],i=b[1],c=v[1],h=b[2],m=v[2];break;case he.LCH:case he.OKLCH:i=b[0],c=v[0],h=b[1],m=v[1],s=b[2],u=v[2]}s=fillInMissingComponent(s,u),Number.isNaN(s)&&(s=0),u=fillInMissingComponent(u,s),Number.isNaN(u)&&(u=0),i=fillInMissingComponent(i,c),c=fillInMissingComponent(c,i),h=fillInMissingComponent(h,m),m=fillInMissingComponent(m,h);const g=u-s;switch(a){case"shorter":g>180?s+=360:g<-180&&(u+=360);break;case"longer":-180<g&&g<180&&(g>0?s+=360:u+=360);break;case"increasing":g<0&&(u+=360);break;case"decreasing":g>0&&(s+=360);break;default:throw new Error("Unknown hue interpolation method")}i=premultiply(i,p),h=premultiply(h,p),c=premultiply(c,N),m=premultiply(m,N);let f=[0,0,0];const d=interpolate(p,N,l);switch(e){case he.HSL:case he.HWB:f=[interpolate(s,u,l),un_premultiply(interpolate(i,c,l),d),un_premultiply(interpolate(h,m,l),d)];break;case he.LCH:case he.OKLCH:f=[un_premultiply(interpolate(i,c,l),d),un_premultiply(interpolate(h,m,l),d),interpolate(s,u,l)]}return{colorNotation:e,channels:f,alpha:d,syntaxFlags:new Set([me.ColorMix])}}function fillInMissingComponent(e,a){return Number.isNaN(e)?a:e}function interpolate(e,a,n){return e*n+a*(1-n)}function premultiply(e,a){return Number.isNaN(a)?e:Number.isNaN(e)?Number.NaN:e*a}function un_premultiply(e,a){return 0===a||Number.isNaN(a)?e:Number.isNaN(e)?Number.NaN:e/a}function hex(e){const a=toLowerCaseAZ(e[4].value);if(a.match(/[^a-f0-9]/))return!1;const n={colorNotation:he.HEX,channels:[0,0,0],alpha:1,syntaxFlags:new Set([me.Hex])},r=a.length;if(3===r){const e=a[0],r=a[1],o=a[2];return n.channels=[parseInt(e+e,16)/255,parseInt(r+r,16)/255,parseInt(o+o,16)/255],n}if(6===r){const e=a[0]+a[1],r=a[2]+a[3],o=a[4]+a[5];return n.channels=[parseInt(e,16)/255,parseInt(r,16)/255,parseInt(o,16)/255],n}if(4===r){const e=a[0],r=a[1],o=a[2],t=a[3];return n.channels=[parseInt(e+e,16)/255,parseInt(r+r,16)/255,parseInt(o+o,16)/255],n.alpha=parseInt(t+t,16)/255,n.syntaxFlags.add(me.HasAlpha),n}if(8===r){const e=a[0]+a[1],r=a[2]+a[3],o=a[4]+a[5],t=a[6]+a[7];return n.channels=[parseInt(e,16)/255,parseInt(r,16)/255,parseInt(o,16)/255],n.alpha=parseInt(t,16)/255,n.syntaxFlags.add(me.HasAlpha),n}return!1}function normalizeHue(n){if(o(n))return n[4].value=n[4].value%360,n[1]=n[4].value.toString(),n;if(u(n)){let r=n[4].value;switch(toLowerCaseAZ(n[4].unit)){case"deg":break;case"rad":r=180*n[4].value/Math.PI;break;case"grad":r=.9*n[4].value;break;case"turn":r=360*n[4].value;break;default:return!1}return r%=360,[e.Number,r.toString(),n[2],n[3],{value:r,type:a.Number}]}return!1}function normalize_legacy_HSL_ChannelValues(n,t,l){if(0===t){const e=normalizeHue(n);return!1!==e&&(u(n)&&l.syntaxFlags.add(me.HasDimensionValues),e)}if(r(n)){3===t?l.syntaxFlags.add(me.HasPercentageAlpha):l.syntaxFlags.add(me.HasPercentageValues);let r=normalize(n[4].value,1,0,100);return 3===t&&(r=normalize(n[4].value,100,0,1)),[e.Number,r.toString(),n[2],n[3],{value:r,type:a.Number}]}if(o(n)){if(3!==t)return!1;let r=normalize(n[4].value,1,0,100);return 3===t&&(r=normalize(n[4].value,1,0,1)),[e.Number,r.toString(),n[2],n[3],{value:r,type:a.Number}]}return!1}function normalize_modern_HSL_ChannelValues(t,l,s){if(n(t)&&"none"===toLowerCaseAZ(t[4].value))return s.syntaxFlags.add(me.HasNoneKeywords),[e.Number,"none",t[2],t[3],{value:Number.NaN,type:a.Number}];if(0===l){const e=normalizeHue(t);return!1!==e&&(u(t)&&s.syntaxFlags.add(me.HasDimensionValues),e)}if(r(t)){3===l?s.syntaxFlags.add(me.HasPercentageAlpha):s.syntaxFlags.add(me.HasPercentageValues);let n=t[4].value;return 3===l?n=normalize(t[4].value,100,0,1):1===l&&(n=normalize(t[4].value,1,0,2147483647)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}if(o(t)){3!==l&&s.syntaxFlags.add(me.HasNumberValues);let n=t[4].value;return 3===l?n=normalize(t[4].value,1,0,1):1===l&&(n=normalize(t[4].value,1,0,2147483647)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}return!1}function threeChannelLegacySyntax(e,a,n,r){const t=[],u=[],i=[],c=[],h={colorNotation:n,channels:[0,0,0],alpha:1,syntaxFlags:new Set(r)};let m=t;for(let a=0;a<e.value.length;a++){let n=e.value[a];if(!ee(n)&&!ae(n)){if(ne(n)&&s(n.value)){if(m===t){m=u;continue}if(m===u){m=i;continue}if(m===i){m=c;continue}if(m===c)return!1}if(re(n)){if(m===c&&"var"===n.getName().toLowerCase()){h.syntaxFlags.add(me.HasVariableAlpha),m.push(n);continue}if(!ie.has(n.getName().toLowerCase()))return!1;const[[e]]=ce([[n]],{censorIntoStandardRepresentableValues:!0,precision:-1,toCanonicalUnits:!0,rawPercentages:!0});if(!e||!ne(e)||!l(e.value))return!1;Number.isNaN(e.value[4].value)&&(e.value[4].value=0),n=e}if(!ne(n))return!1;m.push(n)}}if(1!==m.length)return!1;if(1!==t.length||1!==u.length||1!==i.length)return!1;if(!ne(t[0])||!ne(u[0])||!ne(i[0]))return!1;const p=a(t[0].value,0,h);if(!p||!o(p))return!1;const N=a(u[0].value,1,h);if(!N||!o(N))return!1;const b=a(i[0].value,2,h);if(!b||!o(b))return!1;const v=[p,N,b];if(1===c.length)if(h.syntaxFlags.add(me.HasAlpha),ne(c[0])){const e=a(c[0].value,3,h);if(!e||!o(e))return!1;v.push(e)}else h.alpha=c[0];return h.channels=[v[0][4].value,v[1][4].value,v[2][4].value],4===v.length&&(h.alpha=v[3][4].value),h}function threeChannelSpaceSeparated(e,a,r,s,u){const i=[],c=[],h=[],m=[];let p,N,b=!1;const v={colorNotation:r,channels:[0,0,0],alpha:1,syntaxFlags:new Set(s)};let g=i;for(let a=0;a<e.value.length;a++){let o=e.value[a];if(ee(o)||ae(o))for(;ee(e.value[a+1])||ae(e.value[a+1]);)a++;else if(g===i&&i.length&&(g=c),g===c&&c.length&&(g=h),ne(o)&&t(o.value)&&"/"===o.value[4].value){if(g===m)return!1;g=m}else{if(re(o)){if(g===m&&"var"===o.getName().toLowerCase()){v.syntaxFlags.add(me.HasVariableAlpha),g.push(o);continue}if(!ie.has(o.getName().toLowerCase()))return!1;const[[e]]=ce([[o]],{censorIntoStandardRepresentableValues:!0,globals:N,precision:-1,toCanonicalUnits:!0,rawPercentages:!0});if(!e||!ne(e)||!l(e.value))return!1;Number.isNaN(e.value[4].value)&&(e.value[4].value=0),o=e}if(g===i&&0===i.length&&ne(o)&&n(o.value)&&"from"===o.value[4].value.toLowerCase()){if(b)return!1;for(;ee(e.value[a+1])||ae(e.value[a+1]);)a++;if(a++,o=e.value[a],b=u(o),!1===b)return!1;b.syntaxFlags.has(me.Experimental)&&v.syntaxFlags.add(me.Experimental),v.syntaxFlags.add(me.RelativeColorSyntax),b.colorNotation!==r&&(b=colorDataTo(b,r)),p=normalizeRelativeColorDataChannels(b),N=noneToZeroInRelativeColorDataChannels(p)}else{if(!ne(o))return!1;if(n(o.value)&&p){const e=o.value[4].value.toLowerCase();if(p.has(e)){g.push(new oe(p.get(e)));continue}}g.push(o)}}}if(1!==g.length)return!1;if(1!==i.length||1!==c.length||1!==h.length)return!1;if(!ne(i[0])||!ne(c[0])||!ne(h[0]))return!1;if(p&&!p.has("alpha"))return!1;const f=a(i[0].value,0,v);if(!f||!o(f))return!1;const d=a(c[0].value,1,v);if(!d||!o(d))return!1;const y=a(h[0].value,2,v);if(!y||!o(y))return!1;const _=[f,d,y];if(1===m.length)if(v.syntaxFlags.add(me.HasAlpha),ne(m[0])){const e=a(m[0].value,3,v);if(!e||!o(e))return!1;_.push(e)}else v.alpha=m[0];else if(p&&p.has("alpha")){const e=a(p.get("alpha"),3,v);if(!e||!o(e))return!1;_.push(e)}return v.channels=[_[0][4].value,_[1][4].value,_[2][4].value],4===_.length&&(v.alpha=_[3][4].value),v}function hsl(e,a){if(e.value.some(e=>ne(e)&&s(e.value))){const a=hslCommaSeparated(e);if(!1!==a)return a}{const n=hslSpaceSeparated(e,a);if(!1!==n)return n}return!1}function hslCommaSeparated(e){return threeChannelLegacySyntax(e,normalize_legacy_HSL_ChannelValues,he.HSL,[me.LegacyHSL])}function hslSpaceSeparated(e,a){return threeChannelSpaceSeparated(e,normalize_modern_HSL_ChannelValues,he.HSL,[],a)}function normalize_HWB_ChannelValues(t,l,s){if(n(t)&&"none"===toLowerCaseAZ(t[4].value))return s.syntaxFlags.add(me.HasNoneKeywords),[e.Number,"none",t[2],t[3],{value:Number.NaN,type:a.Number}];if(0===l){const e=normalizeHue(t);return!1!==e&&(u(t)&&s.syntaxFlags.add(me.HasDimensionValues),e)}if(r(t)){3===l?s.syntaxFlags.add(me.HasPercentageAlpha):s.syntaxFlags.add(me.HasPercentageValues);let n=t[4].value;return 3===l&&(n=normalize(t[4].value,100,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}if(o(t)){3!==l&&s.syntaxFlags.add(me.HasNumberValues);let n=t[4].value;return 3===l&&(n=normalize(t[4].value,1,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}return!1}function normalize_Lab_ChannelValues(t,l,s){if(n(t)&&"none"===toLowerCaseAZ(t[4].value))return s.syntaxFlags.add(me.HasNoneKeywords),[e.Number,"none",t[2],t[3],{value:Number.NaN,type:a.Number}];if(r(t)){3!==l&&s.syntaxFlags.add(me.HasPercentageValues);let n=normalize(t[4].value,1,0,100);return 1===l||2===l?n=normalize(t[4].value,.8,-2147483647,2147483647):3===l&&(n=normalize(t[4].value,100,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}if(o(t)){3!==l&&s.syntaxFlags.add(me.HasNumberValues);let n=normalize(t[4].value,1,0,100);return 1===l||2===l?n=normalize(t[4].value,1,-2147483647,2147483647):3===l&&(n=normalize(t[4].value,1,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}return!1}function lab(e,a){return threeChannelSpaceSeparated(e,normalize_Lab_ChannelValues,he.Lab,[],a)}function normalize_LCH_ChannelValues(t,l,s){if(n(t)&&"none"===toLowerCaseAZ(t[4].value))return s.syntaxFlags.add(me.HasNoneKeywords),[e.Number,"none",t[2],t[3],{value:Number.NaN,type:a.Number}];if(2===l){const e=normalizeHue(t);return!1!==e&&(u(t)&&s.syntaxFlags.add(me.HasDimensionValues),e)}if(r(t)){3!==l&&s.syntaxFlags.add(me.HasPercentageValues);let n=normalize(t[4].value,1,0,100);return 1===l?n=normalize(t[4].value,100/150,0,2147483647):3===l&&(n=normalize(t[4].value,100,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}if(o(t)){3!==l&&s.syntaxFlags.add(me.HasNumberValues);let n=normalize(t[4].value,1,0,100);return 1===l?n=normalize(t[4].value,1,0,2147483647):3===l&&(n=normalize(t[4].value,1,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}return!1}function lch(e,a){return threeChannelSpaceSeparated(e,normalize_LCH_ChannelValues,he.LCH,[],a)}const de=new Map;for(const[e,a]of Object.entries(G))de.set(e,a);function namedColor(e){const a=de.get(toLowerCaseAZ(e));return!!a&&{colorNotation:he.RGB,channels:[a[0]/255,a[1]/255,a[2]/255],alpha:1,syntaxFlags:new Set([me.ColorKeyword,me.NamedColor])}}function normalize_OKLab_ChannelValues(t,l,s){if(n(t)&&"none"===toLowerCaseAZ(t[4].value))return s.syntaxFlags.add(me.HasNoneKeywords),[e.Number,"none",t[2],t[3],{value:Number.NaN,type:a.Number}];if(r(t)){3!==l&&s.syntaxFlags.add(me.HasPercentageValues);let n=normalize(t[4].value,100,0,1);return 1===l||2===l?n=normalize(t[4].value,250,-2147483647,2147483647):3===l&&(n=normalize(t[4].value,100,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}if(o(t)){3!==l&&s.syntaxFlags.add(me.HasNumberValues);let n=normalize(t[4].value,1,0,1);return 1===l||2===l?n=normalize(t[4].value,1,-2147483647,2147483647):3===l&&(n=normalize(t[4].value,1,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}return!1}function oklab(e,a){return threeChannelSpaceSeparated(e,normalize_OKLab_ChannelValues,he.OKLab,[],a)}function normalize_OKLCH_ChannelValues(t,l,s){if(n(t)&&"none"===toLowerCaseAZ(t[4].value))return s.syntaxFlags.add(me.HasNoneKeywords),[e.Number,"none",t[2],t[3],{value:Number.NaN,type:a.Number}];if(2===l){const e=normalizeHue(t);return!1!==e&&(u(t)&&s.syntaxFlags.add(me.HasDimensionValues),e)}if(r(t)){3!==l&&s.syntaxFlags.add(me.HasPercentageValues);let n=normalize(t[4].value,100,0,1);return 1===l?n=normalize(t[4].value,250,0,2147483647):3===l&&(n=normalize(t[4].value,100,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}if(o(t)){3!==l&&s.syntaxFlags.add(me.HasNumberValues);let n=normalize(t[4].value,1,0,1);return 1===l?n=normalize(t[4].value,1,0,2147483647):3===l&&(n=normalize(t[4].value,1,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}return!1}function oklch(e,a){return threeChannelSpaceSeparated(e,normalize_OKLCH_ChannelValues,he.OKLCH,[],a)}function normalize_legacy_sRGB_ChannelValues(n,t,l){if(r(n)){3===t?l.syntaxFlags.add(me.HasPercentageAlpha):l.syntaxFlags.add(me.HasPercentageValues);const r=normalize(n[4].value,100,0,1);return[e.Number,r.toString(),n[2],n[3],{value:r,type:a.Number}]}if(o(n)){3!==t&&l.syntaxFlags.add(me.HasNumberValues);let r=normalize(n[4].value,255,0,1);return 3===t&&(r=normalize(n[4].value,1,0,1)),[e.Number,r.toString(),n[2],n[3],{value:r,type:a.Number}]}return!1}function normalize_modern_sRGB_ChannelValues(t,l,s){if(n(t)&&"none"===t[4].value.toLowerCase())return s.syntaxFlags.add(me.HasNoneKeywords),[e.Number,"none",t[2],t[3],{value:Number.NaN,type:a.Number}];if(r(t)){3!==l&&s.syntaxFlags.add(me.HasPercentageValues);let n=normalize(t[4].value,100,-2147483647,2147483647);return 3===l&&(n=normalize(t[4].value,100,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}if(o(t)){3!==l&&s.syntaxFlags.add(me.HasNumberValues);let n=normalize(t[4].value,255,-2147483647,2147483647);return 3===l&&(n=normalize(t[4].value,1,0,1)),[e.Number,n.toString(),t[2],t[3],{value:n,type:a.Number}]}return!1}function rgb(e,a){if(e.value.some(e=>ne(e)&&s(e.value))){const a=rgbCommaSeparated(e);if(!1!==a)return(!a.syntaxFlags.has(me.HasNumberValues)||!a.syntaxFlags.has(me.HasPercentageValues))&&a}else{const n=rgbSpaceSeparated(e,a);if(!1!==n)return n}return!1}function rgbCommaSeparated(e){return threeChannelLegacySyntax(e,normalize_legacy_sRGB_ChannelValues,he.RGB,[me.LegacyRGB])}function rgbSpaceSeparated(e,a){return threeChannelSpaceSeparated(e,normalize_modern_sRGB_ChannelValues,he.RGB,[],a)}function XYZ_D50_to_sRGB_Gamut(e){const a=x(e);if(A(a))return X(a);let n=e;return n=p(n),n[0]<1e-6&&(n=[0,0,0]),n[0]>.999999&&(n=[1,0,0]),K(Y(n,oklch_to_lin_srgb,lin_srgb_to_oklch))}function oklch_to_lin_srgb(e){return e=I(e),e=O(e),W(e)}function lin_srgb_to_oklch(e){return e=E(e),e=U(e),$(e)}function contrastColor(e,a){let n=!1;for(let r=0;r<e.value.length;r++){const o=e.value[r];if(!ee(o)&&!ae(o)&&(n||(n=a(o),!n)))return!1}if(!n)return!1;n.channels=convertNaNToZero(n.channels),n.channels=XYZ_D50_to_sRGB_Gamut(colorData_to_XYZ_D50(n).channels),n.colorNotation=he.sRGB;const r={colorNotation:he.sRGB,channels:[0,0,0],alpha:1,syntaxFlags:new Set([me.ContrastColor,me.Experimental])},o=j(n.channels,[1,1,1]),t=j(n.channels,[0,0,0]);return r.channels=o>t?[1,1,1]:[0,0,0],r}function alpha(e,a){let r,s,u=!1,i=!1,c=!1;const h={colorNotation:he.sRGB,channels:[0,0,0],alpha:1,syntaxFlags:new Set([])};for(let m=0;m<e.value.length;m++){let p=e.value[m];if(ee(p)||ae(p))for(;ee(e.value[m+1])||ae(e.value[m+1]);)m++;else if(c&&!u&&!i&&ne(p)&&t(p.value)&&"/"===p.value[4].value)u=!0;else{if(re(p)&&ie.has(toLowerCaseAZ(p.getName()))){const[[e]]=ce([[p]],{censorIntoStandardRepresentableValues:!0,globals:s,precision:-1,toCanonicalUnits:!0,rawPercentages:!0});if(!e||!ne(e)||!l(e.value))return!1;Number.isNaN(e.value[4].value)&&(e.value[4].value=0),p=e}if(u||i||!ne(p)||!n(p.value)||"from"!==toLowerCaseAZ(p.value[4].value)){if(!u)return!1;if(i)return!1;if(ne(p)){if(n(p.value)&&"alpha"===toLowerCaseAZ(p.value[4].value)&&r&&r.has("alpha")){h.alpha=r.get("alpha")[4].value,i=!0;continue}const e=normalize_Color_ChannelValues(p.value,3,h);if(!e||!o(e))return!1;h.alpha=new oe(e),i=!0;continue}if(re(p)){const e=le([[p]],e=>{if(ne(e)&&n(e.value)&&"alpha"===toLowerCaseAZ(e.value[4].value)&&r&&r.has("alpha"))return new oe(r.get("alpha"))});h.alpha=e[0][0],i=!0;continue}return!1}if(c)return!1;for(;ee(e.value[m+1])||ae(e.value[m+1]);)m++;if(m++,p=e.value[m],c=a(p),!1===c)return!1;r=normalizeRelativeColorDataChannels(c),s=noneToZeroInRelativeColorDataChannels(r),h.syntaxFlags=new Set(c.syntaxFlags),h.syntaxFlags.add(me.RelativeAlphaSyntax),h.channels=[...c.channels],h.colorNotation=c.colorNotation,h.alpha=c.alpha}}return!!r&&h}function XYZ_D50_to_P3_Gamut(e){const a=C(e);if(A(a))return X(a);let n=e;return n=p(n),n[0]<1e-6&&(n=[0,0,0]),n[0]>.999999&&(n=[1,0,0]),q(Y(n,oklch_to_lin_p3,lin_p3_to_oklch))}function oklch_to_lin_p3(e){return e=I(e),e=O(e),J(e)}function lin_p3_to_oklch(e){return e=Q(e),e=U(e),$(e)}function toPrecision(e,a=7){e=+e,a=+a;const n=(Math.floor(Math.abs(e))+"").length;if(a>n)return+e.toFixed(a-n);{const r=10**(n-a);return Math.round(e/r)*r}}function serializeWithAlpha(n,r,o,t){const l=[e.CloseParen,")",-1,-1,void 0];if("number"==typeof n.alpha){const s=Math.min(1,Math.max(0,toPrecision(Number.isNaN(n.alpha)?0:n.alpha)));return 1===toPrecision(s,4)?new se(r,l,t):new se(r,l,[...t,new ue([o]),new oe([e.Delim,"/",-1,-1,{value:"/"}]),new ue([o]),new oe([e.Number,toPrecision(s,4).toString(),-1,-1,{value:n.alpha,type:a.Integer}])])}return new se(r,l,[...t,new ue([o]),new oe([e.Delim,"/",-1,-1,{value:"/"}]),new ue([o]),n.alpha])}function serializeP3(n,r=!0){n.channels=convertPowerlessComponentsToZeroValuesForDisplay(n.channels,n.colorNotation);let o=n.channels.map(e=>Number.isNaN(e)?0:e);r?o=XYZ_D50_to_P3_Gamut(colorData_to_XYZ_D50(n).channels):n.colorNotation!==he.Display_P3&&(o=C(colorData_to_XYZ_D50(n).channels));const t=r?Math.min(1,Math.max(0,toPrecision(o[0],6))):toPrecision(o[0],6),l=r?Math.min(1,Math.max(0,toPrecision(o[1],6))):toPrecision(o[1],6),s=r?Math.min(1,Math.max(0,toPrecision(o[2],6))):toPrecision(o[2],6),u=[e.Function,"color(",-1,-1,{value:"color"}],i=[e.Whitespace," ",-1,-1,void 0];return serializeWithAlpha(n,u,i,[new oe([e.Ident,"display-p3",-1,-1,{value:"display-p3"}]),new ue([i]),new oe([e.Number,t.toString(),-1,-1,{value:o[0],type:a.Number}]),new ue([i]),new oe([e.Number,l.toString(),-1,-1,{value:o[1],type:a.Number}]),new ue([i]),new oe([e.Number,s.toString(),-1,-1,{value:o[2],type:a.Number}])])}function serializeRGB(n,r=!0){n.channels=convertPowerlessComponentsToZeroValuesForDisplay(n.channels,n.colorNotation);let o=n.channels.map(e=>Number.isNaN(e)?0:e);o=r?XYZ_D50_to_sRGB_Gamut(colorData_to_XYZ_D50(n).channels):x(colorData_to_XYZ_D50(n).channels);const t=Math.min(255,Math.max(0,Math.round(255*toPrecision(o[0])))),l=Math.min(255,Math.max(0,Math.round(255*toPrecision(o[1])))),s=Math.min(255,Math.max(0,Math.round(255*toPrecision(o[2])))),u=[e.CloseParen,")",-1,-1,void 0],i=[e.Whitespace," ",-1,-1,void 0],c=[e.Comma,",",-1,-1,void 0],h=[new oe([e.Number,t.toString(),-1,-1,{value:Math.min(255,255*Math.max(0,o[0])),type:a.Integer}]),new oe(c),new ue([i]),new oe([e.Number,l.toString(),-1,-1,{value:Math.min(255,255*Math.max(0,o[1])),type:a.Integer}]),new oe(c),new ue([i]),new oe([e.Number,s.toString(),-1,-1,{value:Math.min(255,255*Math.max(0,o[2])),type:a.Integer}])];if("number"==typeof n.alpha){const r=Math.min(1,Math.max(0,toPrecision(Number.isNaN(n.alpha)?0:n.alpha)));return 1===toPrecision(r,4)?new se([e.Function,"rgb(",-1,-1,{value:"rgb"}],u,h):new se([e.Function,"rgba(",-1,-1,{value:"rgba"}],u,[...h,new oe(c),new ue([i]),new oe([e.Number,toPrecision(r,4).toString(),-1,-1,{value:n.alpha,type:a.Number}])])}return new se([e.Function,"rgba(",-1,-1,{value:"rgba"}],u,[...h,new oe(c),new ue([i]),n.alpha])}function serializeHSL(n,r=!0){n.channels=convertPowerlessComponentsToZeroValuesForDisplay(n.channels,n.colorNotation);let o=n.channels.map(e=>Number.isNaN(e)?0:e);o=g(r?T(XYZ_D50_to_sRGB_Gamut(colorData_to_XYZ_D50(n).channels)):colorData_to_XYZ_D50(n).channels),o=o.map(e=>Number.isNaN(e)?0:e);const t=Math.min(360,Math.max(0,Math.round(toPrecision(o[0])))),l=Math.min(100,Math.max(0,Math.round(toPrecision(o[1])))),s=Math.min(100,Math.max(0,Math.round(toPrecision(o[2])))),u=[e.CloseParen,")",-1,-1,void 0],i=[e.Whitespace," ",-1,-1,void 0],c=[e.Comma,",",-1,-1,void 0],h=[new oe([e.Number,t.toString(),-1,-1,{value:o[0],type:a.Integer}]),new oe(c),new ue([i]),new oe([e.Percentage,l.toString()+"%",-1,-1,{value:o[1]}]),new oe(c),new ue([i]),new oe([e.Percentage,s.toString()+"%",-1,-1,{value:o[2]}])];if("number"==typeof n.alpha){const r=Math.min(1,Math.max(0,toPrecision(Number.isNaN(n.alpha)?0:n.alpha)));return 1===toPrecision(r,4)?new se([e.Function,"hsl(",-1,-1,{value:"hsl"}],u,h):new se([e.Function,"hsla(",-1,-1,{value:"hsla"}],u,[...h,new oe(c),new ue([i]),new oe([e.Number,toPrecision(r,4).toString(),-1,-1,{value:n.alpha,type:a.Number}])])}return new se([e.Function,"hsla(",-1,-1,{value:"hsla"}],u,[...h,new oe(c),new ue([i]),n.alpha])}function serializeOKLCH(n){n.channels=convertPowerlessComponentsToZeroValuesForDisplay(n.channels,n.colorNotation);let r=n.channels.map(e=>Number.isNaN(e)?0:e);n.colorNotation!==he.OKLCH&&(r=p(colorData_to_XYZ_D50(n).channels));const o=toPrecision(r[0],6),t=toPrecision(r[1],6),l=toPrecision(r[2],6),s=[e.Function,"oklch(",-1,-1,{value:"oklch"}],u=[e.Whitespace," ",-1,-1,void 0];return serializeWithAlpha(n,s,u,[new oe([e.Number,o.toString(),-1,-1,{value:r[0],type:a.Number}]),new ue([u]),new oe([e.Number,t.toString(),-1,-1,{value:r[1],type:a.Number}]),new ue([u]),new oe([e.Number,l.toString(),-1,-1,{value:r[2],type:a.Number}])])}function color(e){if(re(e)){switch(toLowerCaseAZ(e.getName())){case"rgb":case"rgba":return rgb(e,color);case"hsl":case"hsla":return hsl(e,color);case"hwb":return a=color,threeChannelSpaceSeparated(e,normalize_HWB_ChannelValues,he.HWB,[],a);case"lab":return lab(e,color);case"lch":return lch(e,color);case"oklab":return oklab(e,color);case"oklch":return oklch(e,color);case"color":return color$1(e,color);case"color-mix":return colorMix(e,color);case"contrast-color":return contrastColor(e,color);case"alpha":return alpha(e,color)}}var a;if(ne(e)){if(i(e.value))return hex(e.value);if(n(e.value)){const a=namedColor(e.value[4].value);return!1!==a?a:"transparent"===toLowerCaseAZ(e.value[4].value)&&{colorNotation:he.RGB,channels:[0,0,0],alpha:0,syntaxFlags:new Set([me.ColorKeyword])}}}return!1}export{he as ColorNotation,me as SyntaxFlag,color,colorDataFitsDisplayP3_Gamut,colorDataFitsRGB_Gamut,serializeHSL,serializeOKLCH,serializeP3,serializeRGB};
diff --git a/vanilla/node_modules/@csstools/css-color-parser/package.json b/vanilla/node_modules/@csstools/css-color-parser/package.json
new file mode 100644
index 0000000..f75af8f
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-color-parser/package.json
@@ -0,0 +1,64 @@
+{
+ "name": "@csstools/css-color-parser",
+ "description": "Parse CSS color values",
+ "version": "4.0.1",
+ "contributors": [
+ {
+ "name": "Antonio Laguna",
+ "email": "antonio@laguna.es",
+ "url": "https://antonio.laguna.es"
+ },
+ {
+ "name": "Romain Menke",
+ "email": "romainmenke@gmail.com"
+ }
+ ],
+ "license": "MIT",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.mjs"
+ }
+ },
+ "files": [
+ "CHANGELOG.md",
+ "LICENSE.md",
+ "README.md",
+ "dist"
+ ],
+ "dependencies": {
+ "@csstools/color-helpers": "^6.0.1",
+ "@csstools/css-calc": "^3.0.0"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^4.0.0",
+ "@csstools/css-tokenizer": "^4.0.0"
+ },
+ "scripts": {},
+ "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/csstools/postcss-plugins.git",
+ "directory": "packages/css-color-parser"
+ },
+ "bugs": "https://github.com/csstools/postcss-plugins/issues",
+ "keywords": [
+ "color",
+ "css",
+ "parser"
+ ]
+}
diff --git a/vanilla/node_modules/@csstools/css-parser-algorithms/CHANGELOG.md b/vanilla/node_modules/@csstools/css-parser-algorithms/CHANGELOG.md
new file mode 100644
index 0000000..5abd590
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-parser-algorithms/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Changes to CSS Parser Algorithms
+
+### 4.0.0
+
+_January 14, 2026_
+
+- Updated: Support for Node `20.19.0` or later (major).
+- Removed: `commonjs` API. In supported Node versions `require(esm)` will work without needing to make code changes.
+- Updated [`@csstools/css-tokenizer`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-tokenizer) to [`4.0.0`](https://github.com/csstools/postcss-plugins/tree/main/packages/css-tokenizer/CHANGELOG.md#400) (major)
+
+[Full CHANGELOG](https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms/CHANGELOG.md)
diff --git a/vanilla/node_modules/@csstools/css-parser-algorithms/LICENSE.md b/vanilla/node_modules/@csstools/css-parser-algorithms/LICENSE.md
new file mode 100644
index 0000000..af5411f
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-parser-algorithms/LICENSE.md
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright 2022 Romain Menke, Antonio Laguna <antonio@laguna.es>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vanilla/node_modules/@csstools/css-parser-algorithms/README.md b/vanilla/node_modules/@csstools/css-parser-algorithms/README.md
new file mode 100644
index 0000000..a51d668
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-parser-algorithms/README.md
@@ -0,0 +1,119 @@
+# CSS Parser Algorithms <img src="https://cssdb.org/images/css.svg" alt="for CSS" width="90" height="90" align="right">
+
+[<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/css-parser-algorithms.svg" height="20">][npm-url]
+[<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/actions/workflows/test.yml/badge.svg?branch=main" height="20">][cli-url]
+[<img alt="Discord" src="https://shields.io/badge/Discord-5865F2?logo=discord&logoColor=white">][discord]
+
+Implemented from : https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/
+
+## API
+
+[Read the API docs](./docs/css-parser-algorithms.md)
+
+## Usage
+
+Add [CSS Parser Algorithms] to your project:
+
+```bash
+npm install @csstools/css-parser-algorithms @csstools/css-tokenizer --save-dev
+```
+
+[CSS Parser Algorithms] only accepts tokenized CSS.
+It must be used together with `@csstools/css-tokenizer`.
+
+
+```js
+import { tokenizer, TokenType } from '@csstools/css-tokenizer';
+import { parseComponentValue } from '@csstools/css-parser-algorithms';
+
+const myCSS = `@media only screen and (min-width: 768rem) {
+ .foo {
+ content: 'Some content!' !important;
+ }
+}
+`;
+
+const t = tokenizer({
+ css: myCSS,
+});
+
+const tokens = [];
+
+{
+ while (!t.endOfFile()) {
+ tokens.push(t.nextToken());
+ }
+
+ tokens.push(t.nextToken()); // EOF-token
+}
+
+const options = {
+ onParseError: ((err) => {
+ throw err;
+ }),
+};
+
+const result = parseComponentValue(tokens, options);
+
+console.log(result);
+```
+
+### Available functions
+
+- [`parseComponentValue`](https://www.w3.org/TR/css-syntax-3/#parse-component-value)
+- [`parseListOfComponentValues`](https://www.w3.org/TR/css-syntax-3/#parse-list-of-component-values)
+- [`parseCommaSeparatedListOfComponentValues`](https://www.w3.org/TR/css-syntax-3/#parse-comma-separated-list-of-component-values)
+
+### Utilities
+
+#### `gatherNodeAncestry`
+
+The AST does not expose the entire ancestry of each node.
+The walker methods do provide access to the current parent, but also not the entire ancestry.
+
+To gather the entire ancestry for a a given sub tree of the AST you can use `gatherNodeAncestry`.
+The result is a `Map` with the child nodes as keys and the parents as values.
+This allows you to lookup any ancestor of any node.
+
+```js
+import { parseComponentValue } from '@csstools/css-parser-algorithms';
+
+const result = parseComponentValue(tokens, options);
+const ancestry = gatherNodeAncestry(result);
+```
+
+### Options
+
+```ts
+{
+ onParseError?: (error: ParseError) => void
+}
+```
+
+#### `onParseError`
+
+The parser algorithms are forgiving and won't stop when a parse error is encountered.
+Parse errors also aren't tokens.
+
+To receive parsing error information you can set a callback.
+
+Parser errors will try to inform you about the point in the parsing logic the error happened.
+This tells you the kind of error.
+
+## Goals and non-goals
+
+Things this package aims to be:
+- specification compliant CSS parser
+- a reliable low level package to be used in CSS sub-grammars
+
+What it is not:
+- opinionated
+- fast
+- small
+- a replacement for PostCSS (PostCSS is fast and also an ecosystem)
+
+[cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
+[discord]: https://discord.gg/bUadyRwkJS
+[npm-url]: https://www.npmjs.com/package/@csstools/css-parser-algorithms
+
+[CSS Parser Algorithms]: https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms
diff --git a/vanilla/node_modules/@csstools/css-parser-algorithms/dist/index.d.ts b/vanilla/node_modules/@csstools/css-parser-algorithms/dist/index.d.ts
new file mode 100644
index 0000000..c59d3dd
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-parser-algorithms/dist/index.d.ts
@@ -0,0 +1,604 @@
+/**
+ * Parse CSS following the {@link https://drafts.csswg.org/css-syntax/#parsing | CSS Syntax Level 3 specification}.
+ *
+ * @remarks
+ * The tokenizing and parsing tools provided by CSS Tools are designed to be low level and generic with strong ties to their respective specifications.
+ *
+ * Any analysis or mutation of CSS source code should be done with the least powerful tool that can accomplish the task.
+ * For many applications it is sufficient to work with tokens.
+ * For others you might need to use {@link https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms | @csstools/css-parser-algorithms} or a more specific parser.
+ *
+ * The implementation of the AST nodes is kept lightweight and simple.
+ * Do not expect magic methods, instead assume that arrays and class instances behave like any other JavaScript.
+ *
+ * @example
+ * Parse a string of CSS into a component value:
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ * import { parseComponentValue } from '@csstools/css-parser-algorithms';
+ *
+ * const myCSS = `calc(1px * 2)`;
+ *
+ * const componentValue = parseComponentValue(tokenize({
+ * css: myCSS,
+ * }));
+ *
+ * console.log(componentValue);
+ * ```
+ *
+ * @example
+ * Use the right algorithm for the job.
+ *
+ * Algorithms that can parse larger structures (comma-separated lists, ...) can also parse smaller structures.
+ * However, the opposite is not true.
+ *
+ * If your context allows a list of component values, use {@link parseListOfComponentValues}:
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ * import { parseListOfComponentValues } from '@csstools/css-parser-algorithms';
+ *
+ * parseListOfComponentValues(tokenize({ css: `10x 20px` }));
+ * ```
+ *
+ * If your context allows a comma-separated list of component values, use {@link parseCommaSeparatedListOfComponentValues}:
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ * import { parseCommaSeparatedListOfComponentValues } from '@csstools/css-parser-algorithms';
+ *
+ * parseCommaSeparatedListOfComponentValues(tokenize({ css: `20deg, 50%, 30%` }));
+ * ```
+ *
+ * @example
+ * Use the stateful walkers to keep track of the context of a given component value.
+ *
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ * import { parseComponentValue, isSimpleBlockNode } from '@csstools/css-parser-algorithms';
+ *
+ * const myCSS = `calc(1px * (5 / 2))`;
+ *
+ * const componentValue = parseComponentValue(tokenize({ css: myCSS }));
+ *
+ * let state = { inSimpleBlock: false };
+ * componentValue.walk((entry) => {
+ * if (isSimpleBlockNode(entry)) {
+ * entry.state.inSimpleBlock = true;
+ * return;
+ * }
+ *
+ * if (entry.state.inSimpleBlock) {
+ * console.log(entry.node.toString()); // `5`, ...
+ * }
+ * }, state);
+ * ```
+ *
+ * @packageDocumentation
+ */
+
+import type { CSSToken } from '@csstools/css-tokenizer';
+import { ParseError } from '@csstools/css-tokenizer';
+import type { TokenFunction } from '@csstools/css-tokenizer';
+
+export declare class CommentNode {
+ /**
+ * The node type, always `ComponentValueType.Comment`
+ */
+ type: ComponentValueType;
+ /**
+ * The comment token.
+ */
+ value: CSSToken;
+ constructor(value: CSSToken);
+ /**
+ * Retrieve the tokens for the current comment.
+ * This is the inverse of parsing from a list of tokens.
+ */
+ tokens(): Array<CSSToken>;
+ /**
+ * Convert the current comment to a string.
+ * This is not a true serialization.
+ * It is purely a concatenation of the string representation of the tokens.
+ */
+ toString(): string;
+ /**
+ * @internal
+ *
+ * A debug helper to convert the current object to a JSON representation.
+ * This is useful in asserts and to store large ASTs in files.
+ */
+ toJSON(): Record<string, unknown>;
+ /**
+ * @internal
+ */
+ isCommentNode(): this is CommentNode;
+ /**
+ * @internal
+ */
+ static isCommentNode(x: unknown): x is CommentNode;
+}
+
+export declare type ComponentValue = FunctionNode | SimpleBlockNode | WhitespaceNode | CommentNode | TokenNode;
+
+export declare enum ComponentValueType {
+ Function = "function",
+ SimpleBlock = "simple-block",
+ Whitespace = "whitespace",
+ Comment = "comment",
+ Token = "token"
+}
+
+export declare type ContainerNode = FunctionNode | SimpleBlockNode;
+
+export declare abstract class ContainerNodeBaseClass {
+ /**
+ * The contents of the `Function` or `Simple Block`.
+ * This is a list of component values.
+ */
+ value: Array<ComponentValue>;
+ /**
+ * Retrieve the index of the given item in the current node.
+ * For most node types this will be trivially implemented as `this.value.indexOf(item)`.
+ */
+ indexOf(item: ComponentValue): number | string;
+ /**
+ * Retrieve the item at the given index in the current node.
+ * For most node types this will be trivially implemented as `this.value[index]`.
+ */
+ at(index: number | string): ComponentValue | undefined;
+ /**
+ * Iterates over each item in the `value` array of the current node.
+ *
+ * @param cb - The callback function to execute for each item.
+ * The function receives an object containing the current node (`node`), its parent (`parent`),
+ * and an optional `state` object.
+ * A second parameter is the index of the current node.
+ * The function can return `false` to stop the iteration.
+ *
+ * @param state - An optional state object that can be used to pass additional information to the callback function.
+ * The state object is cloned for each iteration. This means that changes to the state object are not reflected in the next iteration.
+ *
+ * @returns `false` if the iteration was halted, `undefined` otherwise.
+ */
+ forEach<T extends Record<string, unknown>, U extends ContainerNode>(this: U, cb: (entry: {
+ node: ComponentValue;
+ parent: ContainerNode;
+ state?: T;
+ }, index: number | string) => boolean | void, state?: T): false | undefined;
+ /**
+ * Walks the current node and all its children.
+ *
+ * @param cb - The callback function to execute for each item.
+ * The function receives an object containing the current node (`node`), its parent (`parent`),
+ * and an optional `state` object.
+ * A second parameter is the index of the current node.
+ * The function can return `false` to stop the iteration.
+ *
+ * @param state - An optional state object that can be used to pass additional information to the callback function.
+ * The state object is cloned for each iteration. This means that changes to the state object are not reflected in the next iteration.
+ * However changes are passed down to child node iterations.
+ *
+ * @returns `false` if the iteration was halted, `undefined` otherwise.
+ */
+ walk<T extends Record<string, unknown>, U extends ContainerNode>(this: U, cb: (entry: {
+ node: ComponentValue;
+ parent: ContainerNode;
+ state?: T;
+ }, index: number | string) => boolean | void, state?: T): false | undefined;
+}
+
+/**
+ * Iterates over each item in a list of component values.
+ *
+ * @param cb - The callback function to execute for each item.
+ * The function receives an object containing the current node (`node`), its parent (`parent`),
+ * and an optional `state` object.
+ * A second parameter is the index of the current node.
+ * The function can return `false` to stop the iteration.
+ *
+ * @param state - An optional state object that can be used to pass additional information to the callback function.
+ * The state object is cloned for each iteration. This means that changes to the state object are not reflected in the next iteration.
+ *
+ * @returns `false` if the iteration was halted, `undefined` otherwise.
+ */
+export declare function forEach<T extends Record<string, unknown>>(componentValues: Array<ComponentValue>, cb: (entry: {
+ node: ComponentValue;
+ parent: ContainerNode | {
+ value: Array<ComponentValue>;
+ };
+ state?: T;
+}, index: number | string) => boolean | void, state?: T): false | undefined;
+
+/**
+ * A function node.
+ *
+ * @example
+ * ```js
+ * const node = parseComponentValue(tokenize('calc(1 + 1)'));
+ *
+ * isFunctionNode(node); // true
+ * node.getName(); // 'calc'
+ * ```
+ */
+export declare class FunctionNode extends ContainerNodeBaseClass {
+ /**
+ * The node type, always `ComponentValueType.Function`
+ */
+ type: ComponentValueType;
+ /**
+ * The token for the name of the function.
+ */
+ name: TokenFunction;
+ /**
+ * The token for the closing parenthesis of the function.
+ * If the function is unclosed, this will be an EOF token.
+ */
+ endToken: CSSToken;
+ constructor(name: TokenFunction, endToken: CSSToken, value: Array<ComponentValue>);
+ /**
+ * Retrieve the name of the current function.
+ * This is the parsed and unescaped name of the function.
+ */
+ getName(): string;
+ /**
+ * Normalize the current function:
+ * 1. if the "endToken" is EOF, replace with a ")-token"
+ */
+ normalize(): void;
+ /**
+ * Retrieve the tokens for the current function.
+ * This is the inverse of parsing from a list of tokens.
+ */
+ tokens(): Array<CSSToken>;
+ /**
+ * Convert the current function to a string.
+ * This is not a true serialization.
+ * It is purely a concatenation of the string representation of the tokens.
+ */
+ toString(): string;
+ /**
+ * @internal
+ *
+ * A debug helper to convert the current object to a JSON representation.
+ * This is useful in asserts and to store large ASTs in files.
+ */
+ toJSON(): unknown;
+ /**
+ * @internal
+ */
+ isFunctionNode(): this is FunctionNode;
+ /**
+ * @internal
+ */
+ static isFunctionNode(x: unknown): x is FunctionNode;
+}
+
+/**
+ * AST nodes do not have a `parent` property or method.
+ * This makes it harder to traverse the AST upwards.
+ * This function builds a `Map<Child, Parent>` that can be used to lookup ancestors of a node.
+ *
+ * @remarks
+ * There is no magic behind this or the map it returns.
+ * Mutating the AST will not update the map.
+ *
+ * Types are erased and any content of the map has type `unknown`.
+ * If someone knows a clever way to type this, please let us know.
+ *
+ * @example
+ * ```js
+ * const ancestry = gatherNodeAncestry(mediaQuery);
+ * mediaQuery.walk((entry) => {
+ * const node = entry.node; // directly exposed
+ * const parent = entry.parent; // directly exposed
+ * const grandParent: unknown = ancestry.get(parent); // lookup
+ *
+ * console.log('node', node);
+ * console.log('parent', parent);
+ * console.log('grandParent', grandParent);
+ * });
+ * ```
+ */
+export declare function gatherNodeAncestry(node: {
+ walk(cb: (entry: {
+ node: unknown;
+ parent: unknown;
+ }, index: number | string) => boolean | void): false | undefined;
+}): Map<unknown, unknown>;
+
+/**
+ * Check if the current object is a `CommentNode`.
+ * This is a type guard.
+ */
+export declare function isCommentNode(x: unknown): x is CommentNode;
+
+/**
+ * Check if the current object is a `FunctionNode`.
+ * This is a type guard.
+ */
+export declare function isFunctionNode(x: unknown): x is FunctionNode;
+
+/**
+ * Check if the current object is a `SimpleBlockNode`.
+ * This is a type guard.
+ */
+export declare function isSimpleBlockNode(x: unknown): x is SimpleBlockNode;
+
+/**
+ * Check if the current object is a `TokenNode`.
+ * This is a type guard.
+ */
+export declare function isTokenNode(x: unknown): x is TokenNode;
+
+/**
+ * Check if the current object is a `WhitespaceNode`.
+ * This is a type guard.
+ */
+export declare function isWhitespaceNode(x: unknown): x is WhitespaceNode;
+
+/**
+ * Check if the current object is a `WhiteSpaceNode` or a `CommentNode`.
+ * This is a type guard.
+ */
+export declare function isWhiteSpaceOrCommentNode(x: unknown): x is WhitespaceNode | CommentNode;
+
+/**
+ * Parse a comma-separated list of component values.
+ *
+ * @example
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ * import { parseCommaSeparatedListOfComponentValues } from '@csstools/css-parser-algorithms';
+ *
+ * parseCommaSeparatedListOfComponentValues(tokenize({ css: `20deg, 50%, 30%` }));
+ * ```
+ */
+export declare function parseCommaSeparatedListOfComponentValues(tokens: Array<CSSToken>, options?: {
+ onParseError?: (error: ParseError) => void;
+}): Array<Array<ComponentValue>>;
+
+/**
+ * Parse a single component value.
+ *
+ * @example
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ * import { parseComponentValue } from '@csstools/css-parser-algorithms';
+ *
+ * parseComponentValue(tokenize({ css: `10px` }));
+ * parseComponentValue(tokenize({ css: `calc((10px + 1x) * 4)` }));
+ * ```
+ */
+export declare function parseComponentValue(tokens: Array<CSSToken>, options?: {
+ onParseError?: (error: ParseError) => void;
+}): ComponentValue | undefined;
+
+/**
+ * Parse a list of component values.
+ *
+ * @example
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ * import { parseListOfComponentValues } from '@csstools/css-parser-algorithms';
+ *
+ * parseListOfComponentValues(tokenize({ css: `20deg 30%` }));
+ * ```
+ */
+export declare function parseListOfComponentValues(tokens: Array<CSSToken>, options?: {
+ onParseError?: (error: ParseError) => void;
+}): Array<ComponentValue>;
+
+/**
+ * Replace specific component values in a list of component values.
+ * A helper for the most common and simplistic cases when mutating an AST.
+ */
+export declare function replaceComponentValues(componentValuesList: Array<Array<ComponentValue>>, replaceWith: (componentValue: ComponentValue) => Array<ComponentValue> | ComponentValue | void): Array<Array<ComponentValue>>;
+
+/**
+ * A simple block node.
+ *
+ * @example
+ * ```js
+ * const node = parseComponentValue(tokenize('[foo=bar]'));
+ *
+ * isSimpleBlockNode(node); // true
+ * node.startToken; // [TokenType.OpenSquare, '[', 0, 0, undefined]
+ * ```
+ */
+export declare class SimpleBlockNode extends ContainerNodeBaseClass {
+ /**
+ * The node type, always `ComponentValueType.SimpleBlock`
+ */
+ type: ComponentValueType;
+ /**
+ * The token for the opening token of the block.
+ */
+ startToken: CSSToken;
+ /**
+ * The token for the closing token of the block.
+ * If the block is closed it will be the mirror variant of the `startToken`.
+ * If the block is unclosed, this will be an EOF token.
+ */
+ endToken: CSSToken;
+ constructor(startToken: CSSToken, endToken: CSSToken, value: Array<ComponentValue>);
+ /**
+ * Normalize the current simple block
+ * 1. if the "endToken" is EOF, replace with the mirror token of the "startToken"
+ */
+ normalize(): void;
+ /**
+ * Retrieve the tokens for the current simple block.
+ * This is the inverse of parsing from a list of tokens.
+ */
+ tokens(): Array<CSSToken>;
+ /**
+ * Convert the current simple block to a string.
+ * This is not a true serialization.
+ * It is purely a concatenation of the string representation of the tokens.
+ */
+ toString(): string;
+ /**
+ * @internal
+ *
+ * A debug helper to convert the current object to a JSON representation.
+ * This is useful in asserts and to store large ASTs in files.
+ */
+ toJSON(): unknown;
+ /**
+ * @internal
+ */
+ isSimpleBlockNode(): this is SimpleBlockNode;
+ /**
+ * @internal
+ */
+ static isSimpleBlockNode(x: unknown): x is SimpleBlockNode;
+}
+
+/**
+ * Returns the start and end index of a node in the CSS source string.
+ */
+export declare function sourceIndices(x: {
+ tokens(): Array<CSSToken>;
+} | Array<{
+ tokens(): Array<CSSToken>;
+}>): [number, number];
+
+/**
+ * Concatenate the string representation of a collection of component values.
+ * This is not a proper serializer that will handle escaping and whitespace.
+ * It only produces valid CSS for token lists that are also valid.
+ */
+export declare function stringify(componentValueLists: Array<Array<ComponentValue>>): string;
+
+export declare class TokenNode {
+ /**
+ * The node type, always `ComponentValueType.Token`
+ */
+ type: ComponentValueType;
+ /**
+ * The token.
+ */
+ value: CSSToken;
+ constructor(value: CSSToken);
+ /**
+ * This is the inverse of parsing from a list of tokens.
+ */
+ tokens(): [CSSToken];
+ /**
+ * Convert the current token to a string.
+ * This is not a true serialization.
+ * It is purely the string representation of token.
+ */
+ toString(): string;
+ /**
+ * @internal
+ *
+ * A debug helper to convert the current object to a JSON representation.
+ * This is useful in asserts and to store large ASTs in files.
+ */
+ toJSON(): Record<string, unknown>;
+ /**
+ * @internal
+ */
+ isTokenNode(): this is TokenNode;
+ /**
+ * @internal
+ */
+ static isTokenNode(x: unknown): x is TokenNode;
+}
+
+/**
+ * Walks each item in a list of component values all of their children.
+ *
+ * @param cb - The callback function to execute for each item.
+ * The function receives an object containing the current node (`node`), its parent (`parent`),
+ * and an optional `state` object.
+ * A second parameter is the index of the current node.
+ * The function can return `false` to stop the iteration.
+ *
+ * @param state - An optional state object that can be used to pass additional information to the callback function.
+ * The state object is cloned for each iteration. This means that changes to the state object are not reflected in the next iteration.
+ * However changes are passed down to child node iterations.
+ *
+ * @returns `false` if the iteration was halted, `undefined` otherwise.
+ *
+ * @example
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ * import { parseListOfComponentValues, isSimpleBlockNode } from '@csstools/css-parser-algorithms';
+ *
+ * const myCSS = `calc(1px * (5 / 2)) 10px`;
+ *
+ * const componentValues = parseListOfComponentValues(tokenize({ css: myCSS }));
+ *
+ * let state = { inSimpleBlock: false };
+ * walk(componentValues, (entry) => {
+ * if (isSimpleBlockNode(entry)) {
+ * entry.state.inSimpleBlock = true;
+ * return;
+ * }
+ *
+ * if (entry.state.inSimpleBlock) {
+ * console.log(entry.node.toString()); // `5`, ...
+ * }
+ * }, state);
+ * ```
+ */
+export declare function walk<T extends Record<string, unknown>>(componentValues: Array<ComponentValue>, cb: (entry: {
+ node: ComponentValue;
+ parent: ContainerNode | {
+ value: Array<ComponentValue>;
+ };
+ state?: T;
+}, index: number | string) => boolean | void, state?: T): false | undefined;
+
+/**
+ * Generate a function that finds the next element that should be visited when walking an AST.
+ * Rules :
+ * 1. the previous iteration is used as a reference, so any checks are relative to the start of the current iteration.
+ * 2. the next element always appears after the current index.
+ * 3. the next element always exists in the list.
+ * 4. replacing an element does not cause the replaced element to be visited.
+ * 5. removing an element does not cause elements to be skipped.
+ * 6. an element added later in the list will be visited.
+ */
+export declare function walkerIndexGenerator<T>(initialList: Array<T>): (list: Array<T>, child: T, index: number) => number;
+
+export declare class WhitespaceNode {
+ /**
+ * The node type, always `ComponentValueType.WhiteSpace`
+ */
+ type: ComponentValueType;
+ /**
+ * The list of consecutive whitespace tokens.
+ */
+ value: Array<CSSToken>;
+ constructor(value: Array<CSSToken>);
+ /**
+ * Retrieve the tokens for the current whitespace.
+ * This is the inverse of parsing from a list of tokens.
+ */
+ tokens(): Array<CSSToken>;
+ /**
+ * Convert the current whitespace to a string.
+ * This is not a true serialization.
+ * It is purely a concatenation of the string representation of the tokens.
+ */
+ toString(): string;
+ /**
+ * @internal
+ *
+ * A debug helper to convert the current object to a JSON representation.
+ * This is useful in asserts and to store large ASTs in files.
+ */
+ toJSON(): Record<string, unknown>;
+ /**
+ * @internal
+ */
+ isWhitespaceNode(): this is WhitespaceNode;
+ /**
+ * @internal
+ */
+ static isWhitespaceNode(x: unknown): x is WhitespaceNode;
+}
+
+export { }
diff --git a/vanilla/node_modules/@csstools/css-parser-algorithms/dist/index.mjs b/vanilla/node_modules/@csstools/css-parser-algorithms/dist/index.mjs
new file mode 100644
index 0000000..ca4f76d
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-parser-algorithms/dist/index.mjs
@@ -0,0 +1 @@
+import{isTokenEOF as e,TokenType as n,isToken as t,stringify as o,mirrorVariant as s,isTokenOpenParen as i,isTokenOpenCurly as r,isTokenOpenSquare as a,isTokenFunction as c,isTokenWhitespace as u,isTokenComment as l,mirrorVariantType as d,ParseError as h,isTokenWhiteSpaceOrComment as p,isTokenCloseParen as m,isTokenComma as k}from"@csstools/css-tokenizer";var f;function walkerIndexGenerator(e){let n=e.slice();return(e,t,o)=>{let s=-1;for(let i=n.indexOf(t);i<n.length&&(s=e.indexOf(n[i]),-1===s||s<o);i++);return-1===s||s===o&&t===e[o]&&(s++,s>=e.length)?-1:(n=e.slice(),s)}}function consumeComponentValue(e,n){const t=n[0];if(i(t)||r(t)||a(t)){const t=consumeSimpleBlock(e,n);return{advance:t.advance,node:t.node}}if(c(t)){const t=consumeFunction(e,n);return{advance:t.advance,node:t.node}}if(u(t)){const t=consumeWhitespace(e,n);return{advance:t.advance,node:t.node}}if(l(t)){const t=consumeComment(e,n);return{advance:t.advance,node:t.node}}return{advance:1,node:new TokenNode(t)}}!function(e){e.Function="function",e.SimpleBlock="simple-block",e.Whitespace="whitespace",e.Comment="comment",e.Token="token"}(f||(f={}));class ContainerNodeBaseClass{value=[];indexOf(e){return this.value.indexOf(e)}at(e){if("number"==typeof e)return e<0&&(e=this.value.length+e),this.value[e]}forEach(e,n){if(0===this.value.length)return;const t=walkerIndexGenerator(this.value);let o=0;for(;o<this.value.length;){const s=this.value[o];let i;if(n&&(i={...n}),!1===e({node:s,parent:this,state:i},o))return!1;if(o=t(this.value,s,o),-1===o)break}}walk(e,n){0!==this.value.length&&this.forEach((n,t)=>!1!==e(n,t)&&((!("walk"in n.node)||!this.value.includes(n.node)||!1!==n.node.walk(e,n.state))&&void 0),n)}}class FunctionNode extends ContainerNodeBaseClass{type=f.Function;name;endToken;constructor(e,n,t){super(),this.name=e,this.endToken=n,this.value=t}getName(){return this.name[4].value}normalize(){e(this.endToken)&&(this.endToken=[n.CloseParen,")",-1,-1,void 0])}tokens(){return e(this.endToken)?[this.name,...this.value.flatMap(e=>e.tokens())]:[this.name,...this.value.flatMap(e=>e.tokens()),this.endToken]}toString(){const e=this.value.map(e=>t(e)?o(e):e.toString()).join("");return o(this.name)+e+o(this.endToken)}toJSON(){return{type:this.type,name:this.getName(),tokens:this.tokens(),value:this.value.map(e=>e.toJSON())}}isFunctionNode(){return FunctionNode.isFunctionNode(this)}static isFunctionNode(e){return!!e&&(e instanceof FunctionNode&&e.type===f.Function)}}function consumeFunction(n,t){const o=[];let s=1;for(;;){const i=t[s];if(!i||e(i))return n.onParseError(new h("Unexpected EOF while consuming a function.",t[0][2],t[t.length-1][3],["5.4.9. Consume a function","Unexpected EOF"])),{advance:t.length,node:new FunctionNode(t[0],i,o)};if(m(i))return{advance:s+1,node:new FunctionNode(t[0],i,o)};if(p(i)){const e=consumeAllCommentsAndWhitespace(n,t.slice(s));s+=e.advance,o.push(...e.nodes);continue}const r=consumeComponentValue(n,t.slice(s));s+=r.advance,o.push(r.node)}}class SimpleBlockNode extends ContainerNodeBaseClass{type=f.SimpleBlock;startToken;endToken;constructor(e,n,t){super(),this.startToken=e,this.endToken=n,this.value=t}normalize(){if(e(this.endToken)){const e=s(this.startToken);e&&(this.endToken=e)}}tokens(){return e(this.endToken)?[this.startToken,...this.value.flatMap(e=>e.tokens())]:[this.startToken,...this.value.flatMap(e=>e.tokens()),this.endToken]}toString(){const e=this.value.map(e=>t(e)?o(e):e.toString()).join("");return o(this.startToken)+e+o(this.endToken)}toJSON(){return{type:this.type,startToken:this.startToken,tokens:this.tokens(),value:this.value.map(e=>e.toJSON())}}isSimpleBlockNode(){return SimpleBlockNode.isSimpleBlockNode(this)}static isSimpleBlockNode(e){return!!e&&(e instanceof SimpleBlockNode&&e.type===f.SimpleBlock)}}function consumeSimpleBlock(n,t){const o=d(t[0][0]);if(!o)throw new Error("Failed to parse, a mirror variant must exist for all block open tokens.");const s=[];let i=1;for(;;){const r=t[i];if(!r||e(r))return n.onParseError(new h("Unexpected EOF while consuming a simple block.",t[0][2],t[t.length-1][3],["5.4.8. Consume a simple block","Unexpected EOF"])),{advance:t.length,node:new SimpleBlockNode(t[0],r,s)};if(r[0]===o)return{advance:i+1,node:new SimpleBlockNode(t[0],r,s)};if(p(r)){const e=consumeAllCommentsAndWhitespace(n,t.slice(i));i+=e.advance,s.push(...e.nodes);continue}const a=consumeComponentValue(n,t.slice(i));i+=a.advance,s.push(a.node)}}class WhitespaceNode{type=f.Whitespace;value;constructor(e){this.value=e}tokens(){return this.value}toString(){return o(...this.value)}toJSON(){return{type:this.type,tokens:this.tokens()}}isWhitespaceNode(){return WhitespaceNode.isWhitespaceNode(this)}static isWhitespaceNode(e){return!!e&&(e instanceof WhitespaceNode&&e.type===f.Whitespace)}}function consumeWhitespace(e,n){let t=0;for(;;){const e=n[t];if(!u(e))return{advance:t,node:new WhitespaceNode(n.slice(0,t))};t++}}class CommentNode{type=f.Comment;value;constructor(e){this.value=e}tokens(){return[this.value]}toString(){return o(this.value)}toJSON(){return{type:this.type,tokens:this.tokens()}}isCommentNode(){return CommentNode.isCommentNode(this)}static isCommentNode(e){return!!e&&(e instanceof CommentNode&&e.type===f.Comment)}}function consumeComment(e,n){return{advance:1,node:new CommentNode(n[0])}}function consumeAllCommentsAndWhitespace(e,n){const t=[];let o=0;for(;;){if(u(n[o])){const e=consumeWhitespace(0,n.slice(o));o+=e.advance,t.push(e.node);continue}if(!l(n[o]))return{advance:o,nodes:t};t.push(new CommentNode(n[o])),o++}}class TokenNode{type=f.Token;value;constructor(e){this.value=e}tokens(){return[this.value]}toString(){return this.value[1]}toJSON(){return{type:this.type,tokens:this.tokens()}}isTokenNode(){return TokenNode.isTokenNode(this)}static isTokenNode(e){return!!e&&(e instanceof TokenNode&&e.type===f.Token)}}function parseComponentValue(t,o){const s={onParseError:o?.onParseError??(()=>{})},i=[...t];e(i[i.length-1])||i.push([n.EOF,"",i[i.length-1][2],i[i.length-1][3],void 0]);const r=consumeComponentValue(s,i);if(e(i[Math.min(r.advance,i.length-1)]))return r.node;s.onParseError(new h("Expected EOF after parsing a component value.",t[0][2],t[t.length-1][3],["5.3.9. Parse a component value","Expected EOF"]))}function parseListOfComponentValues(t,o){const s={onParseError:o?.onParseError??(()=>{})},i=[...t];e(i[i.length-1])&&i.push([n.EOF,"",i[i.length-1][2],i[i.length-1][3],void 0]);const r=[];let a=0;for(;;){if(!i[a]||e(i[a]))return r;const n=consumeComponentValue(s,i.slice(a));r.push(n.node),a+=n.advance}}function parseCommaSeparatedListOfComponentValues(t,o){const s={onParseError:o?.onParseError??(()=>{})},i=[...t];if(0===t.length)return[];e(i[i.length-1])&&i.push([n.EOF,"",i[i.length-1][2],i[i.length-1][3],void 0]);const r=[];let a=[],c=0;for(;;){if(!i[c]||e(i[c]))return a.length&&r.push(a),r;if(k(i[c])){r.push(a),a=[],c++;continue}const n=consumeComponentValue(s,t.slice(c));a.push(n.node),c+=n.advance}}function gatherNodeAncestry(e){const n=new Map;return e.walk(e=>{Array.isArray(e.node)?e.node.forEach(t=>{n.set(t,e.parent)}):n.set(e.node,e.parent)}),n}function forEach(e,n,t){if(0===e.length)return;const o=walkerIndexGenerator(e);let s=0;for(;s<e.length;){const i=e[s];let r;if(t&&(r={...t}),!1===n({node:i,parent:{value:e},state:r},s))return!1;if(s=o(e,i,s),-1===s)break}}function walk(e,n,t){0!==e.length&&forEach(e,(t,o)=>!1!==n(t,o)&&((!("walk"in t.node)||!e.includes(t.node)||!1!==t.node.walk(n,t.state))&&void 0),t)}function replaceComponentValues(e,n){for(let t=0;t<e.length;t++){walk(e[t],(e,t)=>{if("number"!=typeof t)return;const o=n(e.node);o&&(Array.isArray(o)?e.parent.value.splice(t,1,...o):e.parent.value.splice(t,1,o))})}return e}function stringify(e){return e.map(e=>e.map(e=>o(...e.tokens())).join("")).join(",")}function isSimpleBlockNode(e){return SimpleBlockNode.isSimpleBlockNode(e)}function isFunctionNode(e){return FunctionNode.isFunctionNode(e)}function isWhitespaceNode(e){return WhitespaceNode.isWhitespaceNode(e)}function isCommentNode(e){return CommentNode.isCommentNode(e)}function isWhiteSpaceOrCommentNode(e){return isWhitespaceNode(e)||isCommentNode(e)}function isTokenNode(e){return TokenNode.isTokenNode(e)}function sourceIndices(e){if(Array.isArray(e)){const n=e[0];if(!n)return[0,0];const t=e[e.length-1]||n;return[sourceIndices(n)[0],sourceIndices(t)[1]]}const n=e.tokens(),t=n[0],o=n[n.length-1];return t&&o?[t[2],o[3]]:[0,0]}export{CommentNode,f as ComponentValueType,ContainerNodeBaseClass,FunctionNode,SimpleBlockNode,TokenNode,WhitespaceNode,forEach,gatherNodeAncestry,isCommentNode,isFunctionNode,isSimpleBlockNode,isTokenNode,isWhiteSpaceOrCommentNode,isWhitespaceNode,parseCommaSeparatedListOfComponentValues,parseComponentValue,parseListOfComponentValues,replaceComponentValues,sourceIndices,stringify,walk,walkerIndexGenerator};
diff --git a/vanilla/node_modules/@csstools/css-parser-algorithms/package.json b/vanilla/node_modules/@csstools/css-parser-algorithms/package.json
new file mode 100644
index 0000000..5734668
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-parser-algorithms/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "@csstools/css-parser-algorithms",
+ "description": "Algorithms to help you parse CSS from an array of tokens.",
+ "version": "4.0.0",
+ "contributors": [
+ {
+ "name": "Antonio Laguna",
+ "email": "antonio@laguna.es",
+ "url": "https://antonio.laguna.es"
+ },
+ {
+ "name": "Romain Menke",
+ "email": "romainmenke@gmail.com"
+ }
+ ],
+ "license": "MIT",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.mjs"
+ }
+ },
+ "files": [
+ "CHANGELOG.md",
+ "LICENSE.md",
+ "README.md",
+ "dist"
+ ],
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^4.0.0"
+ },
+ "scripts": {},
+ "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/csstools/postcss-plugins.git",
+ "directory": "packages/css-parser-algorithms"
+ },
+ "bugs": "https://github.com/csstools/postcss-plugins/issues",
+ "keywords": [
+ "css",
+ "parser"
+ ]
+}
diff --git a/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/CHANGELOG.md b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/CHANGELOG.md
new file mode 100644
index 0000000..08f339f
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Changes to CSS Syntax Patches For CSSTree
+
+### 1.0.27
+
+_February 9, 2026_
+
+- Update `@webref/css` to [`v8.2.3`](https://github.com/w3c/webref/releases/tag/%40webref%2Fcss%408.2.3)
+
+[Full CHANGELOG](https://github.com/csstools/postcss-plugins/tree/main/packages/css-syntax-patches-for-csstree/CHANGELOG.md)
diff --git a/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/LICENSE.md b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/LICENSE.md
new file mode 100644
index 0000000..e8ae93b
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/LICENSE.md
@@ -0,0 +1,18 @@
+MIT No Attribution (MIT-0)
+
+Copyright © CSSTools Contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the “Software”), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/README.md b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/README.md
new file mode 100644
index 0000000..00e214f
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/README.md
@@ -0,0 +1,43 @@
+# CSS Syntax Patches For CSSTree <img src="https://cssdb.org/images/css.svg" alt="for CSS" width="90" height="90" align="right">
+
+[<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/css-syntax-patches-for-csstree.svg" height="20">][npm-url]
+[<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/actions/workflows/test.yml/badge.svg?branch=main" height="20">][cli-url]
+
+Patch [csstree](https://github.com/csstree/csstree) syntax definitions with the latest data from CSS specifications.
+
+## Usage
+
+```bash
+npm install @csstools/css-syntax-patches-for-csstree
+```
+
+```js
+import { fork } from 'css-tree';
+import syntax_patches from '@csstools/css-syntax-patches-for-csstree' with { type: 'json' };
+
+const forkedLexer = fork({
+ atrules: syntax_patches.next.atrules,
+ properties: syntax_patches.next.properties,
+ types: syntax_patches.next.types,
+}).lexer;
+```
+
+## `next`
+
+```js
+import syntax_patches from '@csstools/css-syntax-patches-for-csstree' with { type: 'json' };
+
+console.log(syntax_patches.next);
+// ^^^^
+```
+
+CSS specifications are often still in flux and various parts might change or disappear altogether.
+Specifications also contains parts that haven't been implemented yet in a browser.
+Only CSS that is widely adopted can be expected to be stable.
+
+The `next` grouping contains a combination of what is currently valid in browsers and the progress in various specifications.
+
+_In the future more groupings might be added._
+
+[cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
+[npm-url]: https://www.npmjs.com/package/@csstools/css-syntax-patches-for-csstree
diff --git a/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/dist/index.d.ts b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/dist/index.d.ts
new file mode 100644
index 0000000..05d942a
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/dist/index.d.ts
@@ -0,0 +1,5 @@
+export const next: {
+ atrules: Record<string, { descriptors: Record<string, string> }>,
+ properties: Record<string, string>,
+ types: Record<string, string>,
+}
diff --git a/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/dist/index.json b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/dist/index.json
new file mode 100644
index 0000000..e93d3b3
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/dist/index.json
@@ -0,0 +1,913 @@
+{
+ "next": {
+ "atrules": {
+ "color-profile": {
+ "descriptors": {
+ "components": "<ident>#",
+ "rendering-intent": "relative-colorimetric | absolute-colorimetric | perceptual | saturation",
+ "src": "<url>"
+ }
+ },
+ "counter-style": {
+ "descriptors": {
+ "additive-symbols": "[ <integer [0,∞]> && <symbol> ]#",
+ "pad": "<integer [0,∞]> && <symbol>"
+ }
+ },
+ "font-face": {
+ "descriptors": {
+ "ascent-override": "[ normal | <percentage [0,∞]> ]{1,2}",
+ "descent-override": "[ normal | <percentage [0,∞]> ]{1,2}",
+ "font-language-override": "normal | <string>",
+ "font-named-instance": "auto | <string>",
+ "font-size": "auto | [ <number> ]{1,2}",
+ "font-style": "auto | normal | italic | left | right | oblique [ <angle [-90deg,90deg]>{1,2} ]?",
+ "font-weight": "| auto",
+ "font-width": "auto | <'font-width'>{1,2}",
+ "line-gap-override": "[ normal | <percentage [0,∞]> ]{1,2}",
+ "size-adjust": "<percentage [0,∞]>",
+ "src": "<font-src-list>",
+ "subscript-position-override": "[ normal | from-font | <percentage> ]{1,2}",
+ "subscript-size-override": "[ normal | from-font | <percentage [0,∞]> ]{1,2}",
+ "superscript-position-override": "[ normal | from-font | <percentage> ]{1,2}",
+ "superscript-size-override": "[ normal | from-font | <percentage [0,∞]> ]{1,2}",
+ "unicode-range": "<unicode-range-token>#"
+ }
+ },
+ "font-feature-values": {
+ "descriptors": {
+ "font-display": "auto | block | swap | fallback | optional"
+ }
+ },
+ "font-palette-values": {
+ "descriptors": {
+ "override-colors": "[ <integer [0,∞]> <color> ]#"
+ }
+ },
+ "function": {
+ "descriptors": {
+ "result": "<declaration-value>?"
+ }
+ },
+ "page": {
+ "descriptors": {
+ "size": "<length [0,∞]>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]"
+ }
+ },
+ "view-transition": {
+ "descriptors": {
+ "navigation": "auto | none",
+ "types": "none | <custom-ident>+"
+ }
+ }
+ },
+ "properties": {
+ "align-items": "normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ] | anchor-center",
+ "align-self": "auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position> | anchor-center",
+ "alignment-baseline": "| text-bottom | text-top",
+ "all": " | revert-rule",
+ "animation-duration": "[ auto | <time [0s,∞]> ]#",
+ "animation-range-center": "[ normal | [ <length-percentage> | <timeline-range-center-subject> <length-percentage>? ] ]#",
+ "animation-trigger": "[ none | [ <dashed-ident> <animation-action>+ ]+ ]#",
+ "appearance": "none | auto | base | base-select | <compat-auto> | <compat-special> | base",
+ "backdrop-filter": "none | <filter-value-list>",
+ "background": "<bg-layer>#? , <final-bg-layer>",
+ "background-blend-mode": "<'mix-blend-mode'>#",
+ "background-origin": "<visual-box>#",
+ "background-position-block": "[ center | [ [ start | end ]? <length-percentage>? ]! ]#",
+ "background-position-inline": "[ center | [ [ start | end ]? <length-percentage>? ]! ]#",
+ "background-repeat-block": "<repetition>#",
+ "background-repeat-inline": "<repetition>#",
+ "background-repeat-x": "<repetition>#",
+ "background-repeat-y": "<repetition>#",
+ "background-tbd": "<bg-layer>#",
+ "baseline-shift": "<length-percentage> | sub | super | top | center | bottom",
+ "baseline-source": "auto | first | last",
+ "block-ellipsis": "no-ellipsis | auto | <string>",
+ "block-step": "<'block-step-size'> || <'block-step-insert'> || <'block-step-align'> || <'block-step-round'>",
+ "block-step-align": "auto | center | start | end",
+ "block-step-insert": "margin-box | padding-box | content-box",
+ "block-step-round": "up | down | nearest",
+ "block-step-size": "none | <length [0,∞]>",
+ "bookmark-label": "<content-list>",
+ "bookmark-level": "none | <integer [1,∞]>",
+ "bookmark-state": "open | closed",
+ "border-block": "<'border-block-start'>",
+ "border-block-clip": "<'border-top-clip'>",
+ "border-block-end": "<line-width> || <line-style> || <color>",
+ "border-block-end-clip": "none | [ <length-percentage [0,∞]> | <flex> ]+",
+ "border-block-end-color": "<color> | <image-1D>",
+ "border-block-end-radius": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "border-block-end-style": "<line-style>",
+ "border-block-end-width": "<line-width>",
+ "border-block-start": "<line-width> || <line-style> || <color>",
+ "border-block-start-clip": "none | [ <length-percentage [0,∞]> | <flex> ]+",
+ "border-block-start-color": "<color> | <image-1D>",
+ "border-block-start-radius": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "border-block-start-style": "<line-style>",
+ "border-block-start-width": "<line-width>",
+ "border-block-style": "<'border-top-style'>{1,2}",
+ "border-block-width": "<'border-top-width'>{1,2}",
+ "border-bottom-clip": "none | [ <length-percentage [0,∞]> | <flex> ]+",
+ "border-bottom-color": "<color> | <image-1D>",
+ "border-bottom-left-radius": "<border-radius>",
+ "border-bottom-radius": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "border-bottom-right-radius": "<border-radius>",
+ "border-boundary": "none | parent | display",
+ "border-clip": "<'border-top-clip'>",
+ "border-color": "[ <color> | <image-1D> ]{1,4}",
+ "border-end-end-radius": "<border-radius>",
+ "border-end-start-radius": "<border-radius>",
+ "border-image-outset": "[ <length [0,∞]> | <number [0,∞]> ]{1,4}",
+ "border-image-slice": "[ <number [0,∞]> | <percentage [0,∞]> ]{1,4} && fill?",
+ "border-image-width": "[ <length-percentage [0,∞]> | <number [0,∞]> | auto ]{1,4}",
+ "border-inline": "<'border-block-start'>",
+ "border-inline-clip": "<'border-top-clip'>",
+ "border-inline-end": "<line-width> || <line-style> || <color>",
+ "border-inline-end-clip": "none | [ <length-percentage [0,∞]> | <flex> ]+",
+ "border-inline-end-color": "<color> | <image-1D>",
+ "border-inline-end-radius": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "border-inline-end-style": "<line-style>",
+ "border-inline-end-width": "<line-width>",
+ "border-inline-start": "<line-width> || <line-style> || <color>",
+ "border-inline-start-clip": "none | [ <length-percentage [0,∞]> | <flex> ]+",
+ "border-inline-start-color": "<color> | <image-1D>",
+ "border-inline-start-radius": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "border-inline-start-style": "<line-style>",
+ "border-inline-start-width": "<line-width>",
+ "border-inline-style": "<'border-top-style'>{1,2}",
+ "border-inline-width": "<'border-top-width'>{1,2}",
+ "border-left-clip": "none | [ <length-percentage [0,∞]> | <flex> ]+",
+ "border-left-color": "<color> | <image-1D>",
+ "border-left-radius": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "border-limit": "all | [ sides | corners ] <length-percentage [0,∞]>? | [ top | right | bottom | left ] <length-percentage [0,∞]>",
+ "border-radius": "<length-percentage [0,∞]>{1,4} [ / <length-percentage [0,∞]>{1,4} ]?",
+ "border-right-clip": "none | [ <length-percentage [0,∞]> | <flex> ]+",
+ "border-right-color": "<color> | <image-1D>",
+ "border-right-radius": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "border-shape": "none | [ <basic-shape> <geometry-box>? ]{1,2}",
+ "border-spacing": "<length>{1,2}",
+ "border-start-end-radius": "<border-radius>",
+ "border-start-start-radius": "<border-radius>",
+ "border-style": "<'border-top-style'>{1,4}",
+ "border-top-clip": "none | [ <length-percentage [0,∞]> | <flex> ]+",
+ "border-top-color": "<color> | <image-1D>",
+ "border-top-left-radius": "<border-radius>",
+ "border-top-radius": "<length-percentage [0,∞]>{1,2} [ / <length-percentage [0,∞]>{1,2} ]?",
+ "border-top-right-radius": "<border-radius>",
+ "border-width": "<'border-top-width'>{1,4}",
+ "bottom": "| <anchor()> | <anchor-size()>",
+ "box-shadow": "<spread-shadow>#",
+ "box-shadow-blur": "<length [0,∞]>#",
+ "box-shadow-color": "<color>#",
+ "box-shadow-offset": "[ none | <length>{1,2} ]#",
+ "box-shadow-position": "[ outset | inset ]#",
+ "box-shadow-spread": "<length>#",
+ "box-snap": "none | block-start | block-end | center | baseline | last-baseline",
+ "caret": "<'caret-color'> || <'caret-animation'> || <'caret-shape'>",
+ "caret-animation": "auto | manual",
+ "clear": "| block-start | block-end | top | bottom | both-inline | both-block",
+ "clip": "rect( <top> , <right> , <bottom> , <left> ) | rect( <top> <right> <bottom> <left> ) | auto",
+ "color-adjust": "<'print-color-adjust'>",
+ "color-interpolation": "auto | sRGB | linearRGB",
+ "column-count": "auto | <integer [1,∞]>",
+ "column-fill": "| balance-all",
+ "column-gap": "normal | <length-percentage [0,∞]>",
+ "column-height": "auto | <length [0,∞]>",
+ "column-rule": "<gap-rule-list> | <gap-auto-rule-list>",
+ "column-rule-break": "none | spanning-item | intersection",
+ "column-rule-color": "<line-color-list> | <auto-line-color-list>",
+ "column-rule-edge-inset": "<length-percentage> [ <length-percentage> ]?",
+ "column-rule-edge-inset-end": "auto | <length-percentage>",
+ "column-rule-edge-inset-start": "auto | <length-percentage>",
+ "column-rule-inset": "<length-percentage> <length-percentage>? [ / <length-percentage> <length-percentage>? ]?",
+ "column-rule-inset-end": "auto | <length-percentage>",
+ "column-rule-inset-start": "auto | <length-percentage>",
+ "column-rule-interior-inset": "<length-percentage> [ <length-percentage> ]?",
+ "column-rule-interior-inset-end": "auto | <length-percentage>",
+ "column-rule-interior-inset-start": "auto | <length-percentage>",
+ "column-rule-style": "<line-style-list> | <auto-line-style-list>",
+ "column-rule-width": "<line-width-list> | <auto-line-width-list>",
+ "column-span": "| <integer [1,∞]> | auto",
+ "column-width": "auto | <length [0,∞]> | min-content | max-content | fit-content( <length-percentage> )",
+ "column-wrap": "auto | nowrap | wrap",
+ "columns": "[ <'column-width'> || <'column-count'> ] [ / <'column-height'> ]?",
+ "contain": "none | strict | content | [ [ size | inline-size ] || layout || style || paint ]",
+ "contain-intrinsic-block-size": "[ auto | from-element ]? [ none | <length [0,∞]> ]",
+ "contain-intrinsic-height": "[ auto | from-element ]? [ none | <length [0,∞]> ]",
+ "contain-intrinsic-inline-size": "[ auto | from-element ]? [ none | <length [0,∞]> ]",
+ "contain-intrinsic-size": "[ [ auto | from-element ]? [ none | <length [0,∞]> ] ]{1,2}",
+ "contain-intrinsic-width": "[ auto | from-element ]? [ none | <length [0,∞]> ]",
+ "container-type": "normal | [ [ size | inline-size ] || scroll-state ]",
+ "content": "normal | none | [ <content-replacement> | <content-list> ] [ / [ <string> | <counter> | <attr()> ]+ ]? | <element()>",
+ "continue": "auto | discard | collapse | -webkit-legacy | overflow | paginate | fragments",
+ "copy-into": "none | [ [ <custom-ident> <content-level> ] [, <custom-ident> <content-level> ]* ]?",
+ "corner": "<'border-radius'> || <'corner-shape'>",
+ "corner-block-end": "<'border-top-radius'> || <'corner-top-shape'>",
+ "corner-block-end-shape": "<'corner-top-left-shape'>{1,2}",
+ "corner-block-start": "<'border-top-radius'> || <'corner-top-shape'>",
+ "corner-block-start-shape": "<'corner-top-left-shape'>{1,2}",
+ "corner-bottom": "<'border-top-radius'> || <'corner-top-shape'>",
+ "corner-bottom-left": "<'border-top-left-radius'> || <'corner-top-left-shape'>",
+ "corner-bottom-left-shape": "<corner-shape-value>",
+ "corner-bottom-right": "<'border-top-left-radius'> || <'corner-top-left-shape'>",
+ "corner-bottom-right-shape": "<corner-shape-value>",
+ "corner-bottom-shape": "<'corner-top-left-shape'>{1,2}",
+ "corner-end-end": "<'border-top-left-radius'> || <'corner-top-left-shape'>",
+ "corner-end-end-shape": "<corner-shape-value>",
+ "corner-end-start": "<'border-top-left-radius'> || <'corner-top-left-shape'>",
+ "corner-end-start-shape": "<corner-shape-value>",
+ "corner-inline-end": "<'border-top-radius'> || <'corner-top-shape'>",
+ "corner-inline-end-shape": "<'corner-top-left-shape'>{1,2}",
+ "corner-inline-start": "<'border-top-radius'> || <'corner-top-shape'>",
+ "corner-inline-start-shape": "<'corner-top-left-shape'>{1,2}",
+ "corner-left": "<'border-top-radius'> || <'corner-top-shape'>",
+ "corner-left-shape": "<'corner-top-left-shape'>{1,2}",
+ "corner-right": "<'border-top-radius'> || <'corner-top-shape'>",
+ "corner-right-shape": "<'corner-top-left-shape'>{1,2}",
+ "corner-shape": "<'corner-top-left-shape'>{1,4}",
+ "corner-start-end": "<'border-top-left-radius'> || <'corner-top-left-shape'>",
+ "corner-start-end-shape": "<corner-shape-value>",
+ "corner-start-start": "<'border-top-left-radius'> || <'corner-top-left-shape'>",
+ "corner-start-start-shape": "<corner-shape-value>",
+ "corner-top": "<'border-top-radius'> || <'corner-top-shape'>",
+ "corner-top-left": "<'border-top-left-radius'> || <'corner-top-left-shape'>",
+ "corner-top-left-shape": "<corner-shape-value>",
+ "corner-top-right": "<'border-top-left-radius'> || <'corner-top-left-shape'>",
+ "corner-top-right-shape": "<corner-shape-value>",
+ "corner-top-shape": "<'corner-top-left-shape'>{1,2}",
+ "cursor": "[ <cursor-image> , ]* <cursor-predefined>",
+ "cx": "<length-percentage>",
+ "cy": "<length-percentage>",
+ "display": "[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy> | grid-lanes | inline-grid-lanes | ruby | ruby-base | ruby-text | ruby-base-container | ruby-text-container | <display-outside> | <-non-standard-display> || [ <display-inside> | math ]",
+ "dominant-baseline": "auto | text-bottom | text-top | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge",
+ "dynamic-range-limit": "standard | no-limit | constrained | <dynamic-range-limit-mix()>",
+ "event-trigger": "none | [ <'event-trigger-name'> <'event-trigger-source'> ]#",
+ "event-trigger-name": "none | <dashed-ident>#",
+ "event-trigger-source": "[ none | <event-trigger-event>+ [ / <event-trigger-event>+ ]? ]#",
+ "fill-break": "bounding-box | slice | clone",
+ "fill-color": "<color>",
+ "fill-image": "<paint>#",
+ "fill-opacity": "<'opacity'>",
+ "fill-origin": "match-parent | fill-box | stroke-box | content-box | padding-box | border-box",
+ "fill-position": "<position>#",
+ "fill-repeat": "<repeat-style>#",
+ "fill-size": "<bg-size>#",
+ "filter": "none | <filter-value-list>",
+ "flex-grow": "<number [0,∞]>",
+ "flex-shrink": "<number [0,∞]>",
+ "float": "| block-start | block-end | snap-block | snap-block( <length> , [ start | end | near ]? ) | snap-inline | snap-inline( <length> , [ left | right | near ]? ) | top | bottom | footnote",
+ "float-defer": "<integer> | last | none",
+ "float-offset": "<length-percentage>",
+ "float-reference": "inline | column | region | page",
+ "flood-color": "<color>",
+ "flood-opacity": "<'opacity'>",
+ "flow-from": "<custom-ident> | none",
+ "flow-into": "none | <custom-ident> [ element | content ]?",
+ "flow-tolerance": "normal | <length-percentage> | infinite",
+ "font-palette": "| <palette-mix()>",
+ "font-size": "<absolute-size> | <relative-size> | <length-percentage [0,∞]> | math",
+ "font-size-adjust": "none | [ ex-height | cap-height | ch-width | ic-width | ic-height ]? [ from-font | <number [0,∞]> ]",
+ "font-stretch": "normal | <percentage [0,∞]> | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded",
+ "font-style": "normal | italic | left | right | oblique <angle [-90deg,90deg]>?",
+ "font-synthesis-style": "auto | none | oblique-only",
+ "font-variant": "normal | none | [ [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ] || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ] || [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ] || [ <east-asian-variant-values> || <east-asian-width-values> || ruby ] || [ sub | super ] || [ text | emoji | unicode ] ]",
+ "font-variation-settings": "normal | [ <opentype-tag> <number> ]#",
+ "font-width": "normal | <percentage [0,∞]> | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded",
+ "footnote-display": "block | inline | compact",
+ "footnote-policy": "auto | line | block",
+ "glyph-orientation-vertical": "auto | 0deg | 90deg | 0 | 90",
+ "grid-column-gap": "normal | <length-percentage [0,∞]>",
+ "grid-gap": "<'row-gap'> <'column-gap'>?",
+ "grid-row-gap": "normal | <length-percentage [0,∞]>",
+ "height": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content( <length-percentage [0,∞]> ) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain | <-non-standard-size>",
+ "hyphenate-limit-last": "none | always | column | page | spread",
+ "hyphenate-limit-lines": "no-limit | <integer>",
+ "hyphenate-limit-zone": "<length-percentage>",
+ "image-orientation": "from-image | none | [ <angle> || flip ]",
+ "image-rendering": "auto | smooth | high-quality | pixelated | crisp-edges | <-non-standard-image-rendering>",
+ "initial-letter": "normal | <number [1,∞]> <integer [1,∞]> | <number [1,∞]> && [ drop | raise ]?",
+ "initial-letter-align": "[ border-box? [ alphabetic | ideographic | hanging | leading ]? ]!",
+ "initial-letter-wrap": "none | first | all | grid | <length-percentage>",
+ "inline-sizing": "normal | stretch",
+ "interactivity": "auto | inert",
+ "interest-delay": "<'interest-delay-start'>{1,2}",
+ "interest-delay-end": "normal | <time>",
+ "interest-delay-start": "normal | <time>",
+ "isolation": "<isolation-mode>",
+ "item-cross": "[ auto | nowrap | wrap ] || [ normal | reverse ] | wrap-reverse",
+ "item-direction": "auto | row | column | row-reverse | column-reverse",
+ "item-flow": "<'item-direction'> || <'item-wrap'> || <'item-pack'> || <'flow-tolerance'>",
+ "item-pack": "normal | dense || balance",
+ "item-track": "auto | row | column | row-reverse | column-reverse",
+ "item-wrap": "[ auto | nowrap | wrap ] || [ normal | reverse ] | wrap-reverse",
+ "justify-items": " | anchor-center",
+ "justify-self": " | anchor-center",
+ "left": "| <anchor()> | <anchor-size()>",
+ "lighting-color": "<color>",
+ "line-clamp": "none | [ <integer [1,∞]> || <'block-ellipsis'> ] -webkit-legacy?",
+ "line-fit-edge": "leading | <text-edge>",
+ "line-grid": "match-parent | create",
+ "line-height": "normal | <number [0,∞]> | <length-percentage [0,∞]>",
+ "line-height-step": "<length [0,∞]>",
+ "line-padding": "<length>",
+ "line-snap": "none | baseline | contain",
+ "link-parameters": "none | <param()>#",
+ "list-style": "<'list-style-position'> || <'list-style-image'> || <'list-style-type'>",
+ "margin": "<'margin-top'>{1,4}",
+ "margin-block": "<'margin-top'>{1,2}",
+ "margin-block-end": "<'margin-top'>",
+ "margin-block-start": "<'margin-top'>",
+ "margin-bottom": "| <anchor-size()>",
+ "margin-break": "auto | keep | discard",
+ "margin-inline": "<'margin-top'>{1,2}",
+ "margin-inline-end": "<'margin-top'>",
+ "margin-inline-start": "<'margin-top'>",
+ "margin-left": "| <anchor-size()>",
+ "margin-right": "| <anchor-size()>",
+ "margin-top": "| <anchor-size()>",
+ "margin-trim": "none | [ block || inline ] | [ block-start || inline-start || block-end || inline-end ]",
+ "marker": "none | <marker-ref>",
+ "marker-end": "none | <marker-ref>",
+ "marker-mid": "none | <marker-ref>",
+ "marker-side": "match-self | match-parent",
+ "marker-start": "none | <marker-ref>",
+ "mask-border-slice": "[ <number> | <percentage> ]{1,4} fill?",
+ "mask-clip": "[ <coord-box> | no-clip ]#",
+ "mask-origin": "<coord-box>#",
+ "max-height": "none | <length-percentage [0,∞]> | min-content | max-content | fit-content( <length-percentage [0,∞]> ) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain | <-non-standard-size>",
+ "max-lines": "none | <integer [1,∞]>",
+ "max-width": "none | <length-percentage [0,∞]> | min-content | max-content | fit-content( <length-percentage [0,∞]> ) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain | <-non-standard-size>",
+ "min-height": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content( <length-percentage [0,∞]> ) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain | <-non-standard-size>",
+ "min-intrinsic-sizing": "legacy | zero-if-scroll || zero-if-extrinsic",
+ "min-width": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content( <length-percentage [0,∞]> ) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain | <-non-standard-size>",
+ "object-fit": "fill | none | [ contain | cover ] || scale-down",
+ "object-view-box": "none | <basic-shape-rect>",
+ "opacity": "<opacity-value>",
+ "orphans": "<integer [1,∞]>",
+ "outline": "<'outline-width'> || <'outline-style'> || <'outline-color'>",
+ "outline-color": "auto | <'border-top-color'>",
+ "outline-style": "auto | none | dotted | dashed | solid | double | groove | ridge | inset | outset",
+ "overflow": "<'overflow-block'>{1,2} | <-non-standard-overflow>",
+ "overflow-block": "| <-non-standard-overflow>",
+ "overflow-clip-margin-block": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-block-end": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-block-start": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-bottom": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-inline": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-inline-end": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-inline-start": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-left": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-right": "<visual-box> || <length [0,∞]>",
+ "overflow-clip-margin-top": "<visual-box> || <length [0,∞]>",
+ "overflow-inline": "| <-non-standard-overflow>",
+ "overflow-x": "| <-non-standard-overflow>",
+ "overflow-y": "| <-non-standard-overflow>",
+ "padding": "<'padding-top'>{1,4}",
+ "padding-block": "<'padding-top'>{1,2}",
+ "padding-block-end": "<'padding-top'>",
+ "padding-block-start": "<'padding-top'>",
+ "padding-bottom": "<length-percentage [0,∞]>",
+ "padding-inline": "<'padding-top'>{1,2}",
+ "padding-inline-end": "<'padding-top'>",
+ "padding-inline-start": "<'padding-top'>",
+ "padding-left": "<length-percentage [0,∞]>",
+ "padding-right": "<length-percentage [0,∞]>",
+ "padding-top": "<length-percentage [0,∞]>",
+ "pause-after": "<time [0s,∞]> | none | x-weak | weak | medium | strong | x-strong",
+ "pause-before": "<time [0s,∞]> | none | x-weak | weak | medium | strong | x-strong",
+ "perspective": "none | <length [0,∞]>",
+ "pointer-events": "| bounding-box",
+ "pointer-timeline": "[ <'pointer-timeline-name'> <'pointer-timeline-axis'>? ]#",
+ "pointer-timeline-axis": "[ block | inline | x | y ]#",
+ "pointer-timeline-name": "[ none | <dashed-ident> ]#",
+ "position": "| <running()>",
+ "position-anchor": "none | auto | <anchor-name>",
+ "position-try-fallbacks": "none | [ [ <dashed-ident> || <try-tactic> ] | <position-area> ]#",
+ "quotes": "| match-parent",
+ "r": "<length-percentage>",
+ "reading-flow": "normal | source-order | flex-visual | flex-flow | grid-rows | grid-columns | grid-order",
+ "reading-order": "<integer>",
+ "region-fragment": "auto | break",
+ "rest-after": "<time [0s,∞]> | none | x-weak | weak | medium | strong | x-strong",
+ "rest-before": "<time [0s,∞]> | none | x-weak | weak | medium | strong | x-strong",
+ "right": "| <anchor()> | <anchor-size()>",
+ "row-gap": "normal | <length-percentage [0,∞]>",
+ "row-rule": "<gap-rule-list> | <gap-auto-rule-list>",
+ "row-rule-break": "none | spanning-item | intersection",
+ "row-rule-color": "<line-color-list> | <auto-line-color-list>",
+ "row-rule-edge-inset": "<length-percentage> [ <length-percentage> ]?",
+ "row-rule-edge-inset-end": "auto | <length-percentage>",
+ "row-rule-edge-inset-start": "auto | <length-percentage>",
+ "row-rule-inset": "<length-percentage> <length-percentage>? [ / <length-percentage> <length-percentage>? ]?",
+ "row-rule-inset-end": "auto | <length-percentage>",
+ "row-rule-inset-start": "auto | <length-percentage>",
+ "row-rule-interior-inset": "<length-percentage> [ <length-percentage> ]?",
+ "row-rule-interior-inset-end": "auto | <length-percentage>",
+ "row-rule-interior-inset-start": "auto | <length-percentage>",
+ "row-rule-style": "<line-style-list> | <auto-line-style-list>",
+ "row-rule-width": "<line-width-list> | <auto-line-width-list>",
+ "ruby-merge": "separate | merge | auto",
+ "ruby-overhang": "auto | none",
+ "rule": "<'column-rule'>",
+ "rule-break": "<'column-rule-break'>",
+ "rule-color": "<'column-rule-color'>",
+ "rule-edge-inset": "<'column-rule-edge-inset'>",
+ "rule-inset": "<'column-rule-inset'>",
+ "rule-inset-end": "<'column-rule-inset-end'>",
+ "rule-inset-start": "<'column-rule-inset-start'>",
+ "rule-interior-inset": "<'column-rule-interior-inset'>",
+ "rule-overlap": "row-over-column | column-over-row",
+ "rule-style": "<'column-rule-style'>",
+ "rule-width": "<'column-rule-width'>",
+ "rx": "<length-percentage> | auto",
+ "ry": "<length-percentage> | auto",
+ "scroll-initial-target": "none | nearest",
+ "scroll-marker-group": "none | before | after",
+ "scroll-padding": "[ auto | <length-percentage [0,∞]> ]{1,4}",
+ "scroll-padding-block": "[ auto | <length-percentage [0,∞]> ]{1,2}",
+ "scroll-padding-block-end": "auto | <length-percentage [0,∞]>",
+ "scroll-padding-block-start": "auto | <length-percentage [0,∞]>",
+ "scroll-padding-bottom": "auto | <length-percentage [0,∞]>",
+ "scroll-padding-inline": "[ auto | <length-percentage [0,∞]> ]{1,2}",
+ "scroll-padding-inline-end": "auto | <length-percentage [0,∞]>",
+ "scroll-padding-inline-start": "auto | <length-percentage [0,∞]>",
+ "scroll-padding-left": "auto | <length-percentage [0,∞]>",
+ "scroll-padding-right": "auto | <length-percentage [0,∞]>",
+ "scroll-padding-top": "auto | <length-percentage [0,∞]>",
+ "scroll-target-group": "none | auto",
+ "scroll-timeline": "[ <'scroll-timeline-name'> <'scroll-timeline-axis'>? ]#",
+ "shape-image-threshold": "<opacity-value>",
+ "shape-inside": "auto | outside-shape | [ <basic-shape> || shape-box ] | <image> | display",
+ "shape-margin": "<length-percentage [0,∞]>",
+ "shape-padding": "<length-percentage [0,∞]>",
+ "shape-subtract": "none | [ <basic-shape> | <url> ]+",
+ "slider-orientation": "auto | left-to-right | right-to-left | top-to-bottom | bottom-to-top",
+ "spatial-navigation-action": "auto | focus | scroll",
+ "spatial-navigation-contain": "auto | contain",
+ "spatial-navigation-function": "normal | grid",
+ "stop-color": "<'color'>",
+ "stop-opacity": "<'opacity'>",
+ "string-set": "none | [ <custom-ident> <string>+ ]#",
+ "stroke-align": "center | inset | outset",
+ "stroke-alignment": "center | inner | outer",
+ "stroke-break": "bounding-box | slice | clone",
+ "stroke-color": "<color>#",
+ "stroke-dash-corner": "none | <length>",
+ "stroke-dash-justify": "none | [ stretch | compress ] || [ dashes || gaps ]",
+ "stroke-dashadjust": "none | [ stretch | compress ] [ dashes | gaps ]?",
+ "stroke-dasharray": "none | [ <length-percentage> | <number> ]+#",
+ "stroke-dashcorner": "none | <length>",
+ "stroke-dashoffset": "<length-percentage> | <number>",
+ "stroke-image": "<paint>#",
+ "stroke-linejoin": "[ crop | arcs | miter ] || [ bevel | round | fallback ]",
+ "stroke-miterlimit": "<number>",
+ "stroke-origin": "match-parent | fill-box | stroke-box | content-box | padding-box | border-box",
+ "stroke-position": "<position>#",
+ "stroke-repeat": "<repeat-style>#",
+ "stroke-size": "<bg-size>#",
+ "stroke-width": "[ <length-percentage> | <number> ]#",
+ "tab-size": "<number [0,∞]> | <length [0,∞]>",
+ "text-align": "| <string> | justify-all",
+ "text-align-all": "start | end | left | right | center | <string> | justify | match-parent",
+ "text-align-last": "| match-parent",
+ "text-autospace": "normal | <autospace> | auto",
+ "text-box": "normal | <'text-box-trim'> || <'text-box-edge'>",
+ "text-box-edge": "auto | <text-edge>",
+ "text-box-trim": "none | trim-start | trim-end | trim-both",
+ "text-combine-upright": "none | all | [ digits <integer [2,4]>? ]",
+ "text-decoration-inset": "<length>{1,2} | auto",
+ "text-decoration-skip": "none | auto",
+ "text-decoration-skip-box": "none | all",
+ "text-decoration-skip-self": "auto | skip-all | [ skip-underline || skip-overline || skip-line-through ] | no-skip",
+ "text-decoration-skip-spaces": "none | all | [ start || end ]",
+ "text-decoration-thickness": "auto | from-font | <length-percentage>",
+ "text-emphasis-skip": "spaces || punctuation || symbols || narrow",
+ "text-group-align": "none | start | end | left | right | center",
+ "text-indent": "[ <length-percentage> ] && hanging? && each-line?",
+ "text-justify": "[ auto | none | inter-word | inter-character | ruby ] || no-compress",
+ "text-overflow": "[ clip | ellipsis | <string> | fade | fade( [ <length> | <percentage> ] ) ]{1,2}",
+ "text-shadow": "none | <shadow>#",
+ "text-size-adjust": "auto | none | <percentage [0,∞]>",
+ "text-spacing": "none | auto | <spacing-trim> || <autospace>",
+ "text-spacing-trim": "<spacing-trim> | auto",
+ "text-transform": "none | [ capitalize | uppercase | lowercase ] || full-width || full-size-kana | math-auto",
+ "text-underline-offset": "auto | <length-percentage>",
+ "text-underline-position": "auto | [ from-font | under ] || [ left | right ]",
+ "text-wrap-mode": "wrap | nowrap",
+ "text-wrap-style": "auto | balance | stable | pretty | avoid-orphans",
+ "timeline-scope": "| all",
+ "timeline-trigger": "none | [ <'timeline-trigger-name'> <'timeline-trigger-source'> <'timeline-trigger-range'> [ '/' <'timeline-trigger-exit-range'> ]? ]#",
+ "timeline-trigger-exit-range": "[ <'timeline-trigger-exit-range-start'> <'timeline-trigger-exit-range-end'>? ]#",
+ "timeline-trigger-exit-range-end": "[ auto | normal | <length-percentage> | <timeline-range-name> <length-percentage>? ]#",
+ "timeline-trigger-exit-range-start": "[ auto | normal | <length-percentage> | <timeline-range-name> <length-percentage>? ]#",
+ "timeline-trigger-name": "none | <dashed-ident>#",
+ "timeline-trigger-range": "[ <'timeline-trigger-range-start'> <'timeline-trigger-range-end'>? ]#",
+ "timeline-trigger-range-end": "[ normal | <length-percentage> | <timeline-range-name> <length-percentage>? ]#",
+ "timeline-trigger-range-start": "[ normal | <length-percentage> | <timeline-range-name> <length-percentage>? ]#",
+ "timeline-trigger-source": "<single-animation-timeline>#",
+ "top": "| <anchor()> | <anchor-size()>",
+ "transform-origin": "[ left | center | right | top | bottom | <length-percentage> ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] <length>? | [ [ center | left | right ] && [ center | top | bottom ] ] <length>?",
+ "transition-duration": "<time [0s,∞]>#",
+ "trigger-scope": "none | all | <dashed-ident>#",
+ "vertical-align": "[ first | last ] || <'alignment-baseline'> || <'baseline-shift'>",
+ "view-timeline": "[ <'view-timeline-name'> [ <'view-timeline-axis'> || <'view-timeline-inset'> ]? ]#",
+ "view-timeline-name": "[ none | <dashed-ident> ]#",
+ "view-transition-class": "none | <custom-ident>+",
+ "view-transition-group": "normal | contain | nearest | <custom-ident>",
+ "view-transition-scope": "none | auto",
+ "visibility": "visible | hidden | force-hidden | collapse",
+ "voice-duration": "auto | <time [0s,∞]>",
+ "voice-family": "[ <voice-family-name> | <generic-voice> ]# | preserve",
+ "voice-pitch": "<frequency [0Hz,∞]> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency [0Hz,∞]> | <semitones> | <percentage> ] ]",
+ "voice-range": "<frequency [0Hz,∞]> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency [0Hz,∞]> | <semitones> | <percentage> ] ]",
+ "voice-rate": "[ normal | x-slow | slow | medium | fast | x-fast ] || <percentage [0,∞]>",
+ "widows": "<integer [1,∞]>",
+ "width": "auto | <length-percentage [0,∞]> | min-content | max-content | fit-content( <length-percentage [0,∞]> ) | <calc-size()> | <anchor-size()> | stretch | fit-content | contain | <-non-standard-size>",
+ "word-break": "| manual",
+ "word-space-transform": "none | [ space | ideographic-space ] && auto-phrase?",
+ "word-spacing": "normal | <length-percentage>",
+ "word-wrap": "| anywhere",
+ "wrap-after": "auto | avoid | avoid-line | avoid-flex | line | flex",
+ "wrap-before": "auto | avoid | avoid-line | avoid-flex | line | flex",
+ "wrap-flow": "auto | both | start | end | minimum | maximum | clear",
+ "wrap-inside": "auto | avoid",
+ "wrap-through": "wrap | none",
+ "x": "<length-percentage>",
+ "y": "<length-percentage>",
+ "zoom": "normal | reset | <number [0,∞]> | <percentage [0,∞]>"
+ },
+ "types": {
+ "dashed-ident": "<custom-property-name>",
+ "unicode-range-token": "<urange>",
+ "alpha()": "alpha( [ from <color> ] [ / [ <alpha-value> | alpha | none ] ]? )",
+ "anchor-size()": "anchor-size( [ <anchor-name> || <anchor-size> ]? , <length-percentage>? )",
+ "anchor()": "anchor( <anchor-name>? && <anchor-side> , <length-percentage>? )",
+ "anchored-feature": "fallback : <'position-try-fallbacks'>",
+ "anchored-in-parens": "( <anchored-query> ) | ( <anchored-feature> ) | <general-enclosed>",
+ "anchored-query": "not <anchored-in-parens> | <anchored-in-parens> [ [ and <anchored-in-parens> ]* | [ or <anchored-in-parens> ]* ] | <anchored-feature>",
+ "angle-percentage": "[ <angle> | <percentage> ]",
+ "angular-color-hint": "| <zero>",
+ "angular-color-stop": "<color> <color-stop-angle>?",
+ "angular-color-stop-list": "<angular-color-stop> , [ <angular-color-hint>? , <angular-color-stop> ]#?",
+ "animation-action": "none | play | pause | play-forwards | play-backwards | pause | reset | replay",
+ "arc-command": "arc <command-end-point> [ [ of <length-percentage>{1,2} ] && <arc-sweep>? && <arc-size>? && [ rotate <angle> ]? ]",
+ "arc-size": "large | small",
+ "arc-sweep": "cw | ccw",
+ "attr-args": "attr( <declaration-value> , <declaration-value>? )",
+ "attr-name": "[ [ <ident-token>? '|' ]? <ident-token> ]",
+ "attr-type": "type( <syntax> ) | raw-string | number | <attr-unit>",
+ "attr-unit": "'%' | em | ex | cap | ch | ic | rem | lh | rlh | vw | vh | vi | vb | vmin | vmax | cm | mm | q | in | pc | pt | px | deg | grad | rad | turn | s | ms | hz | khz | fr",
+ "attr()": "attr( <attr-name> <attr-type>? , <declaration-value>? )",
+ "auto-line-color-list": "<line-color-or-repeat>#? , <auto-repeat-line-color> , <line-color-or-repeat>#?",
+ "auto-line-style-list": "<line-style-or-repeat>#? , <auto-repeat-line-style> , <line-style-or-repeat>#?",
+ "auto-line-width-list": "<line-width-or-repeat>#? , <auto-repeat-line-width> , <line-width-or-repeat>#?",
+ "auto-repeat": "repeat( [ auto-fill | auto-fit ] , [ <line-names>? <track-size> ]+ <line-names>? )",
+ "auto-repeat-line-color": "repeat( auto , [ <color> ]# )",
+ "auto-repeat-line-style": "repeat( auto , [ <line-style> ]# )",
+ "auto-repeat-line-width": "repeat( auto , [ <line-width> ]# )",
+ "autospace": "no-autospace | [ ideograph-alpha || ideograph-numeric || punctuation ] || [ insert | replace ]",
+ "baseline-position": "[ first | last ]? && baseline",
+ "basic-shape": "<basic-shape-rect> | <circle()> | <ellipse()> | <polygon()> | <path()> | <shape()>",
+ "basic-shape-rect": "<inset()> | rect( [ <length-percentage> | auto ]{4} [ round <'border-radius'> ]? ) | xywh( <length-percentage>{2} <length-percentage [0,∞]>{2} [ round <'border-radius'> ]? )",
+ "bg-clip": "<visual-box> | [ border-area || text ]",
+ "bg-layer": "<bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <bg-clip> || <visual-box>",
+ "bg-position": "<position> | <position-three>",
+ "bg-size": "[ <length-percentage [0,∞]> | auto ]{1,2} | cover | contain",
+ "blend-mode": "normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | soft-light | hard-light | difference | exclusion | hue | saturation | color | luminosity",
+ "blur()": "blur( <length>? )",
+ "border-radius": "<slash-separated-border-radius-syntax> | <legacy-border-radius-syntax>",
+ "calc-interpolate()": "calc-interpolate( [ <progress-source> && [ by <easing-function> ]? && <easing-function>? ] , <input-position>{1,2} : <calc-sum> , [ <easing-function>? , <input-position>{1,2} : <calc-sum> ]#? )",
+ "calc-keyword": "e | pi | infinity | -infinity | NaN",
+ "calc-mix()": "calc-mix( [ <calc-sum> <percentage [0,100]>? ]# )",
+ "calc-product": "<calc-value> [ [ '*' | / ] <calc-value> ]*",
+ "calc-size-basis": "[ <size-keyword> | <calc-size()> | <calc-sum> ]",
+ "calc-size()": "calc-size( [ [ <calc-size-basis> , [ <calc-sum> | size ] ] | [ any , <calc-sum> ] ] )",
+ "calc-value": "<number> | <dimension> | <percentage> | <calc-keyword> | ( <calc-sum> )",
+ "cf-image": "[ <image> | <color> ] && <percentage [0,100]>?",
+ "circle()": "circle( [ <radial-extent> | <length-percentage [0,∞]> ]? [ at <position> ]? )",
+ "clamp()": "clamp( [ <calc-sum> | none ] , <calc-sum> , [ <calc-sum> | none ] )",
+ "color": "<color-base> | currentColor | <system-color> | <contrast-color()> | <device-cmyk()> | <light-dark()> | <-non-standard-color>",
+ "color-font-tech": "[ color-COLRv0 | color-COLRv1 | color-SVG | color-sbix | color-CBDT ]",
+ "color-function": "<rgb()> | <rgba()> | <hsl()> | <hsla()> | <hwb()> | <lab()> | <lch()> | <oklab()> | <oklch()> | <ictcp()> | <jzazbz()> | <jzczhz()> | <alpha()> | <color()>",
+ "color-interpolate()": "color-interpolate( [ <progress-source> && [ by <easing-function> ]? && <easing-function>? && <color-interpolation-method>? ] , <input-position>{1,2} : <color> , [ [ <easing-function> || <color-interpolation-method> ]? , <input-position>{1,2} : <color> ]#? )",
+ "color-layers()": "color-layers( [ <blend-mode> , ]? <color># )",
+ "color-mix()": "color-mix( <color-interpolation-method>? , [ <color> && <percentage [0,100]>? ]# )",
+ "color-stop-angle": "[ <angle-percentage> | <zero> ]{1,2}",
+ "color-stop-list": "<linear-color-stop> , [ <linear-color-hint>? , <linear-color-stop> ]#?",
+ "color-stripe": "<color> && [ <length-percentage> | <flex> ]?",
+ "color()": "color( [ from <color> ]? [ <custom-params> | [ <predefined-rgb> [ <number> | <percentage> | r | g | b | alpha | none ]{3} [ / [ <alpha-value> | r | g | b | alpha | none ] ]? ] | [ <xyz-space> [ <number> | <percentage> | x | y | z | alpha | none ]{3} [ / [ <alpha-value> | x | y | z | alpha | none ] ]? ] ] )",
+ "colorspace-params": "[ <custom-params> | <predefined-rgb-params> | <xyz-params> ]",
+ "command-end-point": "[ to <position> | by <coordinate-pair> ]",
+ "compat-special": "textfield | menulist-button",
+ "composite-mode": "clear | copy | source-over | destination-over | source-in | destination-in | source-out | destination-out | source-atop | destination-atop | xor | lighter | plus-darker | plus-lighter",
+ "conic-gradient-syntax": "[ [ [ from [ <angle> | <zero> ] ]? [ at <position> ]? ] || <color-interpolation-method> ]? , <angular-color-stop-list>",
+ "conic-gradient()": "conic-gradient( [ <conic-gradient-syntax> ] )",
+ "container-condition": "[ <container-name>? <container-query>? ]!",
+ "container-query": "not <query-in-parens> | <query-in-parens> [ [ and <query-in-parens> ]* | [ or <query-in-parens> ]* ]",
+ "content-level": "element | content | text | <attr()> | <counter>",
+ "content-list": "[ <string> | contents | <image> | <counter> | <quote> | <target> | <leader()> | <attr()> | <string()> | <content()> ]+",
+ "content()": "content( [ text | before | after | first-letter | marker ]? )",
+ "contrast-color()": "contrast-color( <color> )",
+ "contrast()": "contrast( [ <number> | <percentage> ]? )",
+ "control-point": "[ <position> | <relative-control-point> ]",
+ "control-value()": "control-value( <type>? )",
+ "coord-box": "<paint-box> | view-box",
+ "coordinate-pair": "<length-percentage>{2}",
+ "corner-shape-value": "round | scoop | bevel | notch | square | squircle | <superellipse()>",
+ "counter-style": "<counter-style-name> | <symbols()>",
+ "cross-fade()": "cross-fade( <cf-image># )",
+ "cross-origin-modifier": "cross-origin( anonymous | use-credentials )",
+ "css-type": "<syntax-component> | <type()>",
+ "cubic-bezier-easing-function": "ease | ease-in | ease-out | ease-in-out | <cubic-bezier()>",
+ "cubic-bezier()": "cubic-bezier( [ <number [0,1]> , <number> ]#{2} )",
+ "cursor-image": "[ <url> | <url-set> ] [ <number>{2} ]?",
+ "cursor-predefined": "auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | grab | grabbing | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out",
+ "curve-command": "curve [ [ to <position> with <control-point> [ / <control-point> ]? ] | [ by <coordinate-pair> with <relative-control-point> [ / <relative-control-point> ]? ] ]",
+ "custom-arg": "'$' <ident-token>",
+ "custom-params": "<dashed-ident> [ <number> | <percentage> | none ]+",
+ "dasharray": "[ [ <length-percentage> | <number> ]+ ]#",
+ "dashndashdigit-ident": "<ident-token>",
+ "default-value": "<declaration-value>",
+ "deprecated-color": "ActiveBorder | ActiveCaption | AppWorkspace | Background | ButtonHighlight | ButtonShadow | CaptionText | InactiveBorder | InactiveCaption | InactiveCaptionText | InfoBackground | InfoText | Menu | MenuText | Scrollbar | ThreeDDarkShadow | ThreeDFace | ThreeDHighlight | ThreeDLightShadow | ThreeDShadow | Window | WindowFrame | WindowText",
+ "drop-shadow()": "drop-shadow( [ <color>? && <length>{2,3} ] )",
+ "dynamic-range-limit-mix()": "dynamic-range-limit-mix( [ <'dynamic-range-limit'> && <percentage [0,100]> ]#{2,} )",
+ "easing-function": "<linear-easing-function> | <cubic-bezier-easing-function> | <step-easing-function>",
+ "element()": "element( <id-selector> )",
+ "ellipse()": "ellipse( <radial-size>? [ at <position> ]? )",
+ "env()": "env( <custom-ident> <integer [0,∞]>* , <declaration-value>? )",
+ "event-trigger-event": "activate | click | touch | dblclick | keypress( <string> ) | . . .",
+ "fade()": "fade( [ <length-percentage> ] )",
+ "feature-index": "<integer [0,∞]>",
+ "feature-tag-value": "<opentype-tag> [ <integer [0,∞]> | on | off ]?",
+ "feature-value-name": "<ident>",
+ "filter-value-list": "[ <filter-function> | <url> ]+",
+ "filter()": "filter( [ <image> | <string> ] , <filter-value-list> )",
+ "final-bg-layer": "<bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <bg-clip> || <visual-box> || <'background-color'>",
+ "first-valid()": "first-valid( <declaration-value># )",
+ "fit-content()": "fit-content( <length-percentage> )",
+ "fixed-breadth": "<length-percentage [0,∞]>",
+ "font-features-tech": "[ features-opentype | features-aat | features-graphite ]",
+ "font-format": "[ <string> | collection | embedded-opentype | opentype | svg | truetype | woff | woff2 ]",
+ "font-src": "<url> [ format( <font-format> ) ]? [ tech( <font-tech># ) ]? | local( <family-name> )",
+ "font-src-list": "[ <url> [ format( <font-format> ) ]? [ tech( <font-tech># ) ]? | local( <family-name> ) ]#",
+ "font-tech": "[ <font-features-tech> | <color-font-tech> | variations | palettes | incremental ]",
+ "font-weight-absolute": "[ normal | bold | <number [1,1000]> ]",
+ "form-control-identifier": "select",
+ "frequency-percentage": "[ <frequency> | <percentage> ]",
+ "function-parameter": "<custom-property-name> <css-type>? [ : <default-value> ]?",
+ "gap-auto-repeat-rule": "repeat( auto , <gap-rule># )",
+ "gap-auto-rule-list": "<gap-rule-or-repeat>#? , <gap-auto-repeat-rule> , <gap-rule-or-repeat>#?",
+ "gap-repeat-rule": "repeat( <integer [1,∞]> , <gap-rule># )",
+ "gap-rule": "<line-width> || <line-style> || <color>",
+ "gap-rule-list": "<gap-rule-or-repeat>#",
+ "gap-rule-or-repeat": "<gap-rule> | <gap-repeat-rule>",
+ "generic-script-specific": "generic( fangsong ) | generic( kai ) | generic( khmer-mul ) | generic( nastaliq )",
+ "generic-voice": "<age>? <gender> <integer>?",
+ "gradient": "[ <linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()> | <conic-gradient()> | <repeating-conic-gradient()> | <-legacy-gradient> ]",
+ "grayscale()": "grayscale( [ <number> | <percentage> ]? )",
+ "grid-line": "auto | <custom-ident> | [ [ <integer [-∞,-1]> | <integer [1,∞]> ] && <custom-ident>? ] | [ span && [ <integer [1,∞]> || <custom-ident> ] ]",
+ "hdr-color()": "color-hdr( [ <color> && <number [0,∞]>? ]#{2} )",
+ "horizontal-line-command": "hline [ to [ <length-percentage> | left | center | right | x-start | x-end ] | by <length-percentage> ]",
+ "hsl()": "[ <legacy-hsl-syntax> | <modern-hsl-syntax> ]",
+ "hsla()": "[ <legacy-hsla-syntax> | <modern-hsla-syntax> ]",
+ "hue-rotate()": "hue-rotate( [ <angle> | <zero> ]? )",
+ "hwb()": "hwb( [ from <color> ]? [ <hue> | h | w | b | alpha | none ] [ <percentage> | <number> | h | w | b | alpha | none ] [ <percentage> | <number> | h | w | b | alpha | none ] [ / [ <alpha-value> | h | w | b | alpha | none ] ]? )",
+ "ictcp()": "ictcp( [ from <color> ]? [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? )",
+ "ident-arg": "<string> | <integer> | <ident>",
+ "ident()": "ident( <ident-arg>+ )",
+ "if-args": "if( [ <if-args-branch> ; ]* <if-args-branch> ;? )",
+ "if-args-branch": "<declaration-value> : <declaration-value>?",
+ "if-branch": "<if-condition> : <declaration-value>?",
+ "if-condition": "<boolean-expr[<if-test>]> | else",
+ "if-test": "supports( [ <ident> : <declaration-value> ] | <supports-condition> ) | media( <media-feature> | <media-condition> ) | style( <style-query> )",
+ "if()": "if( [ <if-branch> ; ]* <if-branch> ;? )",
+ "image-1D": "<stripes()>",
+ "image-set-option": "[ <image> | <string> ] [ <resolution> || type( <string> ) ]?",
+ "image-src": "[ <url> | <string> ]",
+ "image-tags": "[ ltr | rtl ]",
+ "import-conditions": "[ supports( [ <supports-condition> | <declaration> ] ) ]? <media-query-list>?",
+ "inflexible-breadth": "<length-percentage [0,∞]> | min-content | max-content | auto",
+ "inherit-args": "inherit( <declaration-value> , <declaration-value>? )",
+ "inherit()": "inherit( <custom-property-name> , <declaration-value>? )",
+ "init-descriptor": "<init-descriptor-name> : <string>",
+ "init-descriptor-name": "protocol | hostname | port | pathname | search | hash | base-url",
+ "init-descriptors": ";* <init-descriptor> [ ;+ <init-descriptor> ]* ;*",
+ "input-position": "<percentage> | <number> | <dimension>",
+ "integrity-modifier": "integrity( <string> )",
+ "interpolate()": "interpolate( [ <progress-source> && [ by <easing-function> ]? && <easing-function>? ] , <input-position>{1,2} : <whole-value> , [ <easing-function>? , <input-position>{1,2} : <whole-value> ]#? ) | interpolate( <progress-source> && [ by <easing-function> ]? && <easing-function>? of <keyframes-name> )",
+ "invert()": "invert( [ <number> | <percentage> ]? )",
+ "isolation-mode": "auto | isolate",
+ "jzazbz()": "jzazbz( [ from <color> ]? [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? )",
+ "jzczhz()": "jzczhz( [ from <color> ]? [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ <hue> | none ] [ / [ <alpha-value> | none ] ]? )",
+ "keyframe-selector": "from | to | <percentage [0,100]> | <timeline-range-name> <percentage>",
+ "lab()": "lab( [ from <color> ]? [ <percentage> | <number> | l | a | b | alpha | none ] [ <percentage> | <number> | l | a | b | alpha | none ] [ <percentage> | <number> | l | a | b | alpha | none ] [ / [ <alpha-value> | l | a | b | alpha | none ] ]? )",
+ "layout-box": "<visual-box> | margin-box",
+ "lch()": "lch( [ from <color> ]? [ <percentage> | <number> | l | c | h | alpha | none ] [ <percentage> | <number> | l | c | h | alpha | none ] [ <hue> | l | c | h | alpha | none ] [ / [ <alpha-value> | l | c | h | alpha | none ] ]? )",
+ "legacy-border-radius-syntax": "<length-percentage [0,∞]>{1,2}",
+ "legacy-hsl-syntax": "hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )",
+ "legacy-hsla-syntax": "hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",
+ "legacy-pseudo-element-selector": ": [ before | after | first-line | first-letter ]",
+ "legacy-rgb-syntax": "rgb( <percentage>#{3} , <alpha-value>? ) | rgb( <number>#{3} , <alpha-value>? )",
+ "legacy-rgba-syntax": "rgba( <percentage>#{3} , <alpha-value>? ) | rgba( <number>#{3} , <alpha-value>? )",
+ "length-percentage": "[ <length> | <percentage> ]",
+ "line-color-list": "<line-color-or-repeat>#",
+ "line-color-or-repeat": "[ <color> | <repeat-line-color> ]",
+ "line-command": "line <command-end-point>",
+ "line-style-list": "<line-style-or-repeat>#",
+ "line-style-or-repeat": "[ <line-style> | <repeat-line-style> ]",
+ "line-width": "<length [0,∞]> | thin | medium | thick",
+ "line-width-list": "<line-width-or-repeat>#",
+ "line-width-or-repeat": "[ <line-width> | <repeat-line-width> ]",
+ "linear-easing-function": "linear | <linear()>",
+ "linear-gradient-syntax": "[ [ <angle> | <zero> | to <side-or-corner> ] || <color-interpolation-method> ]? , <color-stop-list>",
+ "linear-gradient()": "linear-gradient( [ <linear-gradient-syntax> ] )",
+ "linear()": "linear( [ <number> && <percentage>{0,2} ]# )",
+ "link-condition": "<link-condition-base> [ with <navigation-param-expression> ]?",
+ "link-condition-base": "<navigation-location>",
+ "marker-ref": "<url>",
+ "media-and": "and <media-in-parens>",
+ "media-condition": "<media-not> | <media-in-parens> [ <media-and>* | <media-or>* ]",
+ "media-condition-without-or": "<media-not> | <media-in-parens> <media-and>*",
+ "media-or": "or <media-in-parens>",
+ "media()": "media( [ <mf-plain> | <mf-boolean> | <mf-range> ] )",
+ "mf-comparison": "<mf-lt> | <mf-gt> | <mf-eq>",
+ "mf-eq": "'='",
+ "mf-gt": "'>' '='?",
+ "mf-lt": "'<' '='?",
+ "mf-range": "<mf-name> <mf-comparison> <mf-value> | <mf-value> <mf-comparison> <mf-name> | <mf-value> <mf-lt> <mf-name> <mf-lt> <mf-value> | <mf-value> <mf-gt> <mf-name> <mf-gt> <mf-value>",
+ "modern-hsl-syntax": "hsl( [ from <color> ]? [ <hue> | h | s | l | alpha | none ] [ <percentage> | <number> | h | s | l | alpha | none ] [ <percentage> | <number> | h | s | l | alpha | none ] [ / [ <alpha-value> | h | s | l | alpha | none ] ]? )",
+ "modern-hsla-syntax": "hsla( [ from <color> ]? [ <hue> | h | s | l | alpha | none ] [ <percentage> | <number> | h | s | l | alpha | none ] [ <percentage> | <number> | h | s | l | alpha | none ] [ / [ <alpha-value> | h | s | l | alpha | none ] ]? )",
+ "modern-rgb-syntax": "rgb( [ from <color> ]? [ <number> | <percentage> | r | g | b | alpha | none ]{3} [ / [ <alpha-value> | r | g | b | alpha | none ] ]? )",
+ "modern-rgba-syntax": "rgba( [ from <color> ]? [ <number> | <percentage> | r | g | b | alpha | none ]{3} [ / [ <alpha-value> | r | g | b | alpha | none ] ]? )",
+ "move-command": "move <command-end-point>",
+ "mq-boolean": "<integer [0,1]>",
+ "n-dimension": "<dimension-token>",
+ "navigation-condition": "not <navigation-in-parens> | <navigation-in-parens> [ and <navigation-in-parens> ]* | <navigation-in-parens> [ or <navigation-in-parens> ]*",
+ "navigation-in-parens": "( <navigation-condition> ) | ( <navigation-test> ) | <general-enclosed>",
+ "navigation-location": "<route-name> | <url-pattern()>",
+ "navigation-location-keyword": "at | from | to",
+ "navigation-location-test": "<navigation-location-keyword> : <navigation-location>",
+ "navigation-param": "<navigation-param-key-value> | <navigation-param-function>",
+ "navigation-param-and": "<navigation-param-expression> [ \" and \" <navigation-param-expression> ]*",
+ "navigation-param-expression": "( <navigation-param-and> ) | ( <navigation-param-or> ) | <navigation-param>",
+ "navigation-param-function": "navigation-param( <ident> )",
+ "navigation-param-key-value": "( <ident> : <string> )",
+ "navigation-param-or": "<navigation-param-expression> [ \" or \" <navigation-param-expression> ]*",
+ "navigation-test": "<navigation-location-test> | <navigation-type-test>",
+ "navigation-type-keyword": "traverse | back | forward | reload",
+ "navigation-type-test": "history : <navigation-type-keyword>",
+ "ndash-dimension": "<dimension-token>",
+ "ndashdigit-dimension": "<dimension-token>",
+ "ndashdigit-ident": "<ident-token>",
+ "number-optional-number": "<number> <number>?",
+ "oklab()": "oklab( [ from <color> ]? [ <percentage> | <number> | l | a | b | alpha | none ] [ <percentage> | <number> | l | a | b | alpha | none ] [ <percentage> | <number> | l | a | b | alpha | none ] [ / [ <alpha-value> | l | a | b | alpha | none ] ]? )",
+ "oklch()": "oklch( [ from <color> ]? [ <percentage> | <number> | l | c | h | alpha | none ] [ <percentage> | <number> | l | c | h | alpha | none ] [ <hue> | l | c | h | alpha | none ] [ / [ <alpha-value> | l | c | h | alpha | none ] ]? )",
+ "opacity-value": "<number> | <percentage>",
+ "opacity()": "opacity( [ <number> | <percentage> ]? )",
+ "opentype-tag": "<string>",
+ "outline-line-style": "none | auto | dotted | dashed | solid | double | groove | ridge | inset | outset",
+ "page-selector": "[ <ident-token>? <pseudo-page>* ]!",
+ "page-selector-list": "<page-selector>#",
+ "paint": "none | <color> | <url> [ none | <color> ]? | context-fill | context-stroke | <image> | <svg-paint>",
+ "paint-box": "<visual-box> | fill-box | stroke-box",
+ "palette-mix()": "palette-mix( <color-interpolation-method> , [ [ normal | light | dark | <palette-identifier> | <palette-mix()> ] && <percentage [0,100]>? ]#{2} )",
+ "param()": "param( <dashed-ident> , <declaration-value>? )",
+ "path()": "path( <'fill-rule'>? , <string> )",
+ "pattern-descriptor": "pattern : <url-pattern()>",
+ "pattern-descriptors": ";* <pattern-descriptor> ;*",
+ "pointer-axis": "block | inline | x | y",
+ "pointer-source": "root | nearest | self",
+ "pointer()": "pointer( [ <pointer-source> || <pointer-axis> ]? )",
+ "points": "[ <number>+ ]#",
+ "polygon()": "polygon( <'fill-rule'>? [ round <length> ]? , [ <length-percentage> <length-percentage> ]# )",
+ "position": "<position-one> | <position-two> | <position-four>",
+ "position-area": "[ [ left | center | right | span-left | span-right | x-start | x-end | span-x-start | span-x-end | self-x-start | self-x-end | span-self-x-start | span-self-x-end | span-all ] || [ top | center | bottom | span-top | span-bottom | y-start | y-end | span-y-start | span-y-end | self-y-start | self-y-end | span-self-y-start | span-self-y-end | span-all ] | [ block-start | center | block-end | span-block-start | span-block-end | span-all ] || [ inline-start | center | inline-end | span-inline-start | span-inline-end | span-all ] | [ self-block-start | center | self-block-end | span-self-block-start | span-self-block-end | span-all ] || [ self-inline-start | center | self-inline-end | span-self-inline-start | span-self-inline-end | span-all ] | [ start | center | end | span-start | span-end | span-all ]{1,2} | [ self-start | center | self-end | span-self-start | span-self-end | span-all ]{1,2} ]",
+ "position-area-query": "[ [ left | center | right | span-left | span-right | x-start | x-end | span-x-start | span-x-end | self-x-start | self-x-end | span-self-x-start | span-self-x-end | span-all | any ] || [ top | center | bottom | span-top | span-bottom | y-start | y-end | span-y-start | span-y-end | self-y-start | self-y-end | span-self-y-start | span-self-y-end | span-all | any ] | [ block-start | center | block-end | span-block-start | span-block-end | span-all | any ] || [ inline-start | center | inline-end | span-inline-start | span-inline-end | span-all | any ] | [ self-block-start | center | self-block-end | span-self-block-start | span-self-block-end | span-all | any ] || [ self-inline-start | center | self-inline-end | span-self-inline-start | span-self-inline-end | span-all | any ] | [ start | center | end | span-start | span-end | span-all | any ]{1,2} | [ self-start | center | self-end | span-self-start | span-self-end | span-all | any ]{1,2} ]",
+ "position-four": "[ [ [ left | right | x-start | x-end ] <length-percentage> ] && [ [ top | bottom | y-start | y-end ] <length-percentage> ] | [ [ block-start | block-end ] <length-percentage> ] && [ [ inline-start | inline-end ] <length-percentage> ] | [ [ start | end ] <length-percentage> ]{2} ]",
+ "position-one": "[ left | center | right | top | bottom | x-start | x-end | y-start | y-end | block-start | block-end | inline-start | inline-end | <length-percentage> ]",
+ "position-three": "[ [ left | center | right ] && [ [ top | bottom ] <length-percentage> ] | [ [ left | right ] <length-percentage> ] && [ top | center | bottom ] ]",
+ "position-two": "[ [ left | center | right | x-start | x-end ] && [ top | center | bottom | y-start | y-end ] | [ left | center | right | x-start | x-end | <length-percentage> ] [ top | center | bottom | y-start | y-end | <length-percentage> ] | [ block-start | center | block-end ] && [ inline-start | center | inline-end ] | [ start | center | end ]{2} ]",
+ "predefined-rgb": "srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 | rec2100-pq | rec2100-hlg | rec2100-linear",
+ "progress-source": "<percentage> | <number> | <dimension> | <'animation-timeline'>",
+ "progress()": "progress( <calc-sum> , <calc-sum> , <calc-sum> )",
+ "pseudo-class-selector": ": <ident-token> | : <function-token> <any-value> )",
+ "pseudo-element-selector": ": <pseudo-class-selector> | <legacy-pseudo-element-selector>",
+ "pt-class-selector": "[ '.' <custom-ident> ]+",
+ "pt-name-and-class-selector": "<pt-name-selector> <pt-class-selector>? | <pt-class-selector>",
+ "pt-name-selector": "'*' | <custom-ident>",
+ "query-in-parens": "( <container-query> ) | ( <size-feature> ) | style( <style-query> ) | scroll-state( <scroll-state-query> ) | <general-enclosed>",
+ "radial-extent": "closest-corner | closest-side | farthest-corner | farthest-side",
+ "radial-gradient-syntax": "[ [ [ <radial-shape> || <radial-size> ]? [ at <position> ]? ] || <color-interpolation-method> ]? , <color-stop-list>",
+ "radial-gradient()": "radial-gradient( [ <radial-gradient-syntax> ] )",
+ "radial-shape": "circle | ellipse",
+ "radial-size": "<radial-extent>{1,2} | <length [0,∞]> | <length-percentage [0,∞]>{2}",
+ "random-item-args": "random-item( <declaration-value> , [ <declaration-value>? ]# )",
+ "random-item()": "random-item( <random-value-sharing> , [ <declaration-value>? ]# )",
+ "random-value-sharing": "[ [ auto | <dashed-ident> ] || element-shared ] | fixed <number [0,1]>",
+ "random()": "random( <random-value-sharing>? , <calc-sum> , <calc-sum> , <calc-sum>? )",
+ "ray()": "ray( [ <angle> && <ray-size>? && contain? && [ at <position> ]? ] )",
+ "rectangular-color-space": "srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 | lab | oklab | <xyz-space>",
+ "referrer-policy-modifier": "referrer-policy( no-referrer | no-referrer-when-downgrade | same-origin | origin | strict-origin | origin-when-cross-origin | strict-origin-when-cross-origin | unsafe-url )",
+ "relative-control-point": "<coordinate-pair> [ from [ start | end | origin ] ]?",
+ "repeat-line-color": "repeat( [ <integer [1,∞]> ] , [ <color> ]# )",
+ "repeat-line-style": "repeat( [ <integer [1,∞]> ] , [ <line-style> ]# )",
+ "repeat-line-width": "repeat( [ <integer [1,∞]> ] , [ <line-width> ]# )",
+ "repeat-style": "repeat-x | repeat-y | repeat-block | repeat-inline | <repetition>{1,2}",
+ "repeating-conic-gradient()": "repeating-conic-gradient( [ <conic-gradient-syntax> ] )",
+ "repeating-linear-gradient()": "repeating-linear-gradient( [ <linear-gradient-syntax> ] )",
+ "repeating-radial-gradient()": "repeating-radial-gradient( [ <radial-gradient-syntax> ] )",
+ "repetition": "repeat | space | round | no-repeat",
+ "request-url-modifier": "<cross-origin-modifier> | <integrity-modifier> | <referrer-policy-modifier>",
+ "rgb()": "[ <legacy-rgb-syntax> | <modern-rgb-syntax> ]",
+ "rgba()": "[ <legacy-rgba-syntax> | <modern-rgba-syntax> ]",
+ "round()": "round( <rounding-strategy>? , <calc-sum> , <calc-sum>? )",
+ "route-name": "<dashed-ident>",
+ "running()": "running( <custom-ident> )",
+ "saturate()": "saturate( [ <number> | <percentage> ]? )",
+ "scope-end": "<selector-list>",
+ "scope-start": "<selector-list>",
+ "scroll-button-direction": "up | down | left | right | block-start | block-end | inline-start | inline-end | prev | next",
+ "scroll-state-feature": "<ident> : <ident>",
+ "scroll-state-in-parens": "( <scroll-state-query> ) | ( <scroll-state-feature> ) | <general-enclosed>",
+ "scroll-state-query": "not <scroll-state-in-parens> | <scroll-state-in-parens> [ [ and <scroll-state-in-parens> ]* | [ or <scroll-state-in-parens> ]* ] | <scroll-state-feature>",
+ "scroll()": "scroll( [ <scroller> || <axis> ]? )",
+ "sepia()": "sepia( [ <number> | <percentage> ]? )",
+ "shadow": "<color>? && [ <length>{2} [ <length [0,∞]> <length>? ]? ] && inset?",
+ "shape-box": "<visual-box> | margin-box | half-border-box",
+ "shape-command": "<move-command> | <line-command> | close | <horizontal-line-command> | <vertical-line-command> | <curve-command> | <smooth-command> | <arc-command>",
+ "shape()": "shape( <'fill-rule'>? from <position> , <shape-command># )",
+ "signed-integer": "<number-token>",
+ "signless-integer": "<number-token>",
+ "single-animation-iteration-count": "infinite | <number [0,∞]>",
+ "size-keyword": "auto | max-content | min-content | stretch",
+ "slash-separated-border-radius-syntax": "<length-percentage [0,∞]> [ / <length-percentage [0,∞]> ]?",
+ "smooth-command": "smooth [ [ to <position> [ with <control-point> ]? ] | [ by <coordinate-pair> [ with <relative-control-point> ]? ] ]",
+ "snap-block()": "snap-block( <length> , [ start | end | near ]? )",
+ "snap-inline()": "snap-inline( <length> , [ left | right | near ]? )",
+ "source-size": "<media-condition> <source-size-value> | auto",
+ "source-size-list": "<source-size>#? , <source-size-value>",
+ "source-size-value": "<length> | auto",
+ "spacing-trim": "space-all | normal | space-first | trim-start | trim-both | trim-all",
+ "spread-shadow": "<'box-shadow-color'>? && [ [ none | <length>{2} ] [ <'box-shadow-blur'> <'box-shadow-spread'>? ]? ] && <'box-shadow-position'>?",
+ "src()": "src( <string> <url-modifier>* )",
+ "step-easing-function": "step-start | step-end | <steps()>",
+ "steps()": "steps( <integer> , <step-position>? )",
+ "string()": "string( <custom-ident> , [ first | start | last | first-except ]? )",
+ "stripes()": "stripes( <color-stripe># )",
+ "style-feature": "<style-feature-plain> | <style-feature-boolean> | <style-range>",
+ "style-feature-boolean": "<style-feature-name>",
+ "style-feature-plain": "<style-feature-name> : <style-feature-value>",
+ "style-feature-value": "<declaration-value>",
+ "style-in-parens": "( <style-query> ) | ( <style-feature> ) | <general-enclosed>",
+ "style-query": "not <style-in-parens> | <style-in-parens> [ [ and <style-in-parens> ]* | [ or <style-in-parens> ]* ] | <style-feature>",
+ "style-range": "<style-range-value> <mf-comparison> <style-range-value> | <style-range-value> <mf-lt> <style-range-value> <mf-lt> <style-range-value> | <style-range-value> <mf-gt> <style-range-value> <mf-gt> <style-range-value>",
+ "style-range-value": "<custom-property-name> | <style-feature-value>",
+ "superellipse()": "superellipse( <number> | infinity | -infinity )",
+ "supports-at-rule-fn": "at-rule( <at-keyword-token> )",
+ "supports-condition-name": "<custom-ident>",
+ "supports-decl": "( [ <declaration> | <supports-condition-name> ] )",
+ "supports-feature": "<supports-selector-fn> | <supports-font-tech-fn> | <supports-font-format-fn> | <supports-at-rule-fn> | <supports-named-feature-fn> | <supports-decl>",
+ "supports-font-format-fn": "font-format( <font-format> )",
+ "supports-font-tech-fn": "font-tech( <font-tech> )",
+ "supports-named-feature-fn": "named-feature( <ident> )",
+ "supports()": "supports( <declaration> )",
+ "svg-paint": "child | child( <integer> )",
+ "symbols-type": "cyclic | numeric | alphabetic | symbolic | fixed",
+ "symbols()": "symbols( <symbols-type>? [ <string> | <image> ]+ )",
+ "syntax": "'*' | <syntax-component> [ <syntax-combinator> <syntax-component> ]* | <syntax-string>",
+ "syntax-combinator": "'|'",
+ "syntax-component": "<syntax-single-component> <syntax-multiplier>? | '<' transform-list '>'",
+ "syntax-multiplier": "[ '#' | '+' ]",
+ "syntax-single-component": "'<' <syntax-type-name> '>' | <ident>",
+ "syntax-string": "<string>",
+ "syntax-type-name": "angle | color | custom-ident | image | integer | length | length-percentage | number | percentage | resolution | string | time | url | transform-function",
+ "system-color": "AccentColor | AccentColorText | ActiveText | ButtonBorder | ButtonFace | ButtonText | Canvas | CanvasText | Field | FieldText | GrayText | Highlight | HighlightText | LinkText | Mark | MarkText | SelectedItem | SelectedItemText | VisitedText | <deprecated-color>",
+ "target-contrast": "<wcag2>",
+ "text-edge": "[ text | ideographic | ideographic-ink ] | [ text | ideographic | ideographic-ink | cap | ex ] [ text | ideographic | ideographic-ink | alphabetic ]",
+ "time-percentage": "[ <time> | <percentage> ]",
+ "timeline-range-center-subject": "<ident>",
+ "toggle()": "toggle( <any-value># )",
+ "track-breadth": "<length-percentage [0,∞]> | <flex [0,∞]> | min-content | max-content | auto",
+ "track-size": "<track-breadth> | minmax( <inflexible-breadth> , <track-breadth> ) | fit-content( <length-percentage [0,∞]> )",
+ "transform-function": "<scale3d()> | <scale()> | <scaleX()> | <scaleY()> | <scaleZ()> | <translate3d()> | <translate()> | <translateX()> | <translateY()> | <translateZ()> | <rotate3d()> | <rotate()> | <rotateX()> | <rotateY()> | <rotateZ()> | <skew()> | <skewX()> | <skewY()> | <matrix3d()> | <matrix()> | <perspective()>",
+ "transform-interpolate()": "transform-interpolate( [ <progress-source> && [ by <easing-function> ]? && <easing-function>? ] , <input-position>{1,2} : <transform-list> , [ <easing-function>? , <input-position>{1,2} : <transform-list> ]#? )",
+ "transform-mix()": "transform-mix( [ <transform-list> && <percentage [0,100]> ]# )",
+ "try-tactic": "flip-block || flip-inline || flip-start || flip-x || flip-y",
+ "type": "'<' [ number | string ] '>'",
+ "type()": "type( <syntax> )",
+ "url": "<url()> | <src()> | <url-token>",
+ "url-pattern()": "url-pattern( <string> )",
+ "url-set": "image-set( [ [ <url> | <string> ] [ <resolution> || type( <string> ) ]? ]# )",
+ "url-set-option": "[ <url> | <string> ] [ <resolution> || type( <string> ) ]?",
+ "url-set()": "url-set( <url-set-option># )",
+ "url()": "url( <string> <url-modifier>* ) | <url-token>",
+ "var-args": "var( <declaration-value> , <declaration-value>? )",
+ "vertical-line-command": "vline [ to [ <length-percentage> | top | center | bottom | y-start | y-end ] | by <length-percentage> ]",
+ "voice-family-name": "<string> | <custom-ident>+",
+ "wcag2": "wcag2 | wcag2( [ <number> | [ aa | aaa ] && large? ] )",
+ "whole-value": "<declaration-value>",
+ "style-feature-name": "<dashed-ident> | -moz-appearance | -moz-background-clip | -moz-binding | -moz-border-bottom-colors | -moz-border-left-colors | -moz-border-radius-bottomleft | -moz-border-radius-bottomright | -moz-border-radius-topleft | -moz-border-radius-topright | -moz-border-right-colors | -moz-border-top-colors | -moz-context-properties | -moz-control-character-visibility | -moz-float-edge | -moz-force-broken-image-icon | -moz-image-region | -moz-orient | -moz-osx-font-smoothing | -moz-outline-radius | -moz-outline-radius-bottomleft | -moz-outline-radius-bottomright | -moz-outline-radius-topleft | -moz-outline-radius-topright | -moz-stack-sizing | -moz-text-blink | -moz-user-focus | -moz-user-input | -moz-user-modify | -moz-user-select | -moz-window-dragging | -moz-window-shadow | -ms-accelerator | -ms-block-progression | -ms-content-zoom-chaining | -ms-content-zoom-limit | -ms-content-zoom-limit-max | -ms-content-zoom-limit-min | -ms-content-zoom-snap | -ms-content-zoom-snap-points | -ms-content-zoom-snap-type | -ms-content-zooming | -ms-filter | -ms-flex-align | -ms-flex-item-align | -ms-flex-line-pack | -ms-flex-negative | -ms-flex-order | -ms-flex-pack | -ms-flex-positive | -ms-flex-preferred-size | -ms-flow-from | -ms-flow-into | -ms-grid-column-align | -ms-grid-columns | -ms-grid-row-align | -ms-grid-rows | -ms-high-contrast-adjust | -ms-hyphenate-limit-chars | -ms-hyphenate-limit-last | -ms-hyphenate-limit-lines | -ms-hyphenate-limit-zone | -ms-ime-align | -ms-interpolation-mode | -ms-overflow-style | -ms-scroll-chaining | -ms-scroll-limit | -ms-scroll-limit-x-max | -ms-scroll-limit-x-min | -ms-scroll-limit-y-max | -ms-scroll-limit-y-min | -ms-scroll-rails | -ms-scroll-snap-points-x | -ms-scroll-snap-points-y | -ms-scroll-snap-type | -ms-scroll-snap-x | -ms-scroll-snap-y | -ms-scroll-translation | -ms-scrollbar-3dlight-color | -ms-scrollbar-arrow-color | -ms-scrollbar-base-color | -ms-scrollbar-darkshadow-color | -ms-scrollbar-face-color | -ms-scrollbar-highlight-color | -ms-scrollbar-shadow-color | -ms-scrollbar-track-color | -ms-text-autospace | -ms-touch-select | -ms-user-select | -ms-wrap-flow | -ms-wrap-margin | -ms-wrap-through | -webkit-appearance | -webkit-background-clip | -webkit-border-before | -webkit-border-before-color | -webkit-border-before-style | -webkit-border-before-width | -webkit-box-reflect | -webkit-column-break-after | -webkit-column-break-before | -webkit-column-break-inside | -webkit-font-smoothing | -webkit-line-clamp | -webkit-mask | -webkit-mask-attachment | -webkit-mask-box-image | -webkit-mask-clip | -webkit-mask-composite | -webkit-mask-image | -webkit-mask-origin | -webkit-mask-position | -webkit-mask-position-x | -webkit-mask-position-y | -webkit-mask-repeat | -webkit-mask-repeat-x | -webkit-mask-repeat-y | -webkit-mask-size | -webkit-overflow-scrolling | -webkit-print-color-adjust | -webkit-tap-highlight-color | -webkit-text-fill-color | -webkit-text-security | -webkit-text-stroke | -webkit-text-stroke-color | -webkit-text-stroke-width | -webkit-touch-callout | -webkit-user-drag | -webkit-user-modify | -webkit-user-select | accent-color | align-content | align-items | align-self | align-tracks | alignment-baseline | all | anchor-name | anchor-scope | animation | animation-composition | animation-delay | animation-direction | animation-duration | animation-fill-mode | animation-iteration-count | animation-name | animation-play-state | animation-range | animation-range-center | animation-range-end | animation-range-start | animation-timeline | animation-timing-function | animation-trigger | appearance | aspect-ratio | azimuth | backdrop-filter | backface-visibility | background | background-attachment | background-blend-mode | background-clip | background-color | background-image | background-origin | background-position | background-position-block | background-position-inline | background-position-x | background-position-y | background-repeat | background-repeat-block | background-repeat-inline | background-repeat-x | background-repeat-y | background-size | background-tbd | baseline-shift | baseline-source | behavior | block-ellipsis | block-size | block-step | block-step-align | block-step-insert | block-step-round | block-step-size | bookmark-label | bookmark-level | bookmark-state | border | border-block | border-block-clip | border-block-color | border-block-end | border-block-end-clip | border-block-end-color | border-block-end-radius | border-block-end-style | border-block-end-width | border-block-start | border-block-start-clip | border-block-start-color | border-block-start-radius | border-block-start-style | border-block-start-width | border-block-style | border-block-width | border-bottom | border-bottom-clip | border-bottom-color | border-bottom-left-radius | border-bottom-radius | border-bottom-right-radius | border-bottom-style | border-bottom-width | border-boundary | border-clip | border-collapse | border-color | border-end-end-radius | border-end-start-radius | border-image | border-image-outset | border-image-repeat | border-image-slice | border-image-source | border-image-width | border-inline | border-inline-clip | border-inline-color | border-inline-end | border-inline-end-clip | border-inline-end-color | border-inline-end-radius | border-inline-end-style | border-inline-end-width | border-inline-start | border-inline-start-clip | border-inline-start-color | border-inline-start-radius | border-inline-start-style | border-inline-start-width | border-inline-style | border-inline-width | border-left | border-left-clip | border-left-color | border-left-radius | border-left-style | border-left-width | border-limit | border-radius | border-right | border-right-clip | border-right-color | border-right-radius | border-right-style | border-right-width | border-shape | border-spacing | border-start-end-radius | border-start-start-radius | border-style | border-top | border-top-clip | border-top-color | border-top-left-radius | border-top-radius | border-top-right-radius | border-top-style | border-top-width | border-width | bottom | box-align | box-decoration-break | box-direction | box-flex | box-flex-group | box-lines | box-ordinal-group | box-orient | box-pack | box-shadow | box-shadow-blur | box-shadow-color | box-shadow-offset | box-shadow-position | box-shadow-spread | box-sizing | box-snap | break-after | break-before | break-inside | caption-side | caret | caret-animation | caret-color | caret-shape | clear | clip | clip-path | clip-rule | color | color-adjust | color-interpolation | color-interpolation-filters | color-scheme | column-count | column-fill | column-gap | column-height | column-rule | column-rule-break | column-rule-color | column-rule-edge-inset | column-rule-edge-inset-end | column-rule-edge-inset-start | column-rule-inset | column-rule-inset-end | column-rule-inset-start | column-rule-interior-inset | column-rule-interior-inset-end | column-rule-interior-inset-start | column-rule-style | column-rule-width | column-span | column-width | column-wrap | columns | contain | contain-intrinsic-block-size | contain-intrinsic-height | contain-intrinsic-inline-size | contain-intrinsic-size | contain-intrinsic-width | container | container-name | container-type | content | content-visibility | continue | copy-into | corner | corner-block-end | corner-block-end-shape | corner-block-start | corner-block-start-shape | corner-bottom | corner-bottom-left | corner-bottom-left-shape | corner-bottom-right | corner-bottom-right-shape | corner-bottom-shape | corner-end-end | corner-end-end-shape | corner-end-start | corner-end-start-shape | corner-inline-end | corner-inline-end-shape | corner-inline-start | corner-inline-start-shape | corner-left | corner-left-shape | corner-right | corner-right-shape | corner-shape | corner-start-end | corner-start-end-shape | corner-start-start | corner-start-start-shape | corner-top | corner-top-left | corner-top-left-shape | corner-top-right | corner-top-right-shape | corner-top-shape | counter-increment | counter-reset | counter-set | cue | cue-after | cue-before | cursor | cx | cy | d | direction | display | dominant-baseline | dynamic-range-limit | empty-cells | event-trigger | event-trigger-name | event-trigger-source | field-sizing | fill | fill-break | fill-color | fill-image | fill-opacity | fill-origin | fill-position | fill-repeat | fill-rule | fill-size | filter | flex | flex-basis | flex-direction | flex-flow | flex-grow | flex-shrink | flex-wrap | float | float-defer | float-offset | float-reference | flood-color | flood-opacity | flow-from | flow-into | flow-tolerance | font | font-family | font-feature-settings | font-kerning | font-language-override | font-optical-sizing | font-palette | font-size | font-size-adjust | font-smooth | font-stretch | font-style | font-synthesis | font-synthesis-position | font-synthesis-small-caps | font-synthesis-style | font-synthesis-weight | font-variant | font-variant-alternates | font-variant-caps | font-variant-east-asian | font-variant-emoji | font-variant-ligatures | font-variant-numeric | font-variant-position | font-variation-settings | font-weight | font-width | footnote-display | footnote-policy | forced-color-adjust | gap | glyph-orientation-horizontal | glyph-orientation-vertical | grid | grid-area | grid-auto-columns | grid-auto-flow | grid-auto-rows | grid-column | grid-column-end | grid-column-gap | grid-column-start | grid-gap | grid-row | grid-row-end | grid-row-gap | grid-row-start | grid-template | grid-template-areas | grid-template-columns | grid-template-rows | hanging-punctuation | height | hyphenate-character | hyphenate-limit-chars | hyphenate-limit-last | hyphenate-limit-lines | hyphenate-limit-zone | hyphens | image-orientation | image-rendering | image-resolution | ime-mode | initial-letter | initial-letter-align | initial-letter-wrap | inline-size | inline-sizing | input-security | inset | inset-block | inset-block-end | inset-block-start | inset-inline | inset-inline-end | inset-inline-start | interactivity | interest-delay | interest-delay-end | interest-delay-start | interpolate-size | isolation | item-cross | item-direction | item-flow | item-pack | item-track | item-wrap | justify-content | justify-items | justify-self | justify-tracks | kerning | left | letter-spacing | lighting-color | line-break | line-clamp | line-fit-edge | line-grid | line-height | line-height-step | line-padding | line-snap | link-parameters | list-style | list-style-image | list-style-position | list-style-type | margin | margin-block | margin-block-end | margin-block-start | margin-bottom | margin-break | margin-inline | margin-inline-end | margin-inline-start | margin-left | margin-right | margin-top | margin-trim | marker | marker-end | marker-mid | marker-side | marker-start | mask | mask-border | mask-border-mode | mask-border-outset | mask-border-repeat | mask-border-slice | mask-border-source | mask-border-width | mask-clip | mask-composite | mask-image | mask-mode | mask-origin | mask-position | mask-repeat | mask-size | mask-type | masonry-auto-flow | math-depth | math-shift | math-style | max-block-size | max-height | max-inline-size | max-lines | max-width | min-block-size | min-height | min-inline-size | min-intrinsic-sizing | min-width | mix-blend-mode | nav-down | nav-left | nav-right | nav-up | object-fit | object-position | object-view-box | offset | offset-anchor | offset-distance | offset-path | offset-position | offset-rotate | opacity | order | orphans | outline | outline-color | outline-offset | outline-style | outline-width | overflow | overflow-anchor | overflow-block | overflow-clip-box | overflow-clip-margin | overflow-clip-margin-block | overflow-clip-margin-block-end | overflow-clip-margin-block-start | overflow-clip-margin-bottom | overflow-clip-margin-inline | overflow-clip-margin-inline-end | overflow-clip-margin-inline-start | overflow-clip-margin-left | overflow-clip-margin-right | overflow-clip-margin-top | overflow-inline | overflow-wrap | overflow-x | overflow-y | overlay | overscroll-behavior | overscroll-behavior-block | overscroll-behavior-inline | overscroll-behavior-x | overscroll-behavior-y | padding | padding-block | padding-block-end | padding-block-start | padding-bottom | padding-inline | padding-inline-end | padding-inline-start | padding-left | padding-right | padding-top | page | page-break-after | page-break-before | page-break-inside | paint-order | pause | pause-after | pause-before | perspective | perspective-origin | place-content | place-items | place-self | pointer-events | pointer-timeline | pointer-timeline-axis | pointer-timeline-name | position | position-anchor | position-area | position-try | position-try-fallbacks | position-try-order | position-visibility | print-color-adjust | quotes | r | reading-flow | reading-order | region-fragment | resize | rest | rest-after | rest-before | right | rotate | row-gap | row-rule | row-rule-break | row-rule-color | row-rule-edge-inset | row-rule-edge-inset-end | row-rule-edge-inset-start | row-rule-inset | row-rule-inset-end | row-rule-inset-start | row-rule-interior-inset | row-rule-interior-inset-end | row-rule-interior-inset-start | row-rule-style | row-rule-width | ruby-align | ruby-merge | ruby-overhang | ruby-position | rule | rule-break | rule-color | rule-edge-inset | rule-inset | rule-inset-end | rule-inset-start | rule-interior-inset | rule-overlap | rule-style | rule-width | rx | ry | scale | scroll-behavior | scroll-initial-target | scroll-margin | scroll-margin-block | scroll-margin-block-end | scroll-margin-block-start | scroll-margin-bottom | scroll-margin-inline | scroll-margin-inline-end | scroll-margin-inline-start | scroll-margin-left | scroll-margin-right | scroll-margin-top | scroll-marker-group | scroll-padding | scroll-padding-block | scroll-padding-block-end | scroll-padding-block-start | scroll-padding-bottom | scroll-padding-inline | scroll-padding-inline-end | scroll-padding-inline-start | scroll-padding-left | scroll-padding-right | scroll-padding-top | scroll-snap-align | scroll-snap-coordinate | scroll-snap-destination | scroll-snap-points-x | scroll-snap-points-y | scroll-snap-stop | scroll-snap-type | scroll-snap-type-x | scroll-snap-type-y | scroll-target-group | scroll-timeline | scroll-timeline-axis | scroll-timeline-name | scrollbar-color | scrollbar-gutter | scrollbar-width | shape-image-threshold | shape-inside | shape-margin | shape-outside | shape-padding | shape-rendering | shape-subtract | slider-orientation | spatial-navigation-action | spatial-navigation-contain | spatial-navigation-function | speak | speak-as | src | stop-color | stop-opacity | string-set | stroke | stroke-align | stroke-alignment | stroke-break | stroke-color | stroke-dash-corner | stroke-dash-justify | stroke-dashadjust | stroke-dasharray | stroke-dashcorner | stroke-dashoffset | stroke-image | stroke-linecap | stroke-linejoin | stroke-miterlimit | stroke-opacity | stroke-origin | stroke-position | stroke-repeat | stroke-size | stroke-width | tab-size | table-layout | text-align | text-align-all | text-align-last | text-anchor | text-autospace | text-box | text-box-edge | text-box-trim | text-combine-upright | text-decoration | text-decoration-color | text-decoration-inset | text-decoration-line | text-decoration-skip | text-decoration-skip-box | text-decoration-skip-ink | text-decoration-skip-self | text-decoration-skip-spaces | text-decoration-style | text-decoration-thickness | text-emphasis | text-emphasis-color | text-emphasis-position | text-emphasis-skip | text-emphasis-style | text-group-align | text-indent | text-justify | text-orientation | text-overflow | text-rendering | text-shadow | text-size-adjust | text-spacing | text-spacing-trim | text-transform | text-underline-offset | text-underline-position | text-wrap | text-wrap-mode | text-wrap-style | timeline-scope | timeline-trigger | timeline-trigger-exit-range | timeline-trigger-exit-range-end | timeline-trigger-exit-range-start | timeline-trigger-name | timeline-trigger-range | timeline-trigger-range-end | timeline-trigger-range-start | timeline-trigger-source | top | touch-action | transform | transform-box | transform-origin | transform-style | transition | transition-behavior | transition-delay | transition-duration | transition-property | transition-timing-function | translate | trigger-scope | unicode-bidi | unicode-range | user-select | vector-effect | vertical-align | view-timeline | view-timeline-axis | view-timeline-inset | view-timeline-name | view-transition-class | view-transition-group | view-transition-name | view-transition-scope | visibility | voice-balance | voice-duration | voice-family | voice-pitch | voice-range | voice-rate | voice-stress | voice-volume | white-space | white-space-collapse | white-space-trim | widows | width | will-change | word-break | word-space-transform | word-spacing | word-wrap | wrap-after | wrap-before | wrap-flow | wrap-inside | wrap-through | writing-mode | x | y | z-index | zoom"
+ }
+ }
+}
diff --git a/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/package.json b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/package.json
new file mode 100644
index 0000000..272832e
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-syntax-patches-for-csstree/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "@csstools/css-syntax-patches-for-csstree",
+ "description": "CSS syntax patches for CSS tree",
+ "version": "1.0.27",
+ "contributors": [
+ {
+ "name": "Antonio Laguna",
+ "email": "antonio@laguna.es",
+ "url": "https://antonio.laguna.es"
+ },
+ {
+ "name": "Romain Menke",
+ "email": "romainmenke@gmail.com"
+ }
+ ],
+ "license": "MIT-0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "main": "dist/index.json",
+ "types": "dist/index.d.ts",
+ "files": [
+ "CHANGELOG.md",
+ "LICENSE.md",
+ "README.md",
+ "dist"
+ ],
+ "scripts": {},
+ "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/css-syntax-patches-for-csstree#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/csstools/postcss-plugins.git",
+ "directory": "packages/css-syntax-patches-for-csstree"
+ },
+ "bugs": "https://github.com/csstools/postcss-plugins/issues",
+ "keywords": [
+ "css",
+ "csstree",
+ "syntax"
+ ]
+}
diff --git a/vanilla/node_modules/@csstools/css-tokenizer/CHANGELOG.md b/vanilla/node_modules/@csstools/css-tokenizer/CHANGELOG.md
new file mode 100644
index 0000000..f372525
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-tokenizer/CHANGELOG.md
@@ -0,0 +1,10 @@
+# Changes to CSS Tokenizer
+
+### 4.0.0
+
+_January 14, 2026_
+
+- Updated: Support for Node `20.19.0` or later (major).
+- Removed: `commonjs` API. In supported Node versions `require(esm)` will work without needing to make code changes.
+
+[Full CHANGELOG](https://github.com/csstools/postcss-plugins/tree/main/packages/css-tokenizer/CHANGELOG.md)
diff --git a/vanilla/node_modules/@csstools/css-tokenizer/LICENSE.md b/vanilla/node_modules/@csstools/css-tokenizer/LICENSE.md
new file mode 100644
index 0000000..af5411f
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-tokenizer/LICENSE.md
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright 2022 Romain Menke, Antonio Laguna <antonio@laguna.es>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vanilla/node_modules/@csstools/css-tokenizer/README.md b/vanilla/node_modules/@csstools/css-tokenizer/README.md
new file mode 100644
index 0000000..d2b6394
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-tokenizer/README.md
@@ -0,0 +1,111 @@
+# CSS Tokenizer <img src="https://cssdb.org/images/css.svg" alt="for CSS" width="90" height="90" align="right">
+
+[<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/css-tokenizer.svg" height="20">][npm-url]
+[<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/actions/workflows/test.yml/badge.svg?branch=main" height="20">][cli-url]
+[<img alt="Discord" src="https://shields.io/badge/Discord-5865F2?logo=discord&logoColor=white">][discord]
+
+Implemented from : https://drafts.csswg.org/css-syntax/
+
+## API
+
+[Read the API docs](./docs/css-tokenizer.md)
+
+## Usage
+
+Add [CSS Tokenizer] to your project:
+
+```bash
+npm install @csstools/css-tokenizer --save-dev
+```
+
+```js
+import { tokenize } from '@csstools/css-tokenizer';
+
+const myCSS = `@media only screen and (min-width: 768rem) {
+ .foo {
+ content: 'Some content!' !important;
+ }
+}
+`;
+
+const tokens = tokenize({
+ css: myCSS,
+});
+
+console.log(tokens);
+```
+
+Or use the streaming interface:
+
+```js
+import { tokenizer, TokenType } from '@csstools/css-tokenizer';
+
+const myCSS = `@media only screen and (min-width: 768rem) {
+ .foo {
+ content: 'Some content!' !important;
+ }
+}
+`;
+
+const t = tokenizer({
+ css: myCSS,
+});
+
+while (true) {
+ const token = t.nextToken();
+ if (token[0] === TokenType.EOF) {
+ break;
+ }
+
+ console.log(token);
+}
+```
+
+### Options
+
+```ts
+{
+ onParseError?: (error: ParseError) => void
+}
+```
+
+#### `onParseError`
+
+The tokenizer is forgiving and won't stop when a parse error is encountered.
+
+To receive parsing error information you can set a callback.
+
+```js
+import { tokenizer, TokenType } from '@csstools/css-tokenizer';
+
+const t = tokenizer({
+ css: '\\',
+}, { onParseError: (err) => console.warn(err) });
+
+while (true) {
+ const token = t.nextToken();
+ if (token[0] === TokenType.EOF) {
+ break;
+ }
+}
+```
+
+Parser errors will try to inform you where in the tokenizer logic the error happened.
+This tells you what kind of error occurred.
+
+## Order of priorities
+
+1. specification compliance
+2. correctness
+3. reliability
+4. tokenizing and serializing must round trip losslessly
+5. exposing useful aspects about the source code
+6. runtime performance
+7. package size
+
+
+[cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
+[discord]: https://discord.gg/bUadyRwkJS
+[npm-url]: https://www.npmjs.com/package/@csstools/css-tokenizer
+
+[CSS Tokenizer]: https://github.com/csstools/postcss-plugins/tree/main/packages/css-tokenizer
diff --git a/vanilla/node_modules/@csstools/css-tokenizer/dist/index.d.ts b/vanilla/node_modules/@csstools/css-tokenizer/dist/index.d.ts
new file mode 100644
index 0000000..ecc522f
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-tokenizer/dist/index.d.ts
@@ -0,0 +1,593 @@
+/**
+ * Tokenize CSS following the {@link https://drafts.csswg.org/css-syntax/#tokenization | CSS Syntax Level 3 specification}.
+ *
+ * @remarks
+ * The tokenizing and parsing tools provided by CSS Tools are designed to be low level and generic with strong ties to their respective specifications.
+ *
+ * Any analysis or mutation of CSS source code should be done with the least powerful tool that can accomplish the task.
+ * For many applications it is sufficient to work with tokens.
+ * For others you might need to use {@link https://github.com/csstools/postcss-plugins/tree/main/packages/css-parser-algorithms | @csstools/css-parser-algorithms} or a more specific parser.
+ *
+ * @example
+ * Tokenize a string of CSS into an array of tokens:
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ *
+ * const myCSS = `@media only screen and (min-width: 768rem) {
+ * .foo {
+ * content: 'Some content!' !important;
+ * }
+ * }
+ * `;
+ *
+ * const tokens = tokenize({
+ * css: myCSS,
+ * });
+ *
+ * console.log(tokens);
+ * ```
+ *
+ * @packageDocumentation
+ */
+
+/**
+ * Deep clone a list of tokens.
+ * Useful for mutations without altering the original list.
+ */
+export declare function cloneTokens(tokens: Array<CSSToken>): Array<CSSToken>;
+
+/**
+ * The union of all possible CSS tokens
+ */
+export declare type CSSToken = TokenAtKeyword | TokenBadString | TokenBadURL | TokenCDC | TokenCDO | TokenColon | TokenComma | TokenComment | TokenDelim | TokenDimension | TokenEOF | TokenFunction | TokenHash | TokenIdent | TokenNumber | TokenPercentage | TokenSemicolon | TokenString | TokenURL | TokenWhitespace | TokenOpenParen | TokenCloseParen | TokenOpenSquare | TokenCloseSquare | TokenOpenCurly | TokenCloseCurly | TokenUnicodeRange;
+
+/**
+ * The type of hash token
+ */
+export declare enum HashType {
+ /**
+ * The hash token did not start with an ident sequence (e.g. `#-2`)
+ */
+ Unrestricted = "unrestricted",
+ /**
+ * The hash token started with an ident sequence (e.g. `#foo`)
+ * Only hash tokens with the "id" type are valid ID selectors.
+ */
+ ID = "id"
+}
+
+/**
+ * Assert that a given value has the general structure of a CSS token:
+ * 1. is an array.
+ * 2. has at least four items.
+ * 3. has a known token type.
+ * 4. has a string representation.
+ * 5. has a start position.
+ * 6. has an end position.
+ */
+export declare function isToken(x: any): x is CSSToken;
+
+export declare function isTokenAtKeyword(x?: CSSToken | null): x is TokenAtKeyword;
+
+export declare function isTokenBadString(x?: CSSToken | null): x is TokenBadString;
+
+export declare function isTokenBadURL(x?: CSSToken | null): x is TokenBadURL;
+
+export declare function isTokenCDC(x?: CSSToken | null): x is TokenCDC;
+
+export declare function isTokenCDO(x?: CSSToken | null): x is TokenCDO;
+
+export declare function isTokenCloseCurly(x?: CSSToken | null): x is TokenCloseCurly;
+
+export declare function isTokenCloseParen(x?: CSSToken | null): x is TokenCloseParen;
+
+export declare function isTokenCloseSquare(x?: CSSToken | null): x is TokenCloseSquare;
+
+export declare function isTokenColon(x?: CSSToken | null): x is TokenColon;
+
+export declare function isTokenComma(x?: CSSToken | null): x is TokenComma;
+
+export declare function isTokenComment(x?: CSSToken | null): x is TokenComment;
+
+export declare function isTokenDelim(x?: CSSToken | null): x is TokenDelim;
+
+export declare function isTokenDimension(x?: CSSToken | null): x is TokenDimension;
+
+export declare function isTokenEOF(x?: CSSToken | null): x is TokenEOF;
+
+export declare function isTokenFunction(x?: CSSToken | null): x is TokenFunction;
+
+export declare function isTokenHash(x?: CSSToken | null): x is TokenHash;
+
+export declare function isTokenIdent(x?: CSSToken | null): x is TokenIdent;
+
+export declare function isTokenNumber(x?: CSSToken | null): x is TokenNumber;
+
+/**
+ * Assert that a token is a numeric token
+ */
+export declare function isTokenNumeric(x?: CSSToken | null): x is NumericToken;
+
+export declare function isTokenOpenCurly(x?: CSSToken | null): x is TokenOpenCurly;
+
+export declare function isTokenOpenParen(x?: CSSToken | null): x is TokenOpenParen;
+
+export declare function isTokenOpenSquare(x?: CSSToken | null): x is TokenOpenSquare;
+
+export declare function isTokenPercentage(x?: CSSToken | null): x is TokenPercentage;
+
+export declare function isTokenSemicolon(x?: CSSToken | null): x is TokenSemicolon;
+
+export declare function isTokenString(x?: CSSToken | null): x is TokenString;
+
+export declare function isTokenUnicodeRange(x?: CSSToken | null): x is TokenUnicodeRange;
+
+export declare function isTokenURL(x?: CSSToken | null): x is TokenURL;
+
+export declare function isTokenWhitespace(x?: CSSToken | null): x is TokenWhitespace;
+
+/**
+ * Assert that a token is a whitespace or comment token
+ */
+export declare function isTokenWhiteSpaceOrComment(x?: CSSToken | null): x is TokenWhitespace | TokenComment;
+
+/**
+ * Get the mirror variant of a given token
+ *
+ * @example
+ *
+ * ```js
+ * const input = [TokenType.OpenParen, '(', 0, 1, undefined];
+ * const output = mirrorVariant(input);
+ *
+ * console.log(output); // [TokenType.CloseParen, ')', -1, -1, undefined]
+ * ```
+ */
+export declare function mirrorVariant(token: CSSToken): CSSToken | null;
+
+/**
+ * Get the mirror variant type of a given token type
+ *
+ * @example
+ *
+ * ```js
+ * const input = TokenType.OpenParen;
+ * const output = mirrorVariantType(input);
+ *
+ * console.log(output); // TokenType.CloseParen
+ * ```
+ */
+export declare function mirrorVariantType(type: TokenType): TokenType | null;
+
+/**
+ * Set the ident value and update the string representation.
+ * This handles escaping.
+ */
+export declare function mutateIdent(ident: TokenIdent, newValue: string): void;
+
+/**
+ * Set the unit and update the string representation.
+ * This handles escaping.
+ */
+export declare function mutateUnit(ident: TokenDimension, newUnit: string): void;
+
+/**
+ * The type of number token
+ * Either `integer` or `number`
+ */
+export declare enum NumberType {
+ Integer = "integer",
+ Number = "number"
+}
+
+/**
+ * The union of all possible CSS tokens that represent a numeric value
+ */
+export declare type NumericToken = TokenDimension | TokenNumber | TokenPercentage;
+
+/**
+ * The CSS Tokenizer is forgiving and will never throw on invalid input.
+ * Any errors are reported through the `onParseError` callback.
+ */
+export declare class ParseError extends Error {
+ /** The index of the start character of the current token. */
+ sourceStart: number;
+ /** The index of the end character of the current token. */
+ sourceEnd: number;
+ /** The parser steps that preceded the error. */
+ parserState: Array<string>;
+ constructor(message: string, sourceStart: number, sourceEnd: number, parserState: Array<string>);
+}
+
+export declare const ParseErrorMessage: {
+ UnexpectedNewLineInString: string;
+ UnexpectedEOFInString: string;
+ UnexpectedEOFInComment: string;
+ UnexpectedEOFInURL: string;
+ UnexpectedEOFInEscapedCodePoint: string;
+ UnexpectedCharacterInURL: string;
+ InvalidEscapeSequenceInURL: string;
+ InvalidEscapeSequenceAfterBackslash: string;
+};
+
+export declare class ParseErrorWithToken extends ParseError {
+ /** The associated token. */
+ token: CSSToken;
+ constructor(message: string, sourceStart: number, sourceEnd: number, parserState: Array<string>, token: CSSToken);
+}
+
+/**
+ * Concatenate the string representation of a list of tokens.
+ * This is not a proper serializer that will handle escaping and whitespace.
+ * It only produces valid CSS for a token list that is also valid.
+ */
+export declare function stringify(...tokens: Array<CSSToken>): string;
+
+/**
+ * The CSS Token interface
+ *
+ * @remarks
+ * CSS Tokens are fully typed and have a strict structure.
+ * This makes it easier to iterate and analyze a token stream.
+ *
+ * The string representation and the parsed value are stored separately for many token types.
+ * It is always assumed that the string representation will be used when stringifying, while the parsed value should be used when analyzing tokens.
+ */
+export declare interface Token<T extends TokenType, U> extends Array<T | string | number | U> {
+ /**
+ * The type of token
+ */
+ 0: T;
+ /**
+ * The token representation
+ *
+ * @remarks
+ * This field will be used when stringifying the token.
+ * Any stored value is assumed to be valid CSS.
+ *
+ * You should never use this field when analyzing the token when there is a parsed value available.
+ * But you must store mutated values here.
+ */
+ 1: string;
+ /**
+ * Start position of representation
+ */
+ 2: number;
+ /**
+ * End position of representation
+ */
+ 3: number;
+ /**
+ * Extra data
+ *
+ * @remarks
+ * This holds the parsed value of each token.
+ * These values are unescaped, unquoted, converted to numbers, etc.
+ *
+ * You should always use this field when analyzing the token.
+ * But you must not assume that mutating only this field will have any effect.
+ */
+ 4: U;
+}
+
+export declare interface TokenAtKeyword extends Token<TokenType.AtKeyword, {
+ /**
+ * The unescaped at-keyword name without the leading `@`.
+ */
+ value: string;
+}> {
+}
+
+export declare interface TokenBadString extends Token<TokenType.BadString, undefined> {
+}
+
+export declare interface TokenBadURL extends Token<TokenType.BadURL, undefined> {
+}
+
+export declare interface TokenCDC extends Token<TokenType.CDC, undefined> {
+}
+
+export declare interface TokenCDO extends Token<TokenType.CDO, undefined> {
+}
+
+export declare interface TokenCloseCurly extends Token<TokenType.CloseCurly, undefined> {
+}
+
+export declare interface TokenCloseParen extends Token<TokenType.CloseParen, undefined> {
+}
+
+export declare interface TokenCloseSquare extends Token<TokenType.CloseSquare, undefined> {
+}
+
+export declare interface TokenColon extends Token<TokenType.Colon, undefined> {
+}
+
+export declare interface TokenComma extends Token<TokenType.Comma, undefined> {
+}
+
+export declare interface TokenComment extends Token<TokenType.Comment, undefined> {
+}
+
+export declare interface TokenDelim extends Token<TokenType.Delim, {
+ /**
+ * The delim character.
+ */
+ value: string;
+}> {
+}
+
+export declare interface TokenDimension extends Token<TokenType.Dimension, {
+ /**
+ * The numeric value.
+ */
+ value: number;
+ /**
+ * The unescaped unit name.
+ */
+ unit: string;
+ /**
+ * `integer` or `number`
+ */
+ type: NumberType;
+ /**
+ * The sign character as it appeared in the source.
+ * This is only useful if you need to determine if a value was written as "2px" or "+2px".
+ */
+ signCharacter?: '+' | '-';
+}> {
+}
+
+export declare interface TokenEOF extends Token<TokenType.EOF, undefined> {
+}
+
+export declare interface TokenFunction extends Token<TokenType.Function, {
+ /**
+ * The unescaped function name without the trailing `(`.
+ */
+ value: string;
+}> {
+}
+
+export declare interface TokenHash extends Token<TokenType.Hash, {
+ /**
+ * The unescaped hash value without the leading `#`.
+ */
+ value: string;
+ /**
+ * The hash type.
+ */
+ type: HashType;
+}> {
+}
+
+export declare interface TokenIdent extends Token<TokenType.Ident, {
+ /**
+ * The unescaped ident value.
+ */
+ value: string;
+}> {
+}
+
+/**
+ * Tokenize a CSS string into a list of tokens.
+ */
+export declare function tokenize(input: {
+ css: {
+ valueOf(): string;
+ };
+ unicodeRangesAllowed?: boolean;
+}, options?: {
+ onParseError?: (error: ParseError) => void;
+}): Array<CSSToken>;
+
+/**
+ * Create a tokenizer for a CSS string.
+ */
+export declare function tokenizer(input: {
+ css: {
+ valueOf(): string;
+ };
+ unicodeRangesAllowed?: boolean;
+}, options?: {
+ onParseError?: (error: ParseError) => void;
+}): {
+ nextToken: () => CSSToken;
+ endOfFile: () => boolean;
+};
+
+export declare interface TokenNumber extends Token<TokenType.Number, {
+ /**
+ * The numeric value.
+ */
+ value: number;
+ /**
+ * `integer` or `number`
+ */
+ type: NumberType;
+ /**
+ * The sign character as it appeared in the source.
+ * This is only useful if you need to determine if a value was written as "2" or "+2".
+ */
+ signCharacter?: '+' | '-';
+}> {
+}
+
+export declare interface TokenOpenCurly extends Token<TokenType.OpenCurly, undefined> {
+}
+
+export declare interface TokenOpenParen extends Token<TokenType.OpenParen, undefined> {
+}
+
+export declare interface TokenOpenSquare extends Token<TokenType.OpenSquare, undefined> {
+}
+
+export declare interface TokenPercentage extends Token<TokenType.Percentage, {
+ /**
+ * The numeric value.
+ */
+ value: number;
+ /**
+ * The sign character as it appeared in the source.
+ * This is only useful if you need to determine if a value was written as "2%" or "+2%".
+ */
+ signCharacter?: '+' | '-';
+}> {
+}
+
+export declare interface TokenSemicolon extends Token<TokenType.Semicolon, undefined> {
+}
+
+export declare interface TokenString extends Token<TokenType.String, {
+ /**
+ * The unescaped string value without the leading and trailing quotes.
+ */
+ value: string;
+}> {
+}
+
+/**
+ * All possible CSS token types
+ */
+export declare enum TokenType {
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#comment-diagram}
+ */
+ Comment = "comment",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-at-keyword-token}
+ */
+ AtKeyword = "at-keyword-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-bad-string-token}
+ */
+ BadString = "bad-string-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-bad-url-token}
+ */
+ BadURL = "bad-url-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-cdc-token}
+ */
+ CDC = "CDC-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-cdo-token}
+ */
+ CDO = "CDO-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-colon-token}
+ */
+ Colon = "colon-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-comma-token}
+ */
+ Comma = "comma-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-delim-token}
+ */
+ Delim = "delim-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-dimension-token}
+ */
+ Dimension = "dimension-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-eof-token}
+ */
+ EOF = "EOF-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-function-token}
+ */
+ Function = "function-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-hash-token}
+ */
+ Hash = "hash-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-ident-token}
+ */
+ Ident = "ident-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-percentage-token}
+ */
+ Number = "number-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-percentage-token}
+ */
+ Percentage = "percentage-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-semicolon-token}
+ */
+ Semicolon = "semicolon-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-string-token}
+ */
+ String = "string-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-url-token}
+ */
+ URL = "url-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#typedef-whitespace-token}
+ */
+ Whitespace = "whitespace-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-paren}
+ */
+ OpenParen = "(-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-paren}
+ */
+ CloseParen = ")-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-square}
+ */
+ OpenSquare = "[-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-square}
+ */
+ CloseSquare = "]-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-open-curly}
+ */
+ OpenCurly = "{-token",
+ /**
+ * @see {@link https://www.w3.org/TR/2021/CRD-css-syntax-3-20211224/#tokendef-close-curly}
+ */
+ CloseCurly = "}-token",
+ /**
+ * Only appears in the token stream when the `unicodeRangesAllowed` option is set to true.
+ *
+ * @example
+ * ```js
+ * import { tokenize } from '@csstools/css-tokenizer';
+ *
+ * const tokens = tokenize({
+ * css: `U+0025-00FF, U+4??`,
+ * unicodeRangesAllowed: true,
+ * });
+ *
+ * console.log(tokens);
+ * ```
+ *
+ * @see {@link https://drafts.csswg.org/css-syntax/#typedef-unicode-range-token}
+ */
+ UnicodeRange = "unicode-range-token"
+}
+
+export declare interface TokenUnicodeRange extends Token<TokenType.UnicodeRange, {
+ startOfRange: number;
+ endOfRange: number;
+}> {
+}
+
+export declare interface TokenURL extends Token<TokenType.URL, {
+ /**
+ * The unescaped URL value without the leading `url(` and trailing `)`.
+ */
+ value: string;
+}> {
+}
+
+export declare interface TokenWhitespace extends Token<TokenType.Whitespace, undefined> {
+}
+
+export { }
diff --git a/vanilla/node_modules/@csstools/css-tokenizer/dist/index.mjs b/vanilla/node_modules/@csstools/css-tokenizer/dist/index.mjs
new file mode 100644
index 0000000..7fb0d6a
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-tokenizer/dist/index.mjs
@@ -0,0 +1 @@
+class ParseError extends Error{sourceStart;sourceEnd;parserState;constructor(e,n,t,o){super(e),this.name="ParseError",this.sourceStart=n,this.sourceEnd=t,this.parserState=o}}class ParseErrorWithToken extends ParseError{token;constructor(e,n,t,o,r){super(e,n,t,o),this.token=r}}const e={UnexpectedNewLineInString:"Unexpected newline while consuming a string token.",UnexpectedEOFInString:"Unexpected EOF while consuming a string token.",UnexpectedEOFInComment:"Unexpected EOF while consuming a comment.",UnexpectedEOFInURL:"Unexpected EOF while consuming a url token.",UnexpectedEOFInEscapedCodePoint:"Unexpected EOF while consuming an escaped code point.",UnexpectedCharacterInURL:"Unexpected character while consuming a url token.",InvalidEscapeSequenceInURL:"Invalid escape sequence while consuming a url token.",InvalidEscapeSequenceAfterBackslash:'Invalid escape sequence after "\\"'},n="undefined"!=typeof globalThis&&"structuredClone"in globalThis;function cloneTokens(e){return n?structuredClone(e):JSON.parse(JSON.stringify(e))}function stringify(...e){let n="";for(let t=0;t<e.length;t++)n+=e[t][1];return n}const t=13,o=45,r=10,i=43,s=65533;function checkIfFourCodePointsWouldStartCDO(e){return 60===e.source.codePointAt(e.cursor)&&33===e.source.codePointAt(e.cursor+1)&&e.source.codePointAt(e.cursor+2)===o&&e.source.codePointAt(e.cursor+3)===o}function isDigitCodePoint(e){return e>=48&&e<=57}function isUppercaseLetterCodePoint(e){return e>=65&&e<=90}function isLowercaseLetterCodePoint(e){return e>=97&&e<=122}function isHexDigitCodePoint(e){return e>=48&&e<=57||e>=97&&e<=102||e>=65&&e<=70}function isLetterCodePoint(e){return isLowercaseLetterCodePoint(e)||isUppercaseLetterCodePoint(e)}function isIdentStartCodePoint(e){return isLetterCodePoint(e)||isNonASCII_IdentCodePoint(e)||95===e}function isIdentCodePoint(e){return isIdentStartCodePoint(e)||isDigitCodePoint(e)||e===o}function isNonASCII_IdentCodePoint(e){return 183===e||8204===e||8205===e||8255===e||8256===e||8204===e||(192<=e&&e<=214||216<=e&&e<=246||248<=e&&e<=893||895<=e&&e<=8191||8304<=e&&e<=8591||11264<=e&&e<=12271||12289<=e&&e<=55295||63744<=e&&e<=64975||65008<=e&&e<=65533||(0===e||(!!isSurrogate(e)||e>=65536)))}function isNonPrintableCodePoint(e){return 11===e||127===e||0<=e&&e<=8||14<=e&&e<=31}function isNewLine(e){return e===r||e===t||12===e}function isWhitespace(e){return 32===e||e===r||9===e||e===t||12===e}function isSurrogate(e){return e>=55296&&e<=57343}function checkIfTwoCodePointsAreAValidEscape(e){return 92===e.source.codePointAt(e.cursor)&&!isNewLine(e.source.codePointAt(e.cursor+1)??-1)}function checkIfThreeCodePointsWouldStartAnIdentSequence(e,n){return n.source.codePointAt(n.cursor)===o?n.source.codePointAt(n.cursor+1)===o||(!!isIdentStartCodePoint(n.source.codePointAt(n.cursor+1)??-1)||92===n.source.codePointAt(n.cursor+1)&&!isNewLine(n.source.codePointAt(n.cursor+2)??-1)):!!isIdentStartCodePoint(n.source.codePointAt(n.cursor)??-1)||checkIfTwoCodePointsAreAValidEscape(n)}function checkIfThreeCodePointsWouldStartANumber(e){return e.source.codePointAt(e.cursor)===i||e.source.codePointAt(e.cursor)===o?!!isDigitCodePoint(e.source.codePointAt(e.cursor+1)??-1)||46===e.source.codePointAt(e.cursor+1)&&isDigitCodePoint(e.source.codePointAt(e.cursor+2)??-1):46===e.source.codePointAt(e.cursor)?isDigitCodePoint(e.source.codePointAt(e.cursor+1)??-1):isDigitCodePoint(e.source.codePointAt(e.cursor)??-1)}function checkIfTwoCodePointsStartAComment(e){return 47===e.source.codePointAt(e.cursor)&&42===e.source.codePointAt(e.cursor+1)}function checkIfThreeCodePointsWouldStartCDC(e){return e.source.codePointAt(e.cursor)===o&&e.source.codePointAt(e.cursor+1)===o&&62===e.source.codePointAt(e.cursor+2)}var c,a,u;function mirrorVariantType(e){switch(e){case c.OpenParen:return c.CloseParen;case c.CloseParen:return c.OpenParen;case c.OpenCurly:return c.CloseCurly;case c.CloseCurly:return c.OpenCurly;case c.OpenSquare:return c.CloseSquare;case c.CloseSquare:return c.OpenSquare;default:return null}}function mirrorVariant(e){switch(e[0]){case c.OpenParen:return[c.CloseParen,")",-1,-1,void 0];case c.CloseParen:return[c.OpenParen,"(",-1,-1,void 0];case c.OpenCurly:return[c.CloseCurly,"}",-1,-1,void 0];case c.CloseCurly:return[c.OpenCurly,"{",-1,-1,void 0];case c.OpenSquare:return[c.CloseSquare,"]",-1,-1,void 0];case c.CloseSquare:return[c.OpenSquare,"[",-1,-1,void 0];default:return null}}function consumeComment(n,t){for(t.advanceCodePoint(2);;){const o=t.readCodePoint();if(void 0===o){const o=[c.Comment,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,void 0];return n.onParseError(new ParseErrorWithToken(e.UnexpectedEOFInComment,t.representationStart,t.representationEnd,["4.3.2. Consume comments","Unexpected EOF"],o)),o}if(42===o&&(void 0!==t.source.codePointAt(t.cursor)&&47===t.source.codePointAt(t.cursor))){t.advanceCodePoint();break}}return[c.Comment,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,void 0]}function consumeEscapedCodePoint(n,o){const i=o.readCodePoint();if(void 0===i)return n.onParseError(new ParseError(e.UnexpectedEOFInEscapedCodePoint,o.representationStart,o.representationEnd,["4.3.7. Consume an escaped code point","Unexpected EOF"])),s;if(isHexDigitCodePoint(i)){const e=[i];let n;for(;void 0!==(n=o.source.codePointAt(o.cursor))&&isHexDigitCodePoint(n)&&e.length<6;)e.push(n),o.advanceCodePoint();isWhitespace(o.source.codePointAt(o.cursor)??-1)&&(o.source.codePointAt(o.cursor)===t&&o.source.codePointAt(o.cursor+1)===r&&o.advanceCodePoint(),o.advanceCodePoint());const c=parseInt(String.fromCodePoint(...e),16);return 0===c||isSurrogate(c)||c>1114111?s:c}return 0===i||isSurrogate(i)?s:i}function consumeIdentSequence(e,n){const t=[];for(;;){const o=n.source.codePointAt(n.cursor)??-1;if(0===o||isSurrogate(o))t.push(s),n.advanceCodePoint(+(o>65535)+1);else if(isIdentCodePoint(o))t.push(o),n.advanceCodePoint(+(o>65535)+1);else{if(!checkIfTwoCodePointsAreAValidEscape(n))return t;n.advanceCodePoint(),t.push(consumeEscapedCodePoint(e,n))}}}function consumeHashToken(e,n){n.advanceCodePoint();const t=n.source.codePointAt(n.cursor);if(void 0!==t&&(isIdentCodePoint(t)||checkIfTwoCodePointsAreAValidEscape(n))){let t=u.Unrestricted;checkIfThreeCodePointsWouldStartAnIdentSequence(0,n)&&(t=u.ID);const o=consumeIdentSequence(e,n);return[c.Hash,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{value:String.fromCodePoint(...o),type:t}]}return[c.Delim,"#",n.representationStart,n.representationEnd,{value:"#"}]}function consumeNumber(e,n){let t=a.Integer;for(n.source.codePointAt(n.cursor)!==i&&n.source.codePointAt(n.cursor)!==o||n.advanceCodePoint();isDigitCodePoint(n.source.codePointAt(n.cursor)??-1);)n.advanceCodePoint();if(46===n.source.codePointAt(n.cursor)&&isDigitCodePoint(n.source.codePointAt(n.cursor+1)??-1))for(n.advanceCodePoint(2),t=a.Number;isDigitCodePoint(n.source.codePointAt(n.cursor)??-1);)n.advanceCodePoint();if(101===n.source.codePointAt(n.cursor)||69===n.source.codePointAt(n.cursor)){if(isDigitCodePoint(n.source.codePointAt(n.cursor+1)??-1))n.advanceCodePoint(2);else{if(n.source.codePointAt(n.cursor+1)!==o&&n.source.codePointAt(n.cursor+1)!==i||!isDigitCodePoint(n.source.codePointAt(n.cursor+2)??-1))return t;n.advanceCodePoint(3)}for(t=a.Number;isDigitCodePoint(n.source.codePointAt(n.cursor)??-1);)n.advanceCodePoint()}return t}function consumeNumericToken(e,n){let t;{const e=n.source.codePointAt(n.cursor);e===o?t="-":e===i&&(t="+")}const r=consumeNumber(0,n),s=parseFloat(n.source.slice(n.representationStart,n.representationEnd+1));if(checkIfThreeCodePointsWouldStartAnIdentSequence(0,n)){const o=consumeIdentSequence(e,n);return[c.Dimension,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{value:s,signCharacter:t,type:r,unit:String.fromCodePoint(...o)}]}return 37===n.source.codePointAt(n.cursor)?(n.advanceCodePoint(),[c.Percentage,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{value:s,signCharacter:t}]):[c.Number,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{value:s,signCharacter:t,type:r}]}function consumeWhiteSpace(e){for(;isWhitespace(e.source.codePointAt(e.cursor)??-1);)e.advanceCodePoint();return[c.Whitespace,e.source.slice(e.representationStart,e.representationEnd+1),e.representationStart,e.representationEnd,void 0]}!function(e){e.Comment="comment",e.AtKeyword="at-keyword-token",e.BadString="bad-string-token",e.BadURL="bad-url-token",e.CDC="CDC-token",e.CDO="CDO-token",e.Colon="colon-token",e.Comma="comma-token",e.Delim="delim-token",e.Dimension="dimension-token",e.EOF="EOF-token",e.Function="function-token",e.Hash="hash-token",e.Ident="ident-token",e.Number="number-token",e.Percentage="percentage-token",e.Semicolon="semicolon-token",e.String="string-token",e.URL="url-token",e.Whitespace="whitespace-token",e.OpenParen="(-token",e.CloseParen=")-token",e.OpenSquare="[-token",e.CloseSquare="]-token",e.OpenCurly="{-token",e.CloseCurly="}-token",e.UnicodeRange="unicode-range-token"}(c||(c={})),function(e){e.Integer="integer",e.Number="number"}(a||(a={})),function(e){e.Unrestricted="unrestricted",e.ID="id"}(u||(u={}));class Reader{cursor=0;source="";representationStart=0;representationEnd=-1;constructor(e){this.source=e}advanceCodePoint(e=1){this.cursor=this.cursor+e,this.representationEnd=this.cursor-1}readCodePoint(){const e=this.source.codePointAt(this.cursor);if(void 0!==e)return this.cursor=this.cursor+1,this.representationEnd=this.cursor-1,e}unreadCodePoint(e=1){this.cursor=this.cursor-e,this.representationEnd=this.cursor-1}resetRepresentation(){this.representationStart=this.cursor,this.representationEnd=-1}}function consumeStringToken(n,o){let i="";const a=o.readCodePoint();for(;;){const u=o.readCodePoint();if(void 0===u){const t=[c.String,o.source.slice(o.representationStart,o.representationEnd+1),o.representationStart,o.representationEnd,{value:i}];return n.onParseError(new ParseErrorWithToken(e.UnexpectedEOFInString,o.representationStart,o.representationEnd,["4.3.5. Consume a string token","Unexpected EOF"],t)),t}if(isNewLine(u)){o.unreadCodePoint();const i=[c.BadString,o.source.slice(o.representationStart,o.representationEnd+1),o.representationStart,o.representationEnd,void 0];return n.onParseError(new ParseErrorWithToken(e.UnexpectedNewLineInString,o.representationStart,o.source.codePointAt(o.cursor)===t&&o.source.codePointAt(o.cursor+1)===r?o.representationEnd+2:o.representationEnd+1,["4.3.5. Consume a string token","Unexpected newline"],i)),i}if(u===a)return[c.String,o.source.slice(o.representationStart,o.representationEnd+1),o.representationStart,o.representationEnd,{value:i}];if(92!==u)0===u||isSurrogate(u)?i+=String.fromCodePoint(s):i+=String.fromCodePoint(u);else{if(void 0===o.source.codePointAt(o.cursor))continue;if(isNewLine(o.source.codePointAt(o.cursor)??-1)){o.source.codePointAt(o.cursor)===t&&o.source.codePointAt(o.cursor+1)===r&&o.advanceCodePoint(),o.advanceCodePoint();continue}i+=String.fromCodePoint(consumeEscapedCodePoint(n,o))}}}function checkIfCodePointsMatchURLIdent(e){return!(3!==e.length||117!==e[0]&&85!==e[0]||114!==e[1]&&82!==e[1]||108!==e[2]&&76!==e[2])}function consumeBadURL(e,n){for(;;){const t=n.source.codePointAt(n.cursor);if(void 0===t)return;if(41===t)return void n.advanceCodePoint();checkIfTwoCodePointsAreAValidEscape(n)?(n.advanceCodePoint(),consumeEscapedCodePoint(e,n)):n.advanceCodePoint()}}function consumeUrlToken(n,t){for(;isWhitespace(t.source.codePointAt(t.cursor)??-1);)t.advanceCodePoint();let o="";for(;;){if(void 0===t.source.codePointAt(t.cursor)){const r=[c.URL,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,{value:o}];return n.onParseError(new ParseErrorWithToken(e.UnexpectedEOFInURL,t.representationStart,t.representationEnd,["4.3.6. Consume a url token","Unexpected EOF"],r)),r}if(41===t.source.codePointAt(t.cursor))return t.advanceCodePoint(),[c.URL,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,{value:o}];if(isWhitespace(t.source.codePointAt(t.cursor)??-1)){for(t.advanceCodePoint();isWhitespace(t.source.codePointAt(t.cursor)??-1);)t.advanceCodePoint();if(void 0===t.source.codePointAt(t.cursor)){const r=[c.URL,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,{value:o}];return n.onParseError(new ParseErrorWithToken(e.UnexpectedEOFInURL,t.representationStart,t.representationEnd,["4.3.6. Consume a url token","Consume as much whitespace as possible","Unexpected EOF"],r)),r}return 41===t.source.codePointAt(t.cursor)?(t.advanceCodePoint(),[c.URL,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,{value:o}]):(consumeBadURL(n,t),[c.BadURL,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,void 0])}const r=t.source.codePointAt(t.cursor);if(34===r||39===r||40===r||isNonPrintableCodePoint(r??-1)){consumeBadURL(n,t);const o=[c.BadURL,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,void 0];return n.onParseError(new ParseErrorWithToken(e.UnexpectedCharacterInURL,t.representationStart,t.representationEnd,["4.3.6. Consume a url token","Unexpected U+0022 QUOTATION MARK (\"), U+0027 APOSTROPHE ('), U+0028 LEFT PARENTHESIS (() or non-printable code point"],o)),o}if(92===r){if(checkIfTwoCodePointsAreAValidEscape(t)){t.advanceCodePoint(),o+=String.fromCodePoint(consumeEscapedCodePoint(n,t));continue}consumeBadURL(n,t);const r=[c.BadURL,t.source.slice(t.representationStart,t.representationEnd+1),t.representationStart,t.representationEnd,void 0];return n.onParseError(new ParseErrorWithToken(e.InvalidEscapeSequenceInURL,t.representationStart,t.representationEnd,["4.3.6. Consume a url token","U+005C REVERSE SOLIDUS (\\)","The input stream does not start with a valid escape sequence"],r)),r}0===t.source.codePointAt(t.cursor)||isSurrogate(t.source.codePointAt(t.cursor)??-1)?(o+=String.fromCodePoint(s),t.advanceCodePoint()):(o+=t.source[t.cursor],t.advanceCodePoint())}}function consumeIdentLikeToken(e,n){const t=consumeIdentSequence(e,n);if(40!==n.source.codePointAt(n.cursor))return[c.Ident,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{value:String.fromCodePoint(...t)}];if(checkIfCodePointsMatchURLIdent(t)){n.advanceCodePoint();let o=0;for(;;){const e=isWhitespace(n.source.codePointAt(n.cursor)??-1),r=isWhitespace(n.source.codePointAt(n.cursor+1)??-1);if(e&&r){o+=1,n.advanceCodePoint(1);continue}const i=e?n.source.codePointAt(n.cursor+1):n.source.codePointAt(n.cursor);if(34===i||39===i)return o>0&&n.unreadCodePoint(o),[c.Function,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{value:String.fromCodePoint(...t)}];break}return consumeUrlToken(e,n)}return n.advanceCodePoint(),[c.Function,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{value:String.fromCodePoint(...t)}]}function checkIfThreeCodePointsWouldStartAUnicodeRange(e){return!(117!==e.source.codePointAt(e.cursor)&&85!==e.source.codePointAt(e.cursor)||e.source.codePointAt(e.cursor+1)!==i||63!==e.source.codePointAt(e.cursor+2)&&!isHexDigitCodePoint(e.source.codePointAt(e.cursor+2)??-1))}function consumeUnicodeRangeToken(e,n){n.advanceCodePoint(2);const t=[],r=[];let i;for(;void 0!==(i=n.source.codePointAt(n.cursor))&&t.length<6&&isHexDigitCodePoint(i);)t.push(i),n.advanceCodePoint();for(;void 0!==(i=n.source.codePointAt(n.cursor))&&t.length<6&&63===i;)0===r.length&&r.push(...t),t.push(48),r.push(70),n.advanceCodePoint();if(!r.length&&n.source.codePointAt(n.cursor)===o&&isHexDigitCodePoint(n.source.codePointAt(n.cursor+1)??-1))for(n.advanceCodePoint();void 0!==(i=n.source.codePointAt(n.cursor))&&r.length<6&&isHexDigitCodePoint(i);)r.push(i),n.advanceCodePoint();if(!r.length){const e=parseInt(String.fromCodePoint(...t),16);return[c.UnicodeRange,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{startOfRange:e,endOfRange:e}]}const s=parseInt(String.fromCodePoint(...t),16),a=parseInt(String.fromCodePoint(...r),16);return[c.UnicodeRange,n.source.slice(n.representationStart,n.representationEnd+1),n.representationStart,n.representationEnd,{startOfRange:s,endOfRange:a}]}function tokenize(e,n){const t=tokenizer(e,n),o=[];for(;!t.endOfFile();)o.push(t.nextToken());return o.push(t.nextToken()),o}function tokenizer(n,s){const a=n.css.valueOf(),u=n.unicodeRangesAllowed??!1,d=new Reader(a),p={onParseError:s?.onParseError??noop};return{nextToken:function nextToken(){d.resetRepresentation();const n=d.source.codePointAt(d.cursor);if(void 0===n)return[c.EOF,"",-1,-1,void 0];if(47===n&&checkIfTwoCodePointsStartAComment(d))return consumeComment(p,d);if(u&&(117===n||85===n)&&checkIfThreeCodePointsWouldStartAUnicodeRange(d))return consumeUnicodeRangeToken(0,d);if(isIdentStartCodePoint(n))return consumeIdentLikeToken(p,d);if(isDigitCodePoint(n))return consumeNumericToken(p,d);switch(n){case 44:return d.advanceCodePoint(),[c.Comma,",",d.representationStart,d.representationEnd,void 0];case 58:return d.advanceCodePoint(),[c.Colon,":",d.representationStart,d.representationEnd,void 0];case 59:return d.advanceCodePoint(),[c.Semicolon,";",d.representationStart,d.representationEnd,void 0];case 40:return d.advanceCodePoint(),[c.OpenParen,"(",d.representationStart,d.representationEnd,void 0];case 41:return d.advanceCodePoint(),[c.CloseParen,")",d.representationStart,d.representationEnd,void 0];case 91:return d.advanceCodePoint(),[c.OpenSquare,"[",d.representationStart,d.representationEnd,void 0];case 93:return d.advanceCodePoint(),[c.CloseSquare,"]",d.representationStart,d.representationEnd,void 0];case 123:return d.advanceCodePoint(),[c.OpenCurly,"{",d.representationStart,d.representationEnd,void 0];case 125:return d.advanceCodePoint(),[c.CloseCurly,"}",d.representationStart,d.representationEnd,void 0];case 39:case 34:return consumeStringToken(p,d);case 35:return consumeHashToken(p,d);case i:case 46:return checkIfThreeCodePointsWouldStartANumber(d)?consumeNumericToken(p,d):(d.advanceCodePoint(),[c.Delim,d.source[d.representationStart],d.representationStart,d.representationEnd,{value:d.source[d.representationStart]}]);case r:case t:case 12:case 9:case 32:return consumeWhiteSpace(d);case o:return checkIfThreeCodePointsWouldStartANumber(d)?consumeNumericToken(p,d):checkIfThreeCodePointsWouldStartCDC(d)?(d.advanceCodePoint(3),[c.CDC,"--\x3e",d.representationStart,d.representationEnd,void 0]):checkIfThreeCodePointsWouldStartAnIdentSequence(0,d)?consumeIdentLikeToken(p,d):(d.advanceCodePoint(),[c.Delim,"-",d.representationStart,d.representationEnd,{value:"-"}]);case 60:return checkIfFourCodePointsWouldStartCDO(d)?(d.advanceCodePoint(4),[c.CDO,"\x3c!--",d.representationStart,d.representationEnd,void 0]):(d.advanceCodePoint(),[c.Delim,"<",d.representationStart,d.representationEnd,{value:"<"}]);case 64:if(d.advanceCodePoint(),checkIfThreeCodePointsWouldStartAnIdentSequence(0,d)){const e=consumeIdentSequence(p,d);return[c.AtKeyword,d.source.slice(d.representationStart,d.representationEnd+1),d.representationStart,d.representationEnd,{value:String.fromCodePoint(...e)}]}return[c.Delim,"@",d.representationStart,d.representationEnd,{value:"@"}];case 92:{if(checkIfTwoCodePointsAreAValidEscape(d))return consumeIdentLikeToken(p,d);d.advanceCodePoint();const n=[c.Delim,"\\",d.representationStart,d.representationEnd,{value:"\\"}];return p.onParseError(new ParseErrorWithToken(e.InvalidEscapeSequenceAfterBackslash,d.representationStart,d.representationEnd,["4.3.1. Consume a token","U+005C REVERSE SOLIDUS (\\)","The input stream does not start with a valid escape sequence"],n)),n}}return d.advanceCodePoint(),[c.Delim,d.source[d.representationStart],d.representationStart,d.representationEnd,{value:d.source[d.representationStart]}]},endOfFile:function endOfFile(){return void 0===d.source.codePointAt(d.cursor)}}}function noop(){}function mutateIdent(e,n){const t=[];for(const e of n)t.push(e.codePointAt(0));const o=String.fromCodePoint(...serializeIdent(t));e[1]=o,e[4].value=n}function mutateUnit(e,n){const t=[];for(const e of n)t.push(e.codePointAt(0));const o=serializeIdent(t);101===o[0]&&insertEscapedCodePoint(o,0,o[0]);const r=String.fromCodePoint(...o),i="+"===e[4].signCharacter?e[4].signCharacter:"",s=e[4].value.toString();e[1]=`${i}${s}${r}`,e[4].unit=n}function serializeIdent(e){let n=0;if(0===e[0])e.splice(0,1,s),n=1;else if(e[0]===o&&e[1]===o)n=2;else if(e[0]===o&&e[1])n=2,isIdentStartCodePoint(e[1])||(n+=insertEscapedCodePoint(e,1,e[1]));else{if(e[0]===o&&!e[1])return[92,e[0]];isIdentStartCodePoint(e[0])?n=1:(n=1,n+=insertEscapedCodePoint(e,0,e[0]))}for(let t=n;t<e.length;t++)0!==e[t]?isIdentCodePoint(e[t])||(t+=insertEscapedCharacter(e,t,e[t])):(e.splice(t,1,s),t++);return e}function insertEscapedCharacter(e,n,t){return e.splice(n,1,92,t),1}function insertEscapedCodePoint(e,n,t){const o=t.toString(16),r=[];for(const e of o)r.push(e.codePointAt(0));return e.splice(n,1,92,...r,32),1+r.length}const d=Object.values(c);function isToken(e){return!!Array.isArray(e)&&(!(e.length<4)&&(!!d.includes(e[0])&&("string"==typeof e[1]&&("number"==typeof e[2]&&"number"==typeof e[3]))))}function isTokenNumeric(e){if(!e)return!1;switch(e[0]){case c.Dimension:case c.Number:case c.Percentage:return!0;default:return!1}}function isTokenWhiteSpaceOrComment(e){if(!e)return!1;switch(e[0]){case c.Whitespace:case c.Comment:return!0;default:return!1}}function isTokenAtKeyword(e){return!!e&&e[0]===c.AtKeyword}function isTokenBadString(e){return!!e&&e[0]===c.BadString}function isTokenBadURL(e){return!!e&&e[0]===c.BadURL}function isTokenCDC(e){return!!e&&e[0]===c.CDC}function isTokenCDO(e){return!!e&&e[0]===c.CDO}function isTokenColon(e){return!!e&&e[0]===c.Colon}function isTokenComma(e){return!!e&&e[0]===c.Comma}function isTokenComment(e){return!!e&&e[0]===c.Comment}function isTokenDelim(e){return!!e&&e[0]===c.Delim}function isTokenDimension(e){return!!e&&e[0]===c.Dimension}function isTokenEOF(e){return!!e&&e[0]===c.EOF}function isTokenFunction(e){return!!e&&e[0]===c.Function}function isTokenHash(e){return!!e&&e[0]===c.Hash}function isTokenIdent(e){return!!e&&e[0]===c.Ident}function isTokenNumber(e){return!!e&&e[0]===c.Number}function isTokenPercentage(e){return!!e&&e[0]===c.Percentage}function isTokenSemicolon(e){return!!e&&e[0]===c.Semicolon}function isTokenString(e){return!!e&&e[0]===c.String}function isTokenURL(e){return!!e&&e[0]===c.URL}function isTokenWhitespace(e){return!!e&&e[0]===c.Whitespace}function isTokenOpenParen(e){return!!e&&e[0]===c.OpenParen}function isTokenCloseParen(e){return!!e&&e[0]===c.CloseParen}function isTokenOpenSquare(e){return!!e&&e[0]===c.OpenSquare}function isTokenCloseSquare(e){return!!e&&e[0]===c.CloseSquare}function isTokenOpenCurly(e){return!!e&&e[0]===c.OpenCurly}function isTokenCloseCurly(e){return!!e&&e[0]===c.CloseCurly}function isTokenUnicodeRange(e){return!!e&&e[0]===c.UnicodeRange}export{u as HashType,a as NumberType,ParseError,e as ParseErrorMessage,ParseErrorWithToken,c as TokenType,cloneTokens,isToken,isTokenAtKeyword,isTokenBadString,isTokenBadURL,isTokenCDC,isTokenCDO,isTokenCloseCurly,isTokenCloseParen,isTokenCloseSquare,isTokenColon,isTokenComma,isTokenComment,isTokenDelim,isTokenDimension,isTokenEOF,isTokenFunction,isTokenHash,isTokenIdent,isTokenNumber,isTokenNumeric,isTokenOpenCurly,isTokenOpenParen,isTokenOpenSquare,isTokenPercentage,isTokenSemicolon,isTokenString,isTokenURL,isTokenUnicodeRange,isTokenWhiteSpaceOrComment,isTokenWhitespace,mirrorVariant,mirrorVariantType,mutateIdent,mutateUnit,stringify,tokenize,tokenizer};
diff --git a/vanilla/node_modules/@csstools/css-tokenizer/package.json b/vanilla/node_modules/@csstools/css-tokenizer/package.json
new file mode 100644
index 0000000..48e9b6d
--- /dev/null
+++ b/vanilla/node_modules/@csstools/css-tokenizer/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "@csstools/css-tokenizer",
+ "description": "Tokenize CSS",
+ "version": "4.0.0",
+ "contributors": [
+ {
+ "name": "Antonio Laguna",
+ "email": "antonio@laguna.es",
+ "url": "https://antonio.laguna.es"
+ },
+ {
+ "name": "Romain Menke",
+ "email": "romainmenke@gmail.com"
+ }
+ ],
+ "license": "MIT",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.mjs"
+ }
+ },
+ "files": [
+ "CHANGELOG.md",
+ "LICENSE.md",
+ "README.md",
+ "dist"
+ ],
+ "scripts": {},
+ "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/css-tokenizer#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/csstools/postcss-plugins.git",
+ "directory": "packages/css-tokenizer"
+ },
+ "bugs": "https://github.com/csstools/postcss-plugins/issues",
+ "keywords": [
+ "css",
+ "tokenizer"
+ ]
+}