@csstools/css-color-parser 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE.md +20 -0
  3. package/README.md +37 -0
  4. package/dist/color-data.d.ts +32 -0
  5. package/dist/color-notation.d.ts +17 -0
  6. package/dist/color-parser.d.ts +3 -0
  7. package/dist/functions/color-keyword.d.ts +2 -0
  8. package/dist/functions/color-mix.d.ts +4 -0
  9. package/dist/functions/color-normalize-channel-values.d.ts +3 -0
  10. package/dist/functions/color.d.ts +4 -0
  11. package/dist/functions/hex.d.ts +3 -0
  12. package/dist/functions/hsl-normalize-channel-values.d.ts +5 -0
  13. package/dist/functions/hsl.d.ts +4 -0
  14. package/dist/functions/hue-normalize-channel-value.d.ts +3 -0
  15. package/dist/functions/hwb-normalize-channel-values.d.ts +4 -0
  16. package/dist/functions/hwb.d.ts +4 -0
  17. package/dist/functions/lab-normalize-channel-values.d.ts +4 -0
  18. package/dist/functions/lab.d.ts +4 -0
  19. package/dist/functions/lch-normalize-channel-values.d.ts +4 -0
  20. package/dist/functions/lch.d.ts +4 -0
  21. package/dist/functions/named-color.d.ts +2 -0
  22. package/dist/functions/normalize-channel-values.d.ts +4 -0
  23. package/dist/functions/normalize.d.ts +1 -0
  24. package/dist/functions/oklab-normalize-channel-values.d.ts +4 -0
  25. package/dist/functions/oklab.d.ts +4 -0
  26. package/dist/functions/oklch-normalize-channel-values.d.ts +4 -0
  27. package/dist/functions/oklch.d.ts +4 -0
  28. package/dist/functions/rgb-normalize-channel-values.d.ts +5 -0
  29. package/dist/functions/rgb.d.ts +4 -0
  30. package/dist/functions/three-channel-legacy-syntax.d.ts +6 -0
  31. package/dist/functions/three-channel-space-separated.d.ts +6 -0
  32. package/dist/index.cjs +1 -0
  33. package/dist/index.d.ts +9 -0
  34. package/dist/index.mjs +1 -0
  35. package/dist/serialize/p3.d.ts +5 -0
  36. package/dist/serialize/rgb.d.ts +5 -0
  37. package/dist/serialize/to-precision.d.ts +1 -0
  38. package/dist/util/to-lower-case-a-z.d.ts +1 -0
  39. package/package.json +71 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changes to CSS Color Parser
2
+
3
+ ### 1.0.0 (March 25, 2023)
4
+
5
+ - Initial version
package/LICENSE.md ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright 2022 Romain Menke, Antonio Laguna <antonio@laguna.es>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # CSS Color Parser
2
+
3
+ [<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/css-color-parser.svg" height="20">][npm-url]
4
+ [<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/workflows/test/badge.svg" height="20">][cli-url]
5
+ [<img alt="Discord" src="https://shields.io/badge/Discord-5865F2?logo=discord&logoColor=white">][discord]
6
+
7
+ ## Usage
8
+
9
+ Add [CSS Color Parser] to your project:
10
+
11
+ ```bash
12
+ npm install @csstools/css-color-parser @csstools/css-parser-algorithms @csstools/css-tokenizer --save-dev
13
+ ```
14
+
15
+ ```ts
16
+ import { color } from '@csstools/css-color-parser';
17
+ import { isFunctionNode, parseComponentValue } from '@csstools/css-parser-algorithms';
18
+ import { serializeRGB } from '@csstools/css-color-parser';
19
+ import { tokenize } from '@csstools/css-tokenizer';
20
+
21
+ // color() expects a parsed component value.
22
+ const hwbComponentValue = parseComponentValue(tokenize({ css: 'hwb(10deg 10% 20%)' }));
23
+ const colorData = color(hwbComponentValue);
24
+ if (colorData) {
25
+ console.log(colorData);
26
+
27
+ // serializeRGB() returns a component value.
28
+ const rgbComponentValue = serializeRGB(colorData);
29
+ console.log(rgbComponentValue.toString());
30
+ }
31
+ ```
32
+
33
+ [cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
34
+ [discord]: https://discord.gg/bUadyRwkJS
35
+ [npm-url]: https://www.npmjs.com/package/@csstools/css-color-parser
36
+
37
+ [CSS Color Parser]: https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser
@@ -0,0 +1,32 @@
1
+ import type { Color } from '@csstools/color-helpers';
2
+ import type { ComponentValue } from '@csstools/css-parser-algorithms';
3
+ import { ColorNotation } from './color-notation';
4
+ import { TokenNumber } from '@csstools/css-tokenizer';
5
+ export type ColorData = {
6
+ colorNotation: ColorNotation;
7
+ channels: Color;
8
+ alpha: number | ComponentValue;
9
+ syntaxFlags: Set<SyntaxFlag>;
10
+ };
11
+ export declare enum SyntaxFlag {
12
+ ColorKeyword = "color-keyword",
13
+ HasAlpha = "has-alpha",
14
+ HasDimensionValues = "has-dimension-values",
15
+ HasNoneKeywords = "has-none-keywords",
16
+ HasNumberValues = "has-number-values",
17
+ HasPercentageAlpha = "has-percentage-alpha",
18
+ HasPercentageValues = "has-percentage-values",
19
+ HasVariableAlpha = "has-variable-alpha",
20
+ Hex = "hex",
21
+ LegacyHSL = "legacy-hsl",
22
+ LegacyRGB = "legacy-rgb",
23
+ NamedColor = "named-color",
24
+ RelativeColorSyntax = "relative-color-syntax",
25
+ ColorMix = "color-mix"
26
+ }
27
+ export declare function colorData_to_XYZ_D50(colorData: ColorData): ColorData;
28
+ export declare function colorDataTo(colorData: ColorData, toNotation: ColorNotation): ColorData;
29
+ export declare function setPowerlessComponents(a: Color, colorNotation: ColorNotation): Color;
30
+ export declare function fillInMissingComponents(a: Color, b: Color): Color;
31
+ export declare function colorDataChannelsToCalcGlobals(x: ColorData): Map<string, TokenNumber>;
32
+ export declare function colorDataFitsRGB_Gamut(x: ColorData): boolean;
@@ -0,0 +1,17 @@
1
+ export declare enum ColorNotation {
2
+ A98_RGB = "a98-rgb",
3
+ Display_P3 = "display-p3",
4
+ HEX = "hex",
5
+ HSL = "hsl",
6
+ HWB = "hwb",
7
+ LCH = "lch",
8
+ Lab = "lab",
9
+ Linear_RGB = "srgb-linear",
10
+ OKLCH = "oklch",
11
+ OKLab = "oklab",
12
+ ProPhoto_RGB = "prophoto-rgb",
13
+ RGB = "rgb",
14
+ Rec2020 = "rec2020",
15
+ XYZ_D50 = "xyz-d50",
16
+ XYZ_D65 = "xyz-d65"
17
+ }
@@ -0,0 +1,3 @@
1
+ import type { ColorData } from './color-data';
2
+ import type { ComponentValue } from '@csstools/css-parser-algorithms';
3
+ export type ColorParser = (x: ComponentValue) => ColorData | false;
@@ -0,0 +1,2 @@
1
+ import type { ColorData } from '../color-data';
2
+ export declare function colorKeyword(name: string): ColorData | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function colorMix(colorMixNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,3 @@
1
+ import type { ColorData } from '../color-data';
2
+ import { CSSToken, TokenNumber } from '@csstools/css-tokenizer';
3
+ export declare function normalize_Color_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function color(colorNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,3 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenHash } from '@csstools/css-tokenizer';
3
+ export declare function hex(hexToken: TokenHash): ColorData | false;
@@ -0,0 +1,5 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenNumber } from '@csstools/css-tokenizer';
3
+ import { CSSToken } from '@csstools/css-tokenizer';
4
+ export declare function normalize_legacy_HSL_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
5
+ export declare function normalize_modern_HSL_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function hsl(hslNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,3 @@
1
+ import type { TokenNumber } from '@csstools/css-tokenizer';
2
+ import { CSSToken } from '@csstools/css-tokenizer';
3
+ export declare function normalizeHue(token: CSSToken): TokenNumber | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenNumber } from '@csstools/css-tokenizer';
3
+ import { CSSToken } from '@csstools/css-tokenizer';
4
+ export declare function normalize_HWB_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function hwb(hwbNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenNumber } from '@csstools/css-tokenizer';
3
+ import { CSSToken } from '@csstools/css-tokenizer';
4
+ export declare function normalize_Lab_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function lab(labNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenNumber } from '@csstools/css-tokenizer';
3
+ import { CSSToken } from '@csstools/css-tokenizer';
4
+ export declare function normalize_LCH_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function lch(lchNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,2 @@
1
+ import type { ColorData } from '../color-data';
2
+ export declare function namedColor(name: string): ColorData | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenNumber } from '@csstools/css-tokenizer';
3
+ import { CSSToken } from '@csstools/css-tokenizer';
4
+ export type normalizeChannelValuesFn = (tokens: Array<CSSToken>, colorData: ColorData) => Array<TokenNumber> | false;
@@ -0,0 +1 @@
1
+ export declare function normalize(x: number, scale: number, min: number, max: number): number;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenNumber } from '@csstools/css-tokenizer';
3
+ import { CSSToken } from '@csstools/css-tokenizer';
4
+ export declare function normalize_OKLab_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function oklab(oklabNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenNumber } from '@csstools/css-tokenizer';
3
+ import { CSSToken } from '@csstools/css-tokenizer';
4
+ export declare function normalize_OKLCH_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function oklch(oklchNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,5 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { TokenNumber } from '@csstools/css-tokenizer';
3
+ import { CSSToken } from '@csstools/css-tokenizer';
4
+ export declare function normalize_legacy_sRGB_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
5
+ export declare function normalize_modern_sRGB_ChannelValues(tokens: Array<CSSToken>, colorData: ColorData): Array<TokenNumber> | false;
@@ -0,0 +1,4 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { ColorParser } from '../color-parser';
3
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
4
+ export declare function rgb(rgbNode: FunctionNode, colorParser: ColorParser): ColorData | false;
@@ -0,0 +1,6 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
3
+ import { ColorNotation } from '../color-notation';
4
+ import { SyntaxFlag } from '../color-data';
5
+ import { normalizeChannelValuesFn } from './normalize-channel-values';
6
+ export declare function threeChannelLegacySyntax(colorFunctionNode: FunctionNode, normalizeChannelValues: normalizeChannelValuesFn, colorNotation: ColorNotation, syntaxFlags: Array<SyntaxFlag>): ColorData | false;
@@ -0,0 +1,6 @@
1
+ import type { ColorData } from '../color-data';
2
+ import type { FunctionNode } from '@csstools/css-parser-algorithms';
3
+ import { ColorNotation } from '../color-notation';
4
+ import { SyntaxFlag } from '../color-data';
5
+ import { normalizeChannelValuesFn } from './normalize-channel-values';
6
+ export declare function threeChannelSpaceSeparated(colorFunctionNode: FunctionNode, normalizeChannelValues: normalizeChannelValuesFn, colorNotation: ColorNotation, syntaxFlags: Array<SyntaxFlag>): ColorData | false;
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";var e,o,a=require("@csstools/css-tokenizer"),n=require("@csstools/css-parser-algorithms"),t=require("@csstools/color-helpers"),r=require("@csstools/css-calc");function colorData_to_XYZ_D50(e){switch(e.colorNotation){case exports.ColorNotation.HEX:case exports.ColorNotation.RGB:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.sRGB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.Linear_RGB:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.lin_sRGB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.Display_P3:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.P3_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.Rec2020:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.rec_2020_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.A98_RGB:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.a98_RGB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.ProPhoto_RGB:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.ProPhoto_RGB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.HSL:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.HSL_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.HWB:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.HWB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.Lab:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.Lab_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.OKLab:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.OKLab_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.LCH:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.LCH_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.OKLCH:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.OKLCH_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.XYZ_D50:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.XYZ_D50_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case exports.ColorNotation.XYZ_D65:return{...e,colorNotation:exports.ColorNotation.XYZ_D50,channels:t.xyz.XYZ_D65_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};default:throw new Error("Unsupported color notation")}}exports.ColorNotation=void 0,(e=exports.ColorNotation||(exports.ColorNotation={})).A98_RGB="a98-rgb",e.Display_P3="display-p3",e.HEX="hex",e.HSL="hsl",e.HWB="hwb",e.LCH="lch",e.Lab="lab",e.Linear_RGB="srgb-linear",e.OKLCH="oklch",e.OKLab="oklab",e.ProPhoto_RGB="prophoto-rgb",e.RGB="rgb",e.Rec2020="rec2020",e.XYZ_D50="xyz-d50",e.XYZ_D65="xyz-d65",exports.SyntaxFlag=void 0,(o=exports.SyntaxFlag||(exports.SyntaxFlag={})).ColorKeyword="color-keyword",o.HasAlpha="has-alpha",o.HasDimensionValues="has-dimension-values",o.HasNoneKeywords="has-none-keywords",o.HasNumberValues="has-number-values",o.HasPercentageAlpha="has-percentage-alpha",o.HasPercentageValues="has-percentage-values",o.HasVariableAlpha="has-variable-alpha",o.Hex="hex",o.LegacyHSL="legacy-hsl",o.LegacyRGB="legacy-rgb",o.NamedColor="named-color",o.RelativeColorSyntax="relative-color-syntax",o.ColorMix="color-mix";const l=new Set([exports.ColorNotation.A98_RGB,exports.ColorNotation.Display_P3,exports.ColorNotation.HEX,exports.ColorNotation.Linear_RGB,exports.ColorNotation.ProPhoto_RGB,exports.ColorNotation.RGB,exports.ColorNotation.Rec2020,exports.ColorNotation.XYZ_D50,exports.ColorNotation.XYZ_D65]);function colorDataTo(e,o){const a=colorData_to_XYZ_D50(e),n={...e};switch(o){case exports.ColorNotation.HEX:case exports.ColorNotation.RGB:n.colorNotation=exports.ColorNotation.RGB,n.channels=t.xyz.XYZ_D50_to_sRGB(a.channels);break;case exports.ColorNotation.Linear_RGB:n.colorNotation=exports.ColorNotation.Linear_RGB,n.channels=t.xyz.XYZ_D50_to_lin_sRGB(a.channels);break;case exports.ColorNotation.Display_P3:n.colorNotation=exports.ColorNotation.Display_P3,n.channels=t.xyz.XYZ_D50_to_P3(a.channels);break;case exports.ColorNotation.Rec2020:n.colorNotation=exports.ColorNotation.Rec2020,n.channels=t.xyz.XYZ_D50_to_rec_2020(a.channels);break;case exports.ColorNotation.ProPhoto_RGB:n.colorNotation=exports.ColorNotation.ProPhoto_RGB,n.channels=t.xyz.XYZ_D50_to_ProPhoto(a.channels);break;case exports.ColorNotation.A98_RGB:n.colorNotation=exports.ColorNotation.A98_RGB,n.channels=t.xyz.XYZ_D50_to_a98_RGB(a.channels);break;case exports.ColorNotation.HSL:n.colorNotation=exports.ColorNotation.HSL,n.channels=t.xyz.XYZ_D50_to_HSL(a.channels);break;case exports.ColorNotation.HWB:n.colorNotation=exports.ColorNotation.HWB,n.channels=t.xyz.XYZ_D50_to_HWB(a.channels);break;case exports.ColorNotation.Lab:n.colorNotation=exports.ColorNotation.Lab,n.channels=t.xyz.XYZ_D50_to_Lab(a.channels);break;case exports.ColorNotation.LCH:n.colorNotation=exports.ColorNotation.LCH,n.channels=t.xyz.XYZ_D50_to_LCH(a.channels);break;case exports.ColorNotation.OKLCH:n.colorNotation=exports.ColorNotation.OKLCH,n.channels=t.xyz.XYZ_D50_to_OKLCH(a.channels);break;case exports.ColorNotation.OKLab:n.colorNotation=exports.ColorNotation.OKLab,n.channels=t.xyz.XYZ_D50_to_OKLab(a.channels);break;case exports.ColorNotation.XYZ_D50:n.colorNotation=exports.ColorNotation.XYZ_D50,n.channels=t.xyz.XYZ_D50_to_XYZ_D50(a.channels);break;case exports.ColorNotation.XYZ_D65:n.colorNotation=exports.ColorNotation.XYZ_D65,n.channels=t.xyz.XYZ_D50_to_XYZ_D65(a.channels);break;default:throw new Error("Unsupported color notation")}if(o===e.colorNotation)n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[0,1,2]);else if(l.has(o)&&l.has(e.colorNotation))n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[0,1,2]);else switch(o){case exports.ColorNotation.HSL:switch(e.colorNotation){case exports.ColorNotation.HWB:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[0]);break;case exports.ColorNotation.Lab:case exports.ColorNotation.OKLab:n.channels=carryForwardMissingComponents(e.channels,[2],n.channels,[0]);break;case exports.ColorNotation.LCH:case exports.ColorNotation.OKLCH:n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[2,1,0])}break;case exports.ColorNotation.HWB:switch(e.colorNotation){case exports.ColorNotation.HSL:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[0]);break;case exports.ColorNotation.LCH:case exports.ColorNotation.OKLCH:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[2])}break;case exports.ColorNotation.Lab:case exports.ColorNotation.OKLab:switch(e.colorNotation){case exports.ColorNotation.HSL:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[2]);break;case exports.ColorNotation.Lab:case exports.ColorNotation.OKLab:case exports.ColorNotation.LCH:case exports.ColorNotation.OKLCH:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[0])}break;case exports.ColorNotation.LCH:case exports.ColorNotation.OKLCH:switch(e.colorNotation){case exports.ColorNotation.HSL:n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[2,1,0]);break;case exports.ColorNotation.HWB:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[2]);break;case exports.ColorNotation.Lab:case exports.ColorNotation.OKLab:n.channels=carryForwardMissingComponents(e.channels,[0],n.channels,[0]);break;case exports.ColorNotation.LCH:case exports.ColorNotation.OKLCH:n.channels=carryForwardMissingComponents(e.channels,[0,1,2],n.channels,[0,1,2])}}return n.channels=setPowerlessComponents(n.channels,o),n}function setPowerlessComponents(e,o){const a=[...e];switch(o){case exports.ColorNotation.HSL:(reducePrecision(a[2])<=0||reducePrecision(a[2])>=100)&&(a[0]=NaN,a[1]=NaN),a[1]<=0&&(a[0]=NaN);break;case exports.ColorNotation.HWB:Math.max(0,reducePrecision(a[1]))+Math.max(0,reducePrecision(a[2]))>=100&&(a[0]=NaN);break;case exports.ColorNotation.Lab:(reducePrecision(a[0])<=0||reducePrecision(a[0])>=100)&&(a[1]=NaN,a[2]=NaN);break;case exports.ColorNotation.LCH:reducePrecision(a[1])<=0&&(a[2]=NaN),(reducePrecision(a[0])<=0||reducePrecision(a[0])>=100)&&(a[1]=NaN,a[2]=NaN);break;case exports.ColorNotation.OKLab:(reducePrecision(a[0])<=0||reducePrecision(a[0])>=1)&&(a[1]=NaN,a[2]=NaN);break;case exports.ColorNotation.OKLCH:reducePrecision(a[1])<=0&&(a[2]=NaN),(reducePrecision(a[0])<=0||reducePrecision(a[0])>=1)&&(a[1]=NaN,a[2]=NaN)}return a}function carryForwardMissingComponents(e,o,a,n){const t=[...a];for(const a of o)Number.isNaN(e[o[a]])&&(t[n[a]]=NaN);return t}function fillInMissingComponents(e,o){const a=[...e];for(let n=0;n<e.length;n++)Number.isNaN(e[n])&&(a[n]=o[n]);return a}function reducePrecision(e,o=7){const a=Math.pow(10,o);return Math.round(e*a)/a}function normalize(e,o,a,n){return Math.min(Math.max(e/o,a),n)}const s=/[A-Z]/g;function toLowerCaseAZ(e){return e.replace(s,(e=>String.fromCharCode(e.charCodeAt(0)+32)))}function normalize_Color_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Ident||"none"!==toLowerCaseAZ(r[4].value))if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,1,-1/0,1/0);3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:r[4].value,type:a.NumberType.Number}])}}else{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);let e=normalize(r[4].value,100,-1/0,1/0);3===t&&(e=normalize(r[4].value,100,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else o.syntaxFlags.add(exports.SyntaxFlag.HasNoneKeywords),n.push([a.TokenType.Number,"none",r[2],r[3],{value:NaN,type:a.NumberType.Number}])}return n}function threeChannelSpaceSeparated(e,o,t,l){const s=[],i=[],c=[],u=[],p={colorNotation:t,channels:[0,0,0],alpha:1,syntaxFlags:new Set(l)};let N=s;for(let o=0;o<e.value.length;o++){let t=e.value[o];if(n.isWhitespaceNode(t)||n.isCommentNode(t)){for(;n.isWhitespaceNode(e.value[o+1])||n.isCommentNode(e.value[o+1]);)o++;if(!s.length)continue;if(N===s){N=i;continue}if(N===i){N=c;continue}}else if(n.isTokenNode(t)&&t.value[0]===a.TokenType.Delim&&"/"===t.value[4].value){if(N===u)return!1;N=u}else{if(n.isFunctionNode(t)){if(N===u&&"var"===toLowerCaseAZ(t.getName())){p.syntaxFlags.add(exports.SyntaxFlag.HasVariableAlpha),N.push(t);continue}if("calc"!==toLowerCaseAZ(t.getName()))return!1;const[[e]]=r.calcFromComponentValues([[t]],{toCanonicalUnits:!0,precision:100});if(!e||!n.isTokenNode(e)||(e.value[0]===a.TokenType.Percentage||e.value[0]===a.TokenType.Number||e.value[0]===a.TokenType.Dimension)&&Number.isNaN(e.value[4].value))return!1;t=e}if(!n.isTokenNode(t))return!1;N.push(t)}}if(1!==N.length)return!1;if(1!==s.length||1!==i.length||1!==c.length)return!1;if(!n.isTokenNode(s[0])||!n.isTokenNode(i[0])||!n.isTokenNode(c[0]))return!1;const h=[s[0].value,i[0].value,c[0].value];1===u.length&&(p.syntaxFlags.add(exports.SyntaxFlag.HasAlpha),n.isTokenNode(u[0])?h.push(u[0].value):p.alpha=u[0]);const x=o(h,p);return!1!==x&&(p.channels=[x[0][4].value,x[1][4].value,x[2][4].value],4===x.length&&(p.alpha=x[3][4].value),p)}const i=new Set(["srgb","srgb-linear","display-p3","a98-rgb","prophoto-rgb","rec2020","xyz","xyz-d50","xyz-d65"]);function color$1(e,o){for(let o=0;o<e.value.length;o++){const t=e.value[o];if(!n.isWhitespaceNode(t)&&!n.isCommentNode(t)){if(n.isTokenNode(t)&&t.value[0]===a.TokenType.Ident){const a=toLowerCaseAZ(t.value[4].value);return!!i.has(a)&&threeChannelSpaceSeparated(new n.FunctionNode(e.name,e.endToken,e.value.slice(o+1)),normalize_Color_ChannelValues,colorSpaceNameToColorNotation(a),[])}return!1}}return!1}function colorSpaceNameToColorNotation(e){switch(e){case"srgb":return exports.ColorNotation.RGB;case"srgb-linear":return exports.ColorNotation.Linear_RGB;case"display-p3":return exports.ColorNotation.Display_P3;case"a98-rgb":return exports.ColorNotation.A98_RGB;case"prophoto-rgb":return exports.ColorNotation.ProPhoto_RGB;case"rec2020":return exports.ColorNotation.Rec2020;case"xyz":case"xyz-d65":return exports.ColorNotation.XYZ_D65;case"xyz-d50":return exports.ColorNotation.XYZ_D50;default:throw new Error("Unknown color space name: "+e)}}const c=new Set(["srgb","srgb-linear","lab","oklab","xyz","xyz-d50","xyz-d65"]),u=new Set(["hsl","hwb","lch","oklch"]),p=new Set(["shorter","longer","increasing","decreasing"]);function colorMix(e,o){let t=null,r=null,l=null,s=!1;for(let i=0;i<e.value.length;i++){const N=e.value[i];if(!n.isWhitespaceNode(N)&&!n.isCommentNode(N)){if(n.isTokenNode(N)&&N.value[0]===a.TokenType.Ident){if(!t&&"in"===toLowerCaseAZ(N.value[4].value)){t=N;continue}if(t&&!r){r=toLowerCaseAZ(N.value[4].value);continue}if(t&&r&&!l&&u.has(r)){l=toLowerCaseAZ(N.value[4].value);continue}if(t&&r&&l&&!s&&"hue"===toLowerCaseAZ(N.value[4].value)){s=!0;continue}return!1}return!(!n.isTokenNode(N)||N.value[0]!==a.TokenType.Comma)&&(!!r&&(l||s?!!(r&&l&&s&&u.has(r)&&p.has(l))&&colorMixPolar(r,l,colorMixComponents(e.value.slice(i+1),o)):c.has(r)?colorMixRectangular(r,colorMixComponents(e.value.slice(i+1),o)):!!u.has(r)&&colorMixPolar(r,"shorter",colorMixComponents(e.value.slice(i+1),o))))}}return!1}function colorMixComponents(e,o){const t=[];let l=1,s=!1,i=!1;for(let l=0;l<e.length;l++){let c=e[l];if(!n.isWhitespaceNode(c)&&!n.isCommentNode(c)){if(!n.isTokenNode(c)||c.value[0]!==a.TokenType.Comma){if(!s){const e=o(c);if(e){s=e;continue}}if(!i){if(n.isFunctionNode(c)&&"calc"===toLowerCaseAZ(c.getName())&&([[c]]=r.calcFromComponentValues([[c]],{toCanonicalUnits:!0,precision:100}),!c||!n.isTokenNode(c)||(c.value[0]===a.TokenType.Percentage||c.value[0]===a.TokenType.Number||c.value[0]===a.TokenType.Dimension)&&Number.isNaN(c.value[4].value)))return!1;if(n.isTokenNode(c)&&c.value[0]===a.TokenType.Percentage&&c.value[4].value>=0){i=c.value[4].value;continue}}return!1}if(!s)return!1;t.push({color:s,percentage:i}),s=!1,i=!1}}if(s&&t.push({color:s,percentage:i}),2!==t.length)return!1;let c=t[0].percentage,u=t[1].percentage;return(!1===c||!(c<0||c>100))&&((!1===u||!(u<0||u>100))&&(!1===c&&!1===u?(c=50,u=50):!1!==c&&!1===u?u=100-c:!1===c&&!1!==u&&(c=100-u),(0!==c||0!==u)&&(!1!==c&&!1!==u&&(c+u>100&&(c=c/(c+u)*100,u=u/(c+u)*100),c+u<100&&(l=(c+u)/100,c=c/(c+u)*100,u=u/(c+u)*100),{a:{color:t[0].color,percentage:c},b:{color:t[1].color,percentage:u},alphaMultiplier:l}))))}function colorMixRectangular(e,o){if(!o)return!1;const a=o.a.color,n=o.b.color,t=o.a.percentage/100;let r=a.channels,l=n.channels,s=exports.ColorNotation.RGB,i=a.alpha;if("number"!=typeof i)return!1;let c=n.alpha;if("number"!=typeof c)return!1;switch(i=Number.isNaN(i)?c:i,c=Number.isNaN(c)?i:c,e){case"srgb":s=exports.ColorNotation.RGB,a.colorNotation!==exports.ColorNotation.RGB&&a.colorNotation!==exports.ColorNotation.HEX&&(r=colorDataTo(a,exports.ColorNotation.RGB).channels),n.colorNotation!==exports.ColorNotation.RGB&&a.colorNotation!==exports.ColorNotation.HEX&&(l=colorDataTo(n,exports.ColorNotation.RGB).channels);break;case"srgb-linear":s=exports.ColorNotation.Linear_RGB,a.colorNotation!==exports.ColorNotation.Linear_RGB&&(r=colorDataTo(a,exports.ColorNotation.Linear_RGB).channels),n.colorNotation!==exports.ColorNotation.Linear_RGB&&(l=colorDataTo(n,exports.ColorNotation.Linear_RGB).channels);break;case"lab":s=exports.ColorNotation.Lab,a.colorNotation!==exports.ColorNotation.Lab&&(r=colorDataTo(a,exports.ColorNotation.Lab).channels),n.colorNotation!==exports.ColorNotation.Lab&&(l=colorDataTo(n,exports.ColorNotation.Lab).channels);break;case"oklab":s=exports.ColorNotation.OKLab,a.colorNotation!==exports.ColorNotation.OKLab&&(r=colorDataTo(a,exports.ColorNotation.OKLab).channels),n.colorNotation!==exports.ColorNotation.OKLab&&(l=colorDataTo(n,exports.ColorNotation.OKLab).channels);break;case"xyz-d50":s=exports.ColorNotation.XYZ_D50,a.colorNotation!==exports.ColorNotation.XYZ_D50&&(r=colorDataTo(a,exports.ColorNotation.XYZ_D50).channels),n.colorNotation!==exports.ColorNotation.XYZ_D50&&(l=colorDataTo(n,exports.ColorNotation.XYZ_D50).channels);break;case"xyz":case"xyz-d65":s=exports.ColorNotation.XYZ_D65,a.colorNotation!==exports.ColorNotation.XYZ_D65&&(r=colorDataTo(a,exports.ColorNotation.XYZ_D65).channels),n.colorNotation!==exports.ColorNotation.XYZ_D65&&(l=colorDataTo(n,exports.ColorNotation.XYZ_D65).channels)}r=fillInMissingComponents(r,l),l=fillInMissingComponents(l,r),r[0]=premultiply(r[0],i),r[1]=premultiply(r[1],i),r[2]=premultiply(r[2],i),l[0]=premultiply(l[0],c),l[1]=premultiply(l[1],c),l[2]=premultiply(l[2],c);const u=interpolate(i,c,t);return{colorNotation:s,channels:[un_premultiply(interpolate(r[0],l[0],t),u),un_premultiply(interpolate(r[1],l[1],t),u),un_premultiply(interpolate(r[2],l[2],t),u)],alpha:u*o.alphaMultiplier,syntaxFlags:new Set([exports.SyntaxFlag.ColorMix])}}function colorMixPolar(e,o,a){if(!a)return!1;const n=a.a.color,t=a.b.color,r=a.a.percentage/100;let l=n.channels,s=t.channels,i=0,c=0,u=0,p=0,N=0,h=0,x=exports.ColorNotation.RGB,m=n.alpha;if("number"!=typeof m)return!1;let y=t.alpha;if("number"!=typeof y)return!1;switch(m=Number.isNaN(m)?y:m,y=Number.isNaN(y)?m:y,e){case"hsl":x=exports.ColorNotation.HSL,n.colorNotation!==exports.ColorNotation.HSL&&(l=colorDataTo(n,exports.ColorNotation.HSL).channels),t.colorNotation!==exports.ColorNotation.HSL&&(s=colorDataTo(t,exports.ColorNotation.HSL).channels);break;case"hwb":x=exports.ColorNotation.HWB,n.colorNotation!==exports.ColorNotation.HWB&&(l=colorDataTo(n,exports.ColorNotation.HWB).channels),t.colorNotation!==exports.ColorNotation.HWB&&(s=colorDataTo(t,exports.ColorNotation.HWB).channels);break;case"lch":x=exports.ColorNotation.LCH,n.colorNotation!==exports.ColorNotation.LCH&&(l=colorDataTo(n,exports.ColorNotation.LCH).channels),t.colorNotation!==exports.ColorNotation.LCH&&(s=colorDataTo(t,exports.ColorNotation.LCH).channels);break;case"oklch":x=exports.ColorNotation.OKLCH,n.colorNotation!==exports.ColorNotation.OKLCH&&(l=colorDataTo(n,exports.ColorNotation.OKLCH).channels),t.colorNotation!==exports.ColorNotation.OKLCH&&(s=colorDataTo(t,exports.ColorNotation.OKLCH).channels)}switch(l=fillInMissingComponents(l,s),s=fillInMissingComponents(s,l),e){case"hsl":case"hwb":i=l[0],c=s[0],u=l[1],p=s[1],N=l[2],h=s[2];break;case"lch":case"oklch":u=l[0],p=s[0],N=l[1],h=s[1],i=l[2],c=s[2]}const C=c-i;switch(o){case"shorter":C>180?i+=360:C<-180&&(c+=360);break;case"longer":-180<C&&C<180&&(C>0?i+=360:c+=360);break;case"increasing":C<0&&(c+=360);break;case"decreasing":C>0&&(i+=360);break;default:throw new Error("Unknown hue interpolation method")}u=premultiply(u,m),N=premultiply(N,m),p=premultiply(p,y),h=premultiply(h,y);let b=[0,0,0];const T=interpolate(m,y,r);switch(e){case"hsl":case"hwb":b=[interpolate(i,c,r),un_premultiply(interpolate(u,p,r),T),un_premultiply(interpolate(N,h,r),T)];break;case"lch":case"oklch":b=[un_premultiply(interpolate(u,p,r),T),un_premultiply(interpolate(N,h,r),T),interpolate(i,c,r)]}return{colorNotation:x,channels:b,alpha:T*a.alphaMultiplier,syntaxFlags:new Set([exports.SyntaxFlag.ColorMix])}}function interpolate(e,o,a){return Number.isNaN(e)?o:Number.isNaN(o)?e:e*a+o*(1-a)}function premultiply(e,o){return Number.isNaN(o)?e:Number.isNaN(e)?NaN:e*o}function un_premultiply(e,o){return 0===o||Number.isNaN(o)?e:Number.isNaN(e)?NaN:e/o}function hex(e){const o=toLowerCaseAZ(e[4].value);if(o.match(/[^a-f0-9]/))return!1;const a={colorNotation:exports.ColorNotation.HEX,channels:[0,0,0],alpha:1,syntaxFlags:new Set([exports.SyntaxFlag.Hex])},n=o.length;if(3===n){const e=o[0],n=o[1],t=o[2];return a.channels=[parseInt(e+e,16)/255,parseInt(n+n,16)/255,parseInt(t+t,16)/255],a}if(6===n){const e=o[0]+o[1],n=o[2]+o[3],t=o[4]+o[5];return a.channels=[parseInt(e,16)/255,parseInt(n,16)/255,parseInt(t,16)/255],a}if(4===n){const e=o[0],n=o[1],t=o[2],r=o[3];return a.channels=[parseInt(e+e,16)/255,parseInt(n+n,16)/255,parseInt(t+t,16)/255],a.alpha=parseInt(r+r,16)/255,a.syntaxFlags.add(exports.SyntaxFlag.HasAlpha),a}if(8===n){const e=o[0]+o[1],n=o[2]+o[3],t=o[4]+o[5],r=o[6]+o[7];return a.channels=[parseInt(e,16)/255,parseInt(n,16)/255,parseInt(t,16)/255],a.alpha=parseInt(r,16)/255,a.syntaxFlags.add(exports.SyntaxFlag.HasAlpha),a}return!1}function normalizeHue(e){if(e[0]===a.TokenType.Number)return e[4].value=e[4].value%360,e[1]=e[4].value.toString(),e;if(e[0]===a.TokenType.Dimension){let o=e[4].value;switch(toLowerCaseAZ(e[4].unit)){case"deg":break;case"rad":o=180*e[4].value/Math.PI;break;case"grad":o=.9*e[4].value;break;case"turn":o=360*e[4].value;break;default:return!1}return o%=360,[a.TokenType.Number,o.toString(),e[2],e[3],{value:o,type:a.NumberType.Number}]}return!1}function normalize_legacy_HSL_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(0!==t)if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,1,0,100);3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}}else{3===t?o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageAlpha):o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);let e=normalize(r[4].value,1,0,100);3===t&&(e=normalize(r[4].value,100,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else{const e=normalizeHue(r);if(!1===e)return!1;r[0]===a.TokenType.Dimension&&o.syntaxFlags.add(exports.SyntaxFlag.HasDimensionValues),n.push(e)}}return!o.syntaxFlags.has(exports.SyntaxFlag.HasNumberValues)&&n}function normalize_modern_HSL_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Ident||"none"!==toLowerCaseAZ(r[4].value))if(0!==t)if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,1,0,100);3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}}else{3===t?o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageAlpha):o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);let e=normalize(r[4].value,1,0,100);3===t&&(e=normalize(r[4].value,100,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else{const e=normalizeHue(r);if(!1===e)return!1;r[0]===a.TokenType.Dimension&&o.syntaxFlags.add(exports.SyntaxFlag.HasDimensionValues),n.push(e)}else o.syntaxFlags.add(exports.SyntaxFlag.HasNoneKeywords),n.push([a.TokenType.Number,"none",r[2],r[3],{value:NaN,type:a.NumberType.Number}])}return n}function threeChannelLegacySyntax(e,o,t,l){const s=[],i=[],c=[],u=[],p={colorNotation:t,channels:[0,0,0],alpha:1,syntaxFlags:new Set(l)};let N=s;for(let o=0;o<e.value.length;o++){let t=e.value[o];if(!n.isWhitespaceNode(t)&&!n.isCommentNode(t)){if(n.isTokenNode(t)&&t.value[0]===a.TokenType.Comma){if(N===s){N=i;continue}if(N===i){N=c;continue}if(N===c){N=u;continue}if(N===u)return!1}if(n.isFunctionNode(t)){if(N===u&&"var"===toLowerCaseAZ(t.getName())){p.syntaxFlags.add(exports.SyntaxFlag.HasVariableAlpha),N.push(t);continue}if("calc"!==toLowerCaseAZ(t.getName()))return!1;const[[e]]=r.calcFromComponentValues([[t]],{toCanonicalUnits:!0,precision:100});if(!e||!n.isTokenNode(e)||(e.value[0]===a.TokenType.Percentage||e.value[0]===a.TokenType.Number||e.value[0]===a.TokenType.Dimension)&&Number.isNaN(e.value[4].value))return!1;t=e}if(!n.isTokenNode(t))return!1;N.push(t)}}if(1!==N.length)return!1;if(1!==s.length||1!==i.length||1!==c.length)return!1;if(!n.isTokenNode(s[0])||!n.isTokenNode(i[0])||!n.isTokenNode(c[0]))return!1;const h=[s[0].value,i[0].value,c[0].value];1===u.length&&(p.syntaxFlags.add(exports.SyntaxFlag.HasAlpha),n.isTokenNode(u[0])?h.push(u[0].value):p.alpha=u[0]);const x=o(h,p);return!1!==x&&(p.channels=[x[0][4].value,x[1][4].value,x[2][4].value],4===x.length&&(p.alpha=x[3][4].value),p)}function hsl(e,o){{const o=hslCommaSeparated(e);if(!1!==o)return o}{const o=hslSpaceSeparated(e);if(!1!==o)return o}return!1}function hslCommaSeparated(e){return threeChannelLegacySyntax(e,normalize_legacy_HSL_ChannelValues,exports.ColorNotation.HSL,[exports.SyntaxFlag.LegacyHSL])}function hslSpaceSeparated(e){return threeChannelSpaceSeparated(e,normalize_modern_HSL_ChannelValues,exports.ColorNotation.HSL,[])}function normalize_HWB_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Ident||"none"!==toLowerCaseAZ(r[4].value))if(0!==t)if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{if(3!==t)return!1;const e=normalize(r[4].value,1,0,1);n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}}else{3===t?o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageAlpha):o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);let e=normalize(r[4].value,1,0,100);3===t&&(e=normalize(r[4].value,100,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else{const e=normalizeHue(r);if(!1===e)return!1;r[0]===a.TokenType.Dimension&&o.syntaxFlags.add(exports.SyntaxFlag.HasDimensionValues),n.push(e)}else o.syntaxFlags.add(exports.SyntaxFlag.HasNoneKeywords),n.push([a.TokenType.Number,"none",r[2],r[3],{value:NaN,type:a.NumberType.Number}])}return n}function normalize_Lab_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Ident||"none"!==toLowerCaseAZ(r[4].value))if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,1,0,100);1===t||2===t?e=normalize(r[4].value,1,-1/0,1/0):3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:r[4].value,type:a.NumberType.Number}])}}else{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);let e=normalize(r[4].value,1,0,100);1===t||2===t?e=normalize(r[4].value,.8,-1/0,1/0):3===t&&(e=normalize(r[4].value,100,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else o.syntaxFlags.add(exports.SyntaxFlag.HasNoneKeywords),n.push([a.TokenType.Number,"none",r[2],r[3],{value:NaN,type:a.NumberType.Number}])}return n}function normalize_LCH_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Ident||"none"!==toLowerCaseAZ(r[4].value))if(2!==t)if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,1,0,100);1===t?e=normalize(r[4].value,1,0,1/0):3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:r[4].value,type:a.NumberType.Number}])}}else{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);let e=normalize(r[4].value,1,0,100);1===t?e=normalize(r[4].value,100/150,0,1/0):3===t&&(e=normalize(r[4].value,100,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else{const e=normalizeHue(r);if(!1===e)return!1;r[0]===a.TokenType.Dimension&&o.syntaxFlags.add(exports.SyntaxFlag.HasDimensionValues),n.push(e)}else o.syntaxFlags.add(exports.SyntaxFlag.HasNoneKeywords),n.push([a.TokenType.Number,"none",r[2],r[3],{value:NaN,type:a.NumberType.Number}])}return n}const N=new Map;for(const[e,o]of Object.entries(t.namedColors))N.set(e,o);function namedColor(e){const o=N.get(toLowerCaseAZ(e));return!!o&&{colorNotation:exports.ColorNotation.RGB,channels:[o[0]/255,o[1]/255,o[2]/255],alpha:1,syntaxFlags:new Set([exports.SyntaxFlag.ColorKeyword,exports.SyntaxFlag.NamedColor])}}function normalize_OKLab_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Ident||"none"!==toLowerCaseAZ(r[4].value))if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,1,0,1);1===t||2===t?e=normalize(r[4].value,1,-1/0,1/0):3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:r[4].value,type:a.NumberType.Number}])}}else{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);let e=normalize(r[4].value,100,0,1);1===t||2===t?e=normalize(r[4].value,250,-1/0,1/0):3===t&&(e=normalize(r[4].value,100,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else o.syntaxFlags.add(exports.SyntaxFlag.HasNoneKeywords),n.push([a.TokenType.Number,"none",r[2],r[3],{value:NaN,type:a.NumberType.Number}])}return n}function normalize_OKLCH_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Ident||"none"!==toLowerCaseAZ(r[4].value))if(2!==t)if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,1,0,1);1===t?e=normalize(r[4].value,1,0,1/0):3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:r[4].value,type:a.NumberType.Number}])}}else{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);let e=normalize(r[4].value,100,0,1);1===t?e=normalize(r[4].value,250,0,1/0):3===t&&(e=normalize(r[4].value,100,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else{const e=normalizeHue(r);if(!1===e)return!1;r[0]===a.TokenType.Dimension&&o.syntaxFlags.add(exports.SyntaxFlag.HasDimensionValues),n.push(e)}else o.syntaxFlags.add(exports.SyntaxFlag.HasNoneKeywords),n.push([a.TokenType.Number,"none",r[2],r[3],{value:NaN,type:a.NumberType.Number}])}return n}function normalize_legacy_sRGB_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,255,0,1);3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}}else{3===t?o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageAlpha):o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);const e=normalize(r[4].value,100,0,1);n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}}return(!o.syntaxFlags.has(exports.SyntaxFlag.HasNumberValues)||!o.syntaxFlags.has(exports.SyntaxFlag.HasPercentageValues))&&n}function normalize_modern_sRGB_ChannelValues(e,o){const n=[];for(let t=0;t<e.length;t++){const r=e[t];if(r[0]!==a.TokenType.Ident||"none"!==toLowerCaseAZ(r[4].value))if(r[0]!==a.TokenType.Percentage){if(r[0]!==a.TokenType.Number)return!1;{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasNumberValues);let e=normalize(r[4].value,255,0,1);3===t&&(e=normalize(r[4].value,1,0,1)),n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}}else{3!==t&&o.syntaxFlags.add(exports.SyntaxFlag.HasPercentageValues);const e=normalize(r[4].value,100,0,1);n.push([a.TokenType.Number,e.toString(),r[2],r[3],{value:e,type:a.NumberType.Number}])}else o.syntaxFlags.add(exports.SyntaxFlag.HasNoneKeywords),n.push([a.TokenType.Number,"none",r[2],r[3],{value:NaN,type:a.NumberType.Number}])}return n}function rgb(e,o){{const o=rgbCommaSeparated(e);if(!1!==o)return o}{const o=rgbSpaceSeparated(e);if(!1!==o)return o}return!1}function rgbCommaSeparated(e){return threeChannelLegacySyntax(e,normalize_legacy_sRGB_ChannelValues,exports.ColorNotation.RGB,[exports.SyntaxFlag.LegacyRGB])}function rgbSpaceSeparated(e){return threeChannelSpaceSeparated(e,normalize_modern_sRGB_ChannelValues,exports.ColorNotation.RGB,[])}function toPrecision(e,o=7){e=+e,o=+o;const a=(Math.floor(e)+"").length;if(o>a)return+e.toFixed(o-a);{const n=10**(a-o);return Math.round(e/n)*n}}function XYZ_D50_to_P3_Gamut(e){const o=t.xyz.XYZ_D50_to_P3(e);if(t.utils.inGamut(o))return t.utils.clip(o);let a=e.slice();return a=t.conversions.D50_to_D65(a),a=t.conversions.XYZ_to_OKLab(a),a=t.conversions.OKLab_to_OKLCH(a),a[0]<1e-6&&(a=[0,0,0]),a[0]>.999999&&(a=[1,0,0]),t.calculations.mapGamut(a,(e=>(e=t.conversions.OKLCH_to_OKLab(e),e=t.conversions.OKLab_to_XYZ(e),e=t.conversions.XYZ_to_lin_P3(e),t.conversions.gam_P3(e))),(e=>(e=t.conversions.lin_P3(e),e=t.conversions.lin_P3_to_XYZ(e),e=t.conversions.XYZ_to_OKLab(e),t.conversions.OKLab_to_OKLCH(e))))}function XYZ_D50_to_sRGB_Gamut(e){const o=t.xyz.XYZ_D50_to_sRGB(e);if(t.utils.inGamut(o))return t.utils.clip(o);let a=e.slice();return a=t.conversions.D50_to_D65(a),a=t.conversions.XYZ_to_OKLab(a),a=t.conversions.OKLab_to_OKLCH(a),a[0]<1e-6&&(a=[0,0,0]),a[0]>.999999&&(a=[1,0,0]),t.calculations.mapGamut(a,(e=>(e=t.conversions.OKLCH_to_OKLab(e),e=t.conversions.OKLab_to_XYZ(e),e=t.conversions.XYZ_to_lin_sRGB(e),t.conversions.gam_sRGB(e))),(e=>(e=t.conversions.lin_sRGB(e),e=t.conversions.lin_sRGB_to_XYZ(e),e=t.conversions.XYZ_to_OKLab(e),t.conversions.OKLab_to_OKLCH(e))))}exports.color=function color(e){if(n.isFunctionNode(e)){switch(toLowerCaseAZ(e.getName())){case"rgb":case"rgba":return rgb(e);case"hsl":case"hsla":return hsl(e);case"hwb":return threeChannelSpaceSeparated(e,normalize_HWB_ChannelValues,exports.ColorNotation.HWB,[]);case"lab":return threeChannelSpaceSeparated(e,normalize_Lab_ChannelValues,exports.ColorNotation.Lab,[]);case"lch":return threeChannelSpaceSeparated(e,normalize_LCH_ChannelValues,exports.ColorNotation.LCH,[]);case"oklab":return threeChannelSpaceSeparated(e,normalize_OKLab_ChannelValues,exports.ColorNotation.OKLab,[]);case"oklch":return threeChannelSpaceSeparated(e,normalize_OKLCH_ChannelValues,exports.ColorNotation.OKLCH,[]);case"color":return color$1(e);case"color-mix":return colorMix(e,color);default:return!1}}if(n.isTokenNode(e)){if(e.value[0]===a.TokenType.Hash)return hex(e.value);if(e.value[0]===a.TokenType.Ident){const o=namedColor(e.value[4].value);if(!1!==o)return o;const a="transparent"===toLowerCaseAZ(e.value[4].value)&&{colorNotation:exports.ColorNotation.RGB,channels:[0,0,0],alpha:0,syntaxFlags:new Set([exports.SyntaxFlag.ColorKeyword])};return!1!==a&&a}return!1}return!1},exports.colorDataFitsRGB_Gamut=function colorDataFitsRGB_Gamut(e){return!colorDataTo(e,exports.ColorNotation.RGB).channels.find((e=>e<-1e-5||e>1.00001))},exports.colorDataTo=colorDataTo,exports.serializeP3=function serializeP3(e){e.channels=setPowerlessComponents(e.channels,e.colorNotation);let o=e.channels.map((e=>Number.isNaN(e)?0:e));e.colorNotation!==exports.ColorNotation.Display_P3&&(o=XYZ_D50_to_P3_Gamut(colorData_to_XYZ_D50(e).channels));const t=toPrecision(o[0],6),r=toPrecision(o[1],6),l=toPrecision(o[2],6),s=[a.TokenType.Function,"color(",-1,-1,{value:"color"}],i=[a.TokenType.CloseParen,")",-1,-1,void 0],c=[a.TokenType.Whitespace," ",-1,-1,void 0],u=[new n.TokenNode([a.TokenType.Ident,"display-p3",-1,-1,{value:"display-p3"}]),new n.TokenNode(c),new n.TokenNode([a.TokenType.Number,t.toString(),-1,-1,{value:o[0],type:a.NumberType.Number}]),new n.TokenNode(c),new n.TokenNode([a.TokenType.Number,r.toString(),-1,-1,{value:o[1],type:a.NumberType.Number}]),new n.TokenNode(c),new n.TokenNode([a.TokenType.Number,l.toString(),-1,-1,{value:o[2],type:a.NumberType.Number}])];if("number"==typeof e.alpha){const o=Math.min(1,Math.max(0,toPrecision(Number.isNaN(e.alpha)?0:e.alpha)));return 1===o?new n.FunctionNode(s,i,u):new n.FunctionNode(s,i,[...u,new n.TokenNode(c),new n.TokenNode([a.TokenType.Delim,"/",-1,-1,{value:"/"}]),new n.TokenNode(c),new n.TokenNode([a.TokenType.Number,o.toString(),-1,-1,{value:e.alpha,type:a.NumberType.Integer}])])}return new n.FunctionNode(s,i,[...u,new n.TokenNode(c),new n.TokenNode([a.TokenType.Delim,"/",-1,-1,{value:"/"}]),new n.TokenNode(c),e.alpha])},exports.serializeRGB=function serializeRGB(e){e.channels=setPowerlessComponents(e.channels,e.colorNotation);let o=e.channels.map((e=>Number.isNaN(e)?0:e));e.colorNotation!==exports.ColorNotation.RGB&&e.colorNotation!==exports.ColorNotation.HEX&&(o=XYZ_D50_to_sRGB_Gamut(colorData_to_XYZ_D50(e).channels));const t=Math.min(255,Math.max(0,Math.round(255*toPrecision(o[0])))),r=Math.min(255,Math.max(0,Math.round(255*toPrecision(o[1])))),l=Math.min(255,Math.max(0,Math.round(255*toPrecision(o[2])))),s=[a.TokenType.CloseParen,")",-1,-1,void 0],i=[a.TokenType.Whitespace," ",-1,-1,void 0],c=[a.TokenType.Comma,",",-1,-1,void 0],u=[new n.TokenNode([a.TokenType.Number,t.toString(),-1,-1,{value:o[0],type:a.NumberType.Integer}]),new n.TokenNode(c),new n.TokenNode(i),new n.TokenNode([a.TokenType.Number,r.toString(),-1,-1,{value:o[1],type:a.NumberType.Integer}]),new n.TokenNode(c),new n.TokenNode(i),new n.TokenNode([a.TokenType.Number,l.toString(),-1,-1,{value:o[2],type:a.NumberType.Integer}])];if("number"==typeof e.alpha){const o=Math.min(1,Math.max(0,toPrecision(Number.isNaN(e.alpha)?0:e.alpha)));return 1===o?new n.FunctionNode([a.TokenType.Function,"rgb(",-1,-1,{value:"rgb"}],s,u):new n.FunctionNode([a.TokenType.Function,"rgba(",-1,-1,{value:"rgba"}],s,[...u,new n.TokenNode(c),new n.TokenNode(i),new n.TokenNode([a.TokenType.Number,o.toString(),-1,-1,{value:e.alpha,type:a.NumberType.Integer}])])}return new n.FunctionNode([a.TokenType.Function,"rgba(",-1,-1,{value:"rgba"}],s,[...u,new n.TokenNode(c),new n.TokenNode(i),e.alpha])};
@@ -0,0 +1,9 @@
1
+ import type { ColorData } from './color-data';
2
+ import type { ComponentValue } from '@csstools/css-parser-algorithms';
3
+ export type { ColorData } from './color-data';
4
+ export { ColorNotation } from './color-notation';
5
+ export { SyntaxFlag } from './color-data';
6
+ export { colorDataTo, colorDataFitsRGB_Gamut } from './color-data';
7
+ export { serializeP3 } from './serialize/p3';
8
+ export { serializeRGB } from './serialize/rgb';
9
+ export declare function color(colorNode: ComponentValue): ColorData | false;
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{TokenType as e,NumberType as a}from"@csstools/css-tokenizer";import{isWhitespaceNode as n,isCommentNode as o,isTokenNode as r,isFunctionNode as t,FunctionNode as l,TokenNode as s}from"@csstools/css-parser-algorithms";import{xyz as c,namedColors as u,utils as i,conversions as h,calculations as m}from"@csstools/color-helpers";import{calcFromComponentValues as N}from"@csstools/css-calc";var p,_;function colorData_to_XYZ_D50(e){switch(e.colorNotation){case p.HEX:case p.RGB:return{...e,colorNotation:p.XYZ_D50,channels:c.sRGB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.Linear_RGB:return{...e,colorNotation:p.XYZ_D50,channels:c.lin_sRGB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.Display_P3:return{...e,colorNotation:p.XYZ_D50,channels:c.P3_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.Rec2020:return{...e,colorNotation:p.XYZ_D50,channels:c.rec_2020_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.A98_RGB:return{...e,colorNotation:p.XYZ_D50,channels:c.a98_RGB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.ProPhoto_RGB:return{...e,colorNotation:p.XYZ_D50,channels:c.ProPhoto_RGB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.HSL:return{...e,colorNotation:p.XYZ_D50,channels:c.HSL_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.HWB:return{...e,colorNotation:p.XYZ_D50,channels:c.HWB_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.Lab:return{...e,colorNotation:p.XYZ_D50,channels:c.Lab_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.OKLab:return{...e,colorNotation:p.XYZ_D50,channels:c.OKLab_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.LCH:return{...e,colorNotation:p.XYZ_D50,channels:c.LCH_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.OKLCH:return{...e,colorNotation:p.XYZ_D50,channels:c.OKLCH_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.XYZ_D50:return{...e,colorNotation:p.XYZ_D50,channels:c.XYZ_D50_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};case p.XYZ_D65:return{...e,colorNotation:p.XYZ_D50,channels:c.XYZ_D65_to_XYZ_D50(e.channels.map((e=>Number.isNaN(e)?0:e)))};default:throw new Error("Unsupported color notation")}}!function(e){e.A98_RGB="a98-rgb",e.Display_P3="display-p3",e.HEX="hex",e.HSL="hsl",e.HWB="hwb",e.LCH="lch",e.Lab="lab",e.Linear_RGB="srgb-linear",e.OKLCH="oklch",e.OKLab="oklab",e.ProPhoto_RGB="prophoto-rgb",e.RGB="rgb",e.Rec2020="rec2020",e.XYZ_D50="xyz-d50",e.XYZ_D65="xyz-d65"}(p||(p={})),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"}(_||(_={}));const b=new Set([p.A98_RGB,p.Display_P3,p.HEX,p.Linear_RGB,p.ProPhoto_RGB,p.RGB,p.Rec2020,p.XYZ_D50,p.XYZ_D65]);function colorDataTo(e,a){const n=colorData_to_XYZ_D50(e),o={...e};switch(a){case p.HEX:case p.RGB:o.colorNotation=p.RGB,o.channels=c.XYZ_D50_to_sRGB(n.channels);break;case p.Linear_RGB:o.colorNotation=p.Linear_RGB,o.channels=c.XYZ_D50_to_lin_sRGB(n.channels);break;case p.Display_P3:o.colorNotation=p.Display_P3,o.channels=c.XYZ_D50_to_P3(n.channels);break;case p.Rec2020:o.colorNotation=p.Rec2020,o.channels=c.XYZ_D50_to_rec_2020(n.channels);break;case p.ProPhoto_RGB:o.colorNotation=p.ProPhoto_RGB,o.channels=c.XYZ_D50_to_ProPhoto(n.channels);break;case p.A98_RGB:o.colorNotation=p.A98_RGB,o.channels=c.XYZ_D50_to_a98_RGB(n.channels);break;case p.HSL:o.colorNotation=p.HSL,o.channels=c.XYZ_D50_to_HSL(n.channels);break;case p.HWB:o.colorNotation=p.HWB,o.channels=c.XYZ_D50_to_HWB(n.channels);break;case p.Lab:o.colorNotation=p.Lab,o.channels=c.XYZ_D50_to_Lab(n.channels);break;case p.LCH:o.colorNotation=p.LCH,o.channels=c.XYZ_D50_to_LCH(n.channels);break;case p.OKLCH:o.colorNotation=p.OKLCH,o.channels=c.XYZ_D50_to_OKLCH(n.channels);break;case p.OKLab:o.colorNotation=p.OKLab,o.channels=c.XYZ_D50_to_OKLab(n.channels);break;case p.XYZ_D50:o.colorNotation=p.XYZ_D50,o.channels=c.XYZ_D50_to_XYZ_D50(n.channels);break;case p.XYZ_D65:o.colorNotation=p.XYZ_D65,o.channels=c.XYZ_D50_to_XYZ_D65(n.channels);break;default:throw new Error("Unsupported color notation")}if(a===e.colorNotation)o.channels=carryForwardMissingComponents(e.channels,[0,1,2],o.channels,[0,1,2]);else if(b.has(a)&&b.has(e.colorNotation))o.channels=carryForwardMissingComponents(e.channels,[0,1,2],o.channels,[0,1,2]);else switch(a){case p.HSL:switch(e.colorNotation){case p.HWB:o.channels=carryForwardMissingComponents(e.channels,[0],o.channels,[0]);break;case p.Lab:case p.OKLab:o.channels=carryForwardMissingComponents(e.channels,[2],o.channels,[0]);break;case p.LCH:case p.OKLCH:o.channels=carryForwardMissingComponents(e.channels,[0,1,2],o.channels,[2,1,0])}break;case p.HWB:switch(e.colorNotation){case p.HSL:o.channels=carryForwardMissingComponents(e.channels,[0],o.channels,[0]);break;case p.LCH:case p.OKLCH:o.channels=carryForwardMissingComponents(e.channels,[0],o.channels,[2])}break;case p.Lab:case p.OKLab:switch(e.colorNotation){case p.HSL:o.channels=carryForwardMissingComponents(e.channels,[0],o.channels,[2]);break;case p.Lab:case p.OKLab:case p.LCH:case p.OKLCH:o.channels=carryForwardMissingComponents(e.channels,[0],o.channels,[0])}break;case p.LCH:case p.OKLCH:switch(e.colorNotation){case p.HSL:o.channels=carryForwardMissingComponents(e.channels,[0,1,2],o.channels,[2,1,0]);break;case p.HWB:o.channels=carryForwardMissingComponents(e.channels,[0],o.channels,[2]);break;case p.Lab:case p.OKLab:o.channels=carryForwardMissingComponents(e.channels,[0],o.channels,[0]);break;case p.LCH:case p.OKLCH:o.channels=carryForwardMissingComponents(e.channels,[0,1,2],o.channels,[0,1,2])}}return o.channels=setPowerlessComponents(o.channels,a),o}function setPowerlessComponents(e,a){const n=[...e];switch(a){case p.HSL:(reducePrecision(n[2])<=0||reducePrecision(n[2])>=100)&&(n[0]=NaN,n[1]=NaN),n[1]<=0&&(n[0]=NaN);break;case p.HWB:Math.max(0,reducePrecision(n[1]))+Math.max(0,reducePrecision(n[2]))>=100&&(n[0]=NaN);break;case p.Lab:(reducePrecision(n[0])<=0||reducePrecision(n[0])>=100)&&(n[1]=NaN,n[2]=NaN);break;case p.LCH:reducePrecision(n[1])<=0&&(n[2]=NaN),(reducePrecision(n[0])<=0||reducePrecision(n[0])>=100)&&(n[1]=NaN,n[2]=NaN);break;case p.OKLab:(reducePrecision(n[0])<=0||reducePrecision(n[0])>=1)&&(n[1]=NaN,n[2]=NaN);break;case p.OKLCH:reducePrecision(n[1])<=0&&(n[2]=NaN),(reducePrecision(n[0])<=0||reducePrecision(n[0])>=1)&&(n[1]=NaN,n[2]=NaN)}return n}function carryForwardMissingComponents(e,a,n,o){const r=[...n];for(const n of a)Number.isNaN(e[a[n]])&&(r[o[n]]=NaN);return r}function fillInMissingComponents(e,a){const n=[...e];for(let o=0;o<e.length;o++)Number.isNaN(e[o])&&(n[o]=a[o]);return n}function reducePrecision(e,a=7){const n=Math.pow(10,a);return Math.round(e*n)/n}function colorDataFitsRGB_Gamut(e){return!colorDataTo(e,p.RGB).channels.find((e=>e<-1e-5||e>1.00001))}function normalize(e,a,n,o){return Math.min(Math.max(e/a,n),o)}const g=/[A-Z]/g;function toLowerCaseAZ(e){return e.replace(g,(e=>String.fromCharCode(e.charCodeAt(0)+32)))}function normalize_Color_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Ident||"none"!==toLowerCaseAZ(l[4].value))if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,1,-1/0,1/0);3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:l[4].value,type:a.Number}])}}else{3!==t&&o.syntaxFlags.add(_.HasPercentageValues);let n=normalize(l[4].value,100,-1/0,1/0);3===t&&(n=normalize(l[4].value,100,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else o.syntaxFlags.add(_.HasNoneKeywords),r.push([e.Number,"none",l[2],l[3],{value:NaN,type:a.Number}])}return r}function threeChannelSpaceSeparated(a,l,s,c){const u=[],i=[],h=[],m=[],p={colorNotation:s,channels:[0,0,0],alpha:1,syntaxFlags:new Set(c)};let b=u;for(let l=0;l<a.value.length;l++){let s=a.value[l];if(n(s)||o(s)){for(;n(a.value[l+1])||o(a.value[l+1]);)l++;if(!u.length)continue;if(b===u){b=i;continue}if(b===i){b=h;continue}}else if(r(s)&&s.value[0]===e.Delim&&"/"===s.value[4].value){if(b===m)return!1;b=m}else{if(t(s)){if(b===m&&"var"===toLowerCaseAZ(s.getName())){p.syntaxFlags.add(_.HasVariableAlpha),b.push(s);continue}if("calc"!==toLowerCaseAZ(s.getName()))return!1;const[[a]]=N([[s]],{toCanonicalUnits:!0,precision:100});if(!a||!r(a)||(a.value[0]===e.Percentage||a.value[0]===e.Number||a.value[0]===e.Dimension)&&Number.isNaN(a.value[4].value))return!1;s=a}if(!r(s))return!1;b.push(s)}}if(1!==b.length)return!1;if(1!==u.length||1!==i.length||1!==h.length)return!1;if(!r(u[0])||!r(i[0])||!r(h[0]))return!1;const g=[u[0].value,i[0].value,h[0].value];1===m.length&&(p.syntaxFlags.add(_.HasAlpha),r(m[0])?g.push(m[0].value):p.alpha=m[0]);const d=l(g,p);return!1!==d&&(p.channels=[d[0][4].value,d[1][4].value,d[2][4].value],4===d.length&&(p.alpha=d[3][4].value),p)}const d=new Set(["srgb","srgb-linear","display-p3","a98-rgb","prophoto-rgb","rec2020","xyz","xyz-d50","xyz-d65"]);function color$1(a,t){for(let t=0;t<a.value.length;t++){const s=a.value[t];if(!n(s)&&!o(s)){if(r(s)&&s.value[0]===e.Ident){const e=toLowerCaseAZ(s.value[4].value);return!!d.has(e)&&threeChannelSpaceSeparated(new l(a.name,a.endToken,a.value.slice(t+1)),normalize_Color_ChannelValues,colorSpaceNameToColorNotation(e),[])}return!1}}return!1}function colorSpaceNameToColorNotation(e){switch(e){case"srgb":return p.RGB;case"srgb-linear":return p.Linear_RGB;case"display-p3":return p.Display_P3;case"a98-rgb":return p.A98_RGB;case"prophoto-rgb":return p.ProPhoto_RGB;case"rec2020":return p.Rec2020;case"xyz":case"xyz-d65":return p.XYZ_D65;case"xyz-d50":return p.XYZ_D50;default:throw new Error("Unknown color space name: "+e)}}const f=new Set(["srgb","srgb-linear","lab","oklab","xyz","xyz-d50","xyz-d65"]),v=new Set(["hsl","hwb","lch","oklch"]),y=new Set(["shorter","longer","increasing","decreasing"]);function colorMix(a,t){let l=null,s=null,c=null,u=!1;for(let i=0;i<a.value.length;i++){const h=a.value[i];if(!n(h)&&!o(h)){if(r(h)&&h.value[0]===e.Ident){if(!l&&"in"===toLowerCaseAZ(h.value[4].value)){l=h;continue}if(l&&!s){s=toLowerCaseAZ(h.value[4].value);continue}if(l&&s&&!c&&v.has(s)){c=toLowerCaseAZ(h.value[4].value);continue}if(l&&s&&c&&!u&&"hue"===toLowerCaseAZ(h.value[4].value)){u=!0;continue}return!1}return!(!r(h)||h.value[0]!==e.Comma)&&(!!s&&(c||u?!!(s&&c&&u&&v.has(s)&&y.has(c))&&colorMixPolar(s,c,colorMixComponents(a.value.slice(i+1),t)):f.has(s)?colorMixRectangular(s,colorMixComponents(a.value.slice(i+1),t)):!!v.has(s)&&colorMixPolar(s,"shorter",colorMixComponents(a.value.slice(i+1),t))))}}return!1}function colorMixComponents(a,l){const s=[];let c=1,u=!1,i=!1;for(let c=0;c<a.length;c++){let h=a[c];if(!n(h)&&!o(h)){if(!r(h)||h.value[0]!==e.Comma){if(!u){const e=l(h);if(e){u=e;continue}}if(!i){if(t(h)&&"calc"===toLowerCaseAZ(h.getName())&&([[h]]=N([[h]],{toCanonicalUnits:!0,precision:100}),!h||!r(h)||(h.value[0]===e.Percentage||h.value[0]===e.Number||h.value[0]===e.Dimension)&&Number.isNaN(h.value[4].value)))return!1;if(r(h)&&h.value[0]===e.Percentage&&h.value[4].value>=0){i=h.value[4].value;continue}}return!1}if(!u)return!1;s.push({color:u,percentage:i}),u=!1,i=!1}}if(u&&s.push({color:u,percentage:i}),2!==s.length)return!1;let h=s[0].percentage,m=s[1].percentage;return(!1===h||!(h<0||h>100))&&((!1===m||!(m<0||m>100))&&(!1===h&&!1===m?(h=50,m=50):!1!==h&&!1===m?m=100-h:!1===h&&!1!==m&&(h=100-m),(0!==h||0!==m)&&(!1!==h&&!1!==m&&(h+m>100&&(h=h/(h+m)*100,m=m/(h+m)*100),h+m<100&&(c=(h+m)/100,h=h/(h+m)*100,m=m/(h+m)*100),{a:{color:s[0].color,percentage:h},b:{color:s[1].color,percentage:m},alphaMultiplier:c}))))}function colorMixRectangular(e,a){if(!a)return!1;const n=a.a.color,o=a.b.color,r=a.a.percentage/100;let t=n.channels,l=o.channels,s=p.RGB,c=n.alpha;if("number"!=typeof c)return!1;let u=o.alpha;if("number"!=typeof u)return!1;switch(c=Number.isNaN(c)?u:c,u=Number.isNaN(u)?c:u,e){case"srgb":s=p.RGB,n.colorNotation!==p.RGB&&n.colorNotation!==p.HEX&&(t=colorDataTo(n,p.RGB).channels),o.colorNotation!==p.RGB&&n.colorNotation!==p.HEX&&(l=colorDataTo(o,p.RGB).channels);break;case"srgb-linear":s=p.Linear_RGB,n.colorNotation!==p.Linear_RGB&&(t=colorDataTo(n,p.Linear_RGB).channels),o.colorNotation!==p.Linear_RGB&&(l=colorDataTo(o,p.Linear_RGB).channels);break;case"lab":s=p.Lab,n.colorNotation!==p.Lab&&(t=colorDataTo(n,p.Lab).channels),o.colorNotation!==p.Lab&&(l=colorDataTo(o,p.Lab).channels);break;case"oklab":s=p.OKLab,n.colorNotation!==p.OKLab&&(t=colorDataTo(n,p.OKLab).channels),o.colorNotation!==p.OKLab&&(l=colorDataTo(o,p.OKLab).channels);break;case"xyz-d50":s=p.XYZ_D50,n.colorNotation!==p.XYZ_D50&&(t=colorDataTo(n,p.XYZ_D50).channels),o.colorNotation!==p.XYZ_D50&&(l=colorDataTo(o,p.XYZ_D50).channels);break;case"xyz":case"xyz-d65":s=p.XYZ_D65,n.colorNotation!==p.XYZ_D65&&(t=colorDataTo(n,p.XYZ_D65).channels),o.colorNotation!==p.XYZ_D65&&(l=colorDataTo(o,p.XYZ_D65).channels)}t=fillInMissingComponents(t,l),l=fillInMissingComponents(l,t),t[0]=premultiply(t[0],c),t[1]=premultiply(t[1],c),t[2]=premultiply(t[2],c),l[0]=premultiply(l[0],u),l[1]=premultiply(l[1],u),l[2]=premultiply(l[2],u);const i=interpolate(c,u,r);return{colorNotation:s,channels:[un_premultiply(interpolate(t[0],l[0],r),i),un_premultiply(interpolate(t[1],l[1],r),i),un_premultiply(interpolate(t[2],l[2],r),i)],alpha:i*a.alphaMultiplier,syntaxFlags:new Set([_.ColorMix])}}function colorMixPolar(e,a,n){if(!n)return!1;const o=n.a.color,r=n.b.color,t=n.a.percentage/100;let l=o.channels,s=r.channels,c=0,u=0,i=0,h=0,m=0,N=0,b=p.RGB,g=o.alpha;if("number"!=typeof g)return!1;let d=r.alpha;if("number"!=typeof d)return!1;switch(g=Number.isNaN(g)?d:g,d=Number.isNaN(d)?g:d,e){case"hsl":b=p.HSL,o.colorNotation!==p.HSL&&(l=colorDataTo(o,p.HSL).channels),r.colorNotation!==p.HSL&&(s=colorDataTo(r,p.HSL).channels);break;case"hwb":b=p.HWB,o.colorNotation!==p.HWB&&(l=colorDataTo(o,p.HWB).channels),r.colorNotation!==p.HWB&&(s=colorDataTo(r,p.HWB).channels);break;case"lch":b=p.LCH,o.colorNotation!==p.LCH&&(l=colorDataTo(o,p.LCH).channels),r.colorNotation!==p.LCH&&(s=colorDataTo(r,p.LCH).channels);break;case"oklch":b=p.OKLCH,o.colorNotation!==p.OKLCH&&(l=colorDataTo(o,p.OKLCH).channels),r.colorNotation!==p.OKLCH&&(s=colorDataTo(r,p.OKLCH).channels)}switch(l=fillInMissingComponents(l,s),s=fillInMissingComponents(s,l),e){case"hsl":case"hwb":c=l[0],u=s[0],i=l[1],h=s[1],m=l[2],N=s[2];break;case"lch":case"oklch":i=l[0],h=s[0],m=l[1],N=s[1],c=l[2],u=s[2]}const f=u-c;switch(a){case"shorter":f>180?c+=360:f<-180&&(u+=360);break;case"longer":-180<f&&f<180&&(f>0?c+=360:u+=360);break;case"increasing":f<0&&(u+=360);break;case"decreasing":f>0&&(c+=360);break;default:throw new Error("Unknown hue interpolation method")}i=premultiply(i,g),m=premultiply(m,g),h=premultiply(h,d),N=premultiply(N,d);let v=[0,0,0];const y=interpolate(g,d,t);switch(e){case"hsl":case"hwb":v=[interpolate(c,u,t),un_premultiply(interpolate(i,h,t),y),un_premultiply(interpolate(m,N,t),y)];break;case"lch":case"oklch":v=[un_premultiply(interpolate(i,h,t),y),un_premultiply(interpolate(m,N,t),y),interpolate(c,u,t)]}return{colorNotation:b,channels:v,alpha:y*n.alphaMultiplier,syntaxFlags:new Set([_.ColorMix])}}function interpolate(e,a,n){return Number.isNaN(e)?a:Number.isNaN(a)?e:e*n+a*(1-n)}function premultiply(e,a){return Number.isNaN(a)?e:Number.isNaN(e)?NaN:e*a}function un_premultiply(e,a){return 0===a||Number.isNaN(a)?e:Number.isNaN(e)?NaN:e/a}function hex(e){const a=toLowerCaseAZ(e[4].value);if(a.match(/[^a-f0-9]/))return!1;const n={colorNotation:p.HEX,channels:[0,0,0],alpha:1,syntaxFlags:new Set([_.Hex])},o=a.length;if(3===o){const e=a[0],o=a[1],r=a[2];return n.channels=[parseInt(e+e,16)/255,parseInt(o+o,16)/255,parseInt(r+r,16)/255],n}if(6===o){const e=a[0]+a[1],o=a[2]+a[3],r=a[4]+a[5];return n.channels=[parseInt(e,16)/255,parseInt(o,16)/255,parseInt(r,16)/255],n}if(4===o){const e=a[0],o=a[1],r=a[2],t=a[3];return n.channels=[parseInt(e+e,16)/255,parseInt(o+o,16)/255,parseInt(r+r,16)/255],n.alpha=parseInt(t+t,16)/255,n.syntaxFlags.add(_.HasAlpha),n}if(8===o){const e=a[0]+a[1],o=a[2]+a[3],r=a[4]+a[5],t=a[6]+a[7];return n.channels=[parseInt(e,16)/255,parseInt(o,16)/255,parseInt(r,16)/255],n.alpha=parseInt(t,16)/255,n.syntaxFlags.add(_.HasAlpha),n}return!1}function normalizeHue(n){if(n[0]===e.Number)return n[4].value=n[4].value%360,n[1]=n[4].value.toString(),n;if(n[0]===e.Dimension){let o=n[4].value;switch(toLowerCaseAZ(n[4].unit)){case"deg":break;case"rad":o=180*n[4].value/Math.PI;break;case"grad":o=.9*n[4].value;break;case"turn":o=360*n[4].value;break;default:return!1}return o%=360,[e.Number,o.toString(),n[2],n[3],{value:o,type:a.Number}]}return!1}function normalize_legacy_HSL_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(0!==t)if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,1,0,100);3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}}else{3===t?o.syntaxFlags.add(_.HasPercentageAlpha):o.syntaxFlags.add(_.HasPercentageValues);let n=normalize(l[4].value,1,0,100);3===t&&(n=normalize(l[4].value,100,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else{const a=normalizeHue(l);if(!1===a)return!1;l[0]===e.Dimension&&o.syntaxFlags.add(_.HasDimensionValues),r.push(a)}}return!o.syntaxFlags.has(_.HasNumberValues)&&r}function normalize_modern_HSL_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Ident||"none"!==toLowerCaseAZ(l[4].value))if(0!==t)if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,1,0,100);3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}}else{3===t?o.syntaxFlags.add(_.HasPercentageAlpha):o.syntaxFlags.add(_.HasPercentageValues);let n=normalize(l[4].value,1,0,100);3===t&&(n=normalize(l[4].value,100,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else{const a=normalizeHue(l);if(!1===a)return!1;l[0]===e.Dimension&&o.syntaxFlags.add(_.HasDimensionValues),r.push(a)}else o.syntaxFlags.add(_.HasNoneKeywords),r.push([e.Number,"none",l[2],l[3],{value:NaN,type:a.Number}])}return r}function threeChannelLegacySyntax(a,l,s,c){const u=[],i=[],h=[],m=[],p={colorNotation:s,channels:[0,0,0],alpha:1,syntaxFlags:new Set(c)};let b=u;for(let l=0;l<a.value.length;l++){let s=a.value[l];if(!n(s)&&!o(s)){if(r(s)&&s.value[0]===e.Comma){if(b===u){b=i;continue}if(b===i){b=h;continue}if(b===h){b=m;continue}if(b===m)return!1}if(t(s)){if(b===m&&"var"===toLowerCaseAZ(s.getName())){p.syntaxFlags.add(_.HasVariableAlpha),b.push(s);continue}if("calc"!==toLowerCaseAZ(s.getName()))return!1;const[[a]]=N([[s]],{toCanonicalUnits:!0,precision:100});if(!a||!r(a)||(a.value[0]===e.Percentage||a.value[0]===e.Number||a.value[0]===e.Dimension)&&Number.isNaN(a.value[4].value))return!1;s=a}if(!r(s))return!1;b.push(s)}}if(1!==b.length)return!1;if(1!==u.length||1!==i.length||1!==h.length)return!1;if(!r(u[0])||!r(i[0])||!r(h[0]))return!1;const g=[u[0].value,i[0].value,h[0].value];1===m.length&&(p.syntaxFlags.add(_.HasAlpha),r(m[0])?g.push(m[0].value):p.alpha=m[0]);const d=l(g,p);return!1!==d&&(p.channels=[d[0][4].value,d[1][4].value,d[2][4].value],4===d.length&&(p.alpha=d[3][4].value),p)}function hsl(e,a){{const a=hslCommaSeparated(e);if(!1!==a)return a}{const a=hslSpaceSeparated(e);if(!1!==a)return a}return!1}function hslCommaSeparated(e){return threeChannelLegacySyntax(e,normalize_legacy_HSL_ChannelValues,p.HSL,[_.LegacyHSL])}function hslSpaceSeparated(e){return threeChannelSpaceSeparated(e,normalize_modern_HSL_ChannelValues,p.HSL,[])}function normalize_HWB_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Ident||"none"!==toLowerCaseAZ(l[4].value))if(0!==t)if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{if(3!==t)return!1;const n=normalize(l[4].value,1,0,1);r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}}else{3===t?o.syntaxFlags.add(_.HasPercentageAlpha):o.syntaxFlags.add(_.HasPercentageValues);let n=normalize(l[4].value,1,0,100);3===t&&(n=normalize(l[4].value,100,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else{const a=normalizeHue(l);if(!1===a)return!1;l[0]===e.Dimension&&o.syntaxFlags.add(_.HasDimensionValues),r.push(a)}else o.syntaxFlags.add(_.HasNoneKeywords),r.push([e.Number,"none",l[2],l[3],{value:NaN,type:a.Number}])}return r}function normalize_Lab_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Ident||"none"!==toLowerCaseAZ(l[4].value))if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,1,0,100);1===t||2===t?n=normalize(l[4].value,1,-1/0,1/0):3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:l[4].value,type:a.Number}])}}else{3!==t&&o.syntaxFlags.add(_.HasPercentageValues);let n=normalize(l[4].value,1,0,100);1===t||2===t?n=normalize(l[4].value,.8,-1/0,1/0):3===t&&(n=normalize(l[4].value,100,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else o.syntaxFlags.add(_.HasNoneKeywords),r.push([e.Number,"none",l[2],l[3],{value:NaN,type:a.Number}])}return r}function normalize_LCH_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Ident||"none"!==toLowerCaseAZ(l[4].value))if(2!==t)if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,1,0,100);1===t?n=normalize(l[4].value,1,0,1/0):3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:l[4].value,type:a.Number}])}}else{3!==t&&o.syntaxFlags.add(_.HasPercentageValues);let n=normalize(l[4].value,1,0,100);1===t?n=normalize(l[4].value,100/150,0,1/0):3===t&&(n=normalize(l[4].value,100,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else{const a=normalizeHue(l);if(!1===a)return!1;l[0]===e.Dimension&&o.syntaxFlags.add(_.HasDimensionValues),r.push(a)}else o.syntaxFlags.add(_.HasNoneKeywords),r.push([e.Number,"none",l[2],l[3],{value:NaN,type:a.Number}])}return r}const L=new Map;for(const[e,a]of Object.entries(u))L.set(e,a);function namedColor(e){const a=L.get(toLowerCaseAZ(e));return!!a&&{colorNotation:p.RGB,channels:[a[0]/255,a[1]/255,a[2]/255],alpha:1,syntaxFlags:new Set([_.ColorKeyword,_.NamedColor])}}function normalize_OKLab_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Ident||"none"!==toLowerCaseAZ(l[4].value))if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,1,0,1);1===t||2===t?n=normalize(l[4].value,1,-1/0,1/0):3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:l[4].value,type:a.Number}])}}else{3!==t&&o.syntaxFlags.add(_.HasPercentageValues);let n=normalize(l[4].value,100,0,1);1===t||2===t?n=normalize(l[4].value,250,-1/0,1/0):3===t&&(n=normalize(l[4].value,100,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else o.syntaxFlags.add(_.HasNoneKeywords),r.push([e.Number,"none",l[2],l[3],{value:NaN,type:a.Number}])}return r}function normalize_OKLCH_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Ident||"none"!==toLowerCaseAZ(l[4].value))if(2!==t)if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,1,0,1);1===t?n=normalize(l[4].value,1,0,1/0):3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:l[4].value,type:a.Number}])}}else{3!==t&&o.syntaxFlags.add(_.HasPercentageValues);let n=normalize(l[4].value,100,0,1);1===t?n=normalize(l[4].value,250,0,1/0):3===t&&(n=normalize(l[4].value,100,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else{const a=normalizeHue(l);if(!1===a)return!1;l[0]===e.Dimension&&o.syntaxFlags.add(_.HasDimensionValues),r.push(a)}else o.syntaxFlags.add(_.HasNoneKeywords),r.push([e.Number,"none",l[2],l[3],{value:NaN,type:a.Number}])}return r}function normalize_legacy_sRGB_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,255,0,1);3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}}else{3===t?o.syntaxFlags.add(_.HasPercentageAlpha):o.syntaxFlags.add(_.HasPercentageValues);const n=normalize(l[4].value,100,0,1);r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}}return(!o.syntaxFlags.has(_.HasNumberValues)||!o.syntaxFlags.has(_.HasPercentageValues))&&r}function normalize_modern_sRGB_ChannelValues(n,o){const r=[];for(let t=0;t<n.length;t++){const l=n[t];if(l[0]!==e.Ident||"none"!==toLowerCaseAZ(l[4].value))if(l[0]!==e.Percentage){if(l[0]!==e.Number)return!1;{3!==t&&o.syntaxFlags.add(_.HasNumberValues);let n=normalize(l[4].value,255,0,1);3===t&&(n=normalize(l[4].value,1,0,1)),r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}}else{3!==t&&o.syntaxFlags.add(_.HasPercentageValues);const n=normalize(l[4].value,100,0,1);r.push([e.Number,n.toString(),l[2],l[3],{value:n,type:a.Number}])}else o.syntaxFlags.add(_.HasNoneKeywords),r.push([e.Number,"none",l[2],l[3],{value:NaN,type:a.Number}])}return r}function rgb(e,a){{const a=rgbCommaSeparated(e);if(!1!==a)return a}{const a=rgbSpaceSeparated(e);if(!1!==a)return a}return!1}function rgbCommaSeparated(e){return threeChannelLegacySyntax(e,normalize_legacy_sRGB_ChannelValues,p.RGB,[_.LegacyRGB])}function rgbSpaceSeparated(e){return threeChannelSpaceSeparated(e,normalize_modern_sRGB_ChannelValues,p.RGB,[])}function toPrecision(e,a=7){e=+e,a=+a;const n=(Math.floor(e)+"").length;if(a>n)return+e.toFixed(a-n);{const o=10**(n-a);return Math.round(e/o)*o}}function serializeP3(n){n.channels=setPowerlessComponents(n.channels,n.colorNotation);let o=n.channels.map((e=>Number.isNaN(e)?0:e));n.colorNotation!==p.Display_P3&&(o=XYZ_D50_to_P3_Gamut(colorData_to_XYZ_D50(n).channels));const r=toPrecision(o[0],6),t=toPrecision(o[1],6),c=toPrecision(o[2],6),u=[e.Function,"color(",-1,-1,{value:"color"}],i=[e.CloseParen,")",-1,-1,void 0],h=[e.Whitespace," ",-1,-1,void 0],m=[new s([e.Ident,"display-p3",-1,-1,{value:"display-p3"}]),new s(h),new s([e.Number,r.toString(),-1,-1,{value:o[0],type:a.Number}]),new s(h),new s([e.Number,t.toString(),-1,-1,{value:o[1],type:a.Number}]),new s(h),new s([e.Number,c.toString(),-1,-1,{value:o[2],type:a.Number}])];if("number"==typeof n.alpha){const o=Math.min(1,Math.max(0,toPrecision(Number.isNaN(n.alpha)?0:n.alpha)));return new l(u,i,1===o?m:[...m,new s(h),new s([e.Delim,"/",-1,-1,{value:"/"}]),new s(h),new s([e.Number,o.toString(),-1,-1,{value:n.alpha,type:a.Integer}])])}return new l(u,i,[...m,new s(h),new s([e.Delim,"/",-1,-1,{value:"/"}]),new s(h),n.alpha])}function XYZ_D50_to_P3_Gamut(e){const a=c.XYZ_D50_to_P3(e);if(i.inGamut(a))return i.clip(a);let n=e.slice();return n=h.D50_to_D65(n),n=h.XYZ_to_OKLab(n),n=h.OKLab_to_OKLCH(n),n[0]<1e-6&&(n=[0,0,0]),n[0]>.999999&&(n=[1,0,0]),m.mapGamut(n,(e=>(e=h.OKLCH_to_OKLab(e),e=h.OKLab_to_XYZ(e),e=h.XYZ_to_lin_P3(e),h.gam_P3(e))),(e=>(e=h.lin_P3(e),e=h.lin_P3_to_XYZ(e),e=h.XYZ_to_OKLab(e),h.OKLab_to_OKLCH(e))))}function serializeRGB(n){n.channels=setPowerlessComponents(n.channels,n.colorNotation);let o=n.channels.map((e=>Number.isNaN(e)?0:e));n.colorNotation!==p.RGB&&n.colorNotation!==p.HEX&&(o=XYZ_D50_to_sRGB_Gamut(colorData_to_XYZ_D50(n).channels));const r=Math.min(255,Math.max(0,Math.round(255*toPrecision(o[0])))),t=Math.min(255,Math.max(0,Math.round(255*toPrecision(o[1])))),c=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],h=[e.Comma,",",-1,-1,void 0],m=[new s([e.Number,r.toString(),-1,-1,{value:o[0],type:a.Integer}]),new s(h),new s(i),new s([e.Number,t.toString(),-1,-1,{value:o[1],type:a.Integer}]),new s(h),new s(i),new s([e.Number,c.toString(),-1,-1,{value:o[2],type:a.Integer}])];if("number"==typeof n.alpha){const o=Math.min(1,Math.max(0,toPrecision(Number.isNaN(n.alpha)?0:n.alpha)));return 1===o?new l([e.Function,"rgb(",-1,-1,{value:"rgb"}],u,m):new l([e.Function,"rgba(",-1,-1,{value:"rgba"}],u,[...m,new s(h),new s(i),new s([e.Number,o.toString(),-1,-1,{value:n.alpha,type:a.Integer}])])}return new l([e.Function,"rgba(",-1,-1,{value:"rgba"}],u,[...m,new s(h),new s(i),n.alpha])}function XYZ_D50_to_sRGB_Gamut(e){const a=c.XYZ_D50_to_sRGB(e);if(i.inGamut(a))return i.clip(a);let n=e.slice();return n=h.D50_to_D65(n),n=h.XYZ_to_OKLab(n),n=h.OKLab_to_OKLCH(n),n[0]<1e-6&&(n=[0,0,0]),n[0]>.999999&&(n=[1,0,0]),m.mapGamut(n,(e=>(e=h.OKLCH_to_OKLab(e),e=h.OKLab_to_XYZ(e),e=h.XYZ_to_lin_sRGB(e),h.gam_sRGB(e))),(e=>(e=h.lin_sRGB(e),e=h.lin_sRGB_to_XYZ(e),e=h.XYZ_to_OKLab(e),h.OKLab_to_OKLCH(e))))}function color(a){if(t(a)){switch(toLowerCaseAZ(a.getName())){case"rgb":case"rgba":return rgb(a);case"hsl":case"hsla":return hsl(a);case"hwb":return threeChannelSpaceSeparated(a,normalize_HWB_ChannelValues,p.HWB,[]);case"lab":return threeChannelSpaceSeparated(a,normalize_Lab_ChannelValues,p.Lab,[]);case"lch":return threeChannelSpaceSeparated(a,normalize_LCH_ChannelValues,p.LCH,[]);case"oklab":return threeChannelSpaceSeparated(a,normalize_OKLab_ChannelValues,p.OKLab,[]);case"oklch":return threeChannelSpaceSeparated(a,normalize_OKLCH_ChannelValues,p.OKLCH,[]);case"color":return color$1(a);case"color-mix":return colorMix(a,color);default:return!1}}if(r(a)){if(a.value[0]===e.Hash)return hex(a.value);if(a.value[0]===e.Ident){const e=namedColor(a.value[4].value);if(!1!==e)return e;const n="transparent"===toLowerCaseAZ(a.value[4].value)&&{colorNotation:p.RGB,channels:[0,0,0],alpha:0,syntaxFlags:new Set([_.ColorKeyword])};return!1!==n&&n}return!1}return!1}export{p as ColorNotation,_ as SyntaxFlag,color,colorDataFitsRGB_Gamut,colorDataTo,serializeP3,serializeRGB};
@@ -0,0 +1,5 @@
1
+ import { ColorData } from '../color-data';
2
+ import { FunctionNode } from '@csstools/css-parser-algorithms';
3
+ import { Color } from '@csstools/color-helpers';
4
+ export declare function serializeP3(color: ColorData): FunctionNode;
5
+ export declare function XYZ_D50_to_P3_Gamut(color: Color): Color;
@@ -0,0 +1,5 @@
1
+ import { ColorData } from '../color-data';
2
+ import { FunctionNode } from '@csstools/css-parser-algorithms';
3
+ import { Color } from '@csstools/color-helpers';
4
+ export declare function serializeRGB(color: ColorData): FunctionNode;
5
+ export declare function XYZ_D50_to_sRGB_Gamut(color: Color): Color;
@@ -0,0 +1 @@
1
+ export declare function toPrecision(n: number, precision?: number): number;
@@ -0,0 +1 @@
1
+ export declare function toLowerCaseAZ(x: string): string;
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@csstools/css-color-parser",
3
+ "description": "Parse CSS color values",
4
+ "version": "1.0.0",
5
+ "contributors": [
6
+ {
7
+ "name": "Antonio Laguna",
8
+ "email": "antonio@laguna.es",
9
+ "url": "https://antonio.laguna.es"
10
+ },
11
+ {
12
+ "name": "Romain Menke",
13
+ "email": "romainmenke@gmail.com"
14
+ }
15
+ ],
16
+ "license": "MIT",
17
+ "funding": {
18
+ "type": "opencollective",
19
+ "url": "https://opencollective.com/csstools"
20
+ },
21
+ "engines": {
22
+ "node": "^14 || ^16 || >=18"
23
+ },
24
+ "main": "dist/index.cjs",
25
+ "module": "dist/index.mjs",
26
+ "types": "dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.mjs",
31
+ "require": "./dist/index.cjs",
32
+ "default": "./dist/index.mjs"
33
+ }
34
+ },
35
+ "files": [
36
+ "CHANGELOG.md",
37
+ "LICENSE.md",
38
+ "README.md",
39
+ "dist"
40
+ ],
41
+ "dependencies": {
42
+ "@csstools/color-helpers": "^2.0.0",
43
+ "@csstools/css-calc": "^1.0.1"
44
+ },
45
+ "peerDependencies": {
46
+ "@csstools/css-parser-algorithms": "^2.1.0",
47
+ "@csstools/css-tokenizer": "^2.1.0"
48
+ },
49
+ "scripts": {
50
+ "build": "rollup -c ../../rollup/default.mjs",
51
+ "lint": "node ../../.github/bin/format-package-json.mjs",
52
+ "prepublishOnly": "npm run build && npm run test",
53
+ "stryker": "stryker run --logLevel error",
54
+ "test": "node ./test/test.mjs && node ./test/_import.mjs && node ./test/_require.cjs"
55
+ },
56
+ "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/css-color-parser#readme",
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "https://github.com/csstools/postcss-plugins.git",
60
+ "directory": "packages/css-color-parser"
61
+ },
62
+ "bugs": "https://github.com/csstools/postcss-plugins/issues",
63
+ "keywords": [
64
+ "color",
65
+ "css",
66
+ "parser"
67
+ ],
68
+ "volta": {
69
+ "extends": "../../package.json"
70
+ }
71
+ }