@csstools/css-calc 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 (63) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE.md +20 -0
  3. package/README.md +132 -0
  4. package/dist/calculation.d.ts +8 -0
  5. package/dist/functions/abs.d.ts +3 -0
  6. package/dist/functions/acos.d.ts +3 -0
  7. package/dist/functions/asin.d.ts +3 -0
  8. package/dist/functions/atan.d.ts +3 -0
  9. package/dist/functions/atan2.d.ts +3 -0
  10. package/dist/functions/calc.d.ts +29 -0
  11. package/dist/functions/clamp.d.ts +3 -0
  12. package/dist/functions/cos.d.ts +3 -0
  13. package/dist/functions/exp.d.ts +3 -0
  14. package/dist/functions/globals-and-constants.d.ts +3 -0
  15. package/dist/functions/hypot.d.ts +3 -0
  16. package/dist/functions/log.d.ts +3 -0
  17. package/dist/functions/max.d.ts +3 -0
  18. package/dist/functions/min.d.ts +3 -0
  19. package/dist/functions/mod.d.ts +3 -0
  20. package/dist/functions/pow.d.ts +3 -0
  21. package/dist/functions/rem.d.ts +3 -0
  22. package/dist/functions/result-to-calculation.d.ts +7 -0
  23. package/dist/functions/round.d.ts +3 -0
  24. package/dist/functions/sign.d.ts +3 -0
  25. package/dist/functions/sin.d.ts +3 -0
  26. package/dist/functions/sqrt.d.ts +3 -0
  27. package/dist/functions/tan.d.ts +3 -0
  28. package/dist/index.cjs +1 -0
  29. package/dist/index.d.ts +5 -0
  30. package/dist/index.mjs +1 -0
  31. package/dist/operation/addition.d.ts +2 -0
  32. package/dist/operation/division.d.ts +2 -0
  33. package/dist/operation/multiplication.d.ts +2 -0
  34. package/dist/operation/operation.d.ts +2 -0
  35. package/dist/operation/subtraction.d.ts +2 -0
  36. package/dist/operation/unary.d.ts +2 -0
  37. package/dist/options.d.ts +23 -0
  38. package/dist/unit-conversions/canonical.d.ts +1 -0
  39. package/dist/unit-conversions/cm.d.ts +1 -0
  40. package/dist/unit-conversions/deg.d.ts +1 -0
  41. package/dist/unit-conversions/grad.d.ts +1 -0
  42. package/dist/unit-conversions/hz.d.ts +1 -0
  43. package/dist/unit-conversions/in.d.ts +1 -0
  44. package/dist/unit-conversions/index.d.ts +4 -0
  45. package/dist/unit-conversions/khz.d.ts +1 -0
  46. package/dist/unit-conversions/mm.d.ts +1 -0
  47. package/dist/unit-conversions/ms.d.ts +1 -0
  48. package/dist/unit-conversions/pc.d.ts +1 -0
  49. package/dist/unit-conversions/pt.d.ts +1 -0
  50. package/dist/unit-conversions/px.d.ts +1 -0
  51. package/dist/unit-conversions/q.d.ts +1 -0
  52. package/dist/unit-conversions/rad.d.ts +1 -0
  53. package/dist/unit-conversions/s.d.ts +1 -0
  54. package/dist/unit-conversions/turn.d.ts +1 -0
  55. package/dist/util/canonical-unit.d.ts +2 -0
  56. package/dist/util/globals.d.ts +4 -0
  57. package/dist/util/infinity.d.ts +2 -0
  58. package/dist/util/kind-of-number.d.ts +5 -0
  59. package/dist/util/minus-zero.d.ts +2 -0
  60. package/dist/util/nan.d.ts +2 -0
  61. package/dist/util/patch-result.d.ts +3 -0
  62. package/dist/util/precision.d.ts +2 -0
  63. package/package.json +72 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changes to CSS Calc
2
+
3
+ ### 1.0.0 (February 21, 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,132 @@
1
+ # CSS Calc
2
+
3
+ [<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/css-calc.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
+ Implemented from : https://drafts.csswg.org/css-values-4/ on 2023-02-17
8
+
9
+ ## Usage
10
+
11
+ Add [CSS calc] to your project:
12
+
13
+ ```bash
14
+ npm install postcss @csstools/css-calc @csstools/css-parser-algorithms @csstools/css-tokenizer --save-dev
15
+ ```
16
+
17
+ ### With string values :
18
+
19
+ ```mjs
20
+ import { calc } from '@csstools/css-calc';
21
+
22
+ // '20'
23
+ console.log(calc('calc(10 * 2)'));
24
+ ```
25
+
26
+ ### With component values :
27
+
28
+ ```mjs
29
+ import { stringify, tokenizer } from '@csstools/css-tokenizer';
30
+ import { parseCommaSeparatedListOfComponentValues } from '@csstools/css-parser-algorithms';
31
+ import { calcFromComponentValues } from '@csstools/css-calc';
32
+
33
+ const t = tokenizer({
34
+ css: 'calc(10 * 2),
35
+ });
36
+
37
+ const tokens = [];
38
+
39
+ {
40
+ while (!t.endOfFile()) {
41
+ tokens.push(t.nextToken());
42
+ }
43
+
44
+ tokens.push(t.nextToken()); // EOF-token
45
+ }
46
+
47
+ const result = parseCommaSeparatedListOfComponentValues(tokens, {});
48
+
49
+ // filter or mutate the component values
50
+
51
+ const calcResult = calcFromComponentValues(result, { precision: 5, toCanonicalUnits: true });
52
+
53
+ // filter or mutate the component values even further
54
+
55
+ const calcResultStr = calcResult.map((componentValues) => {
56
+ return componentValues.map((x) => stringify(...x.tokens())).join('');
57
+ }).join(',');
58
+
59
+ // '20'
60
+ console.log(calcResultStr);
61
+ ```
62
+
63
+ ### Options
64
+
65
+ #### `precision` :
66
+
67
+ The default precision is fairly high.
68
+ It aims to be high enough to make rounding unnoticeable in the browser.
69
+
70
+ You can set it to a lower number to suit your needs.
71
+
72
+ ```mjs
73
+ import { calc } from '@csstools/css-calc';
74
+
75
+ // '0.3'
76
+ console.log(calc('calc(1 / 3)', { precision: 1 }));
77
+ // '0.33'
78
+ console.log(calc('calc(1 / 3)', { precision: 2 }));
79
+ ```
80
+
81
+ #### `globals` :
82
+
83
+ Pass global values as a map of key value pairs.
84
+
85
+ > Example : Relative color syntax (`lch(from pink calc(l / 2) c h)`) exposes color chanel information as ident tokens.
86
+ > By passing globals for `l`, `c` and `h` it is possible to solve nested `calc()`'s.
87
+
88
+ ```mjs
89
+ import { calc } from '@csstools/css-calc';
90
+
91
+ const globals = new Map([
92
+ ['a', '10px'],
93
+ ['b', '2rem'],
94
+ ]);
95
+
96
+ // '20px'
97
+ console.log(calc('calc(a * 2)', { globals: globals }));
98
+ // '6rem'
99
+ console.log(calc('calc(b * 3)', { globals: globals }));
100
+ ```
101
+
102
+ #### `toCanonicalUnits` :
103
+
104
+ By default this package will try to preserve units.
105
+ The heuristic to do this is very simplistic.
106
+ We take the first unit we encounter and try to convert other dimensions to that unit.
107
+
108
+ This better matches what users expect from a CSS dev tool.
109
+
110
+ If you want to have outputs that are closes to CSS serialized values you can pass `toCanonicalUnits: true`.
111
+
112
+ ```mjs
113
+ import { calc } from '@csstools/css-calc';
114
+
115
+ // '20hz'
116
+ console.log(calc('calc(0.01khz + 10hz)', { toCanonicalUnits: true }));
117
+
118
+ // '20hz'
119
+ console.log(calc('calc(10hz + 0.01khz)', { toCanonicalUnits: true }));
120
+
121
+ // '0.02khz' !!!
122
+ console.log(calc('calc(0.01khz + 10hz)', { toCanonicalUnits: false }));
123
+
124
+ // '20hz'
125
+ console.log(calc('calc(10hz + 0.01khz)', { toCanonicalUnits: false }));
126
+ ```
127
+
128
+ [cli-url]: https://github.com/csstools/postcss-plugins/actions/workflows/test.yml?query=workflow/test
129
+ [discord]: https://discord.gg/bUadyRwkJS
130
+ [npm-url]: https://www.npmjs.com/package/@csstools/css-calc
131
+
132
+ [CSS calc]: https://github.com/csstools/postcss-plugins/tree/main/packages/css-calc
@@ -0,0 +1,8 @@
1
+ import type { Operation } from './operation/operation';
2
+ import type { TokenNode } from '@csstools/css-parser-algorithms';
3
+ export type Calculation = {
4
+ inputs: Array<Calculation | TokenNode>;
5
+ operation: Operation;
6
+ };
7
+ export declare function isCalculation(x: unknown): x is Calculation;
8
+ export declare function solve(calculation: Calculation | -1): TokenNode | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveAbs(absNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveACos(acosNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveASin(asinNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveATan(atanNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveATan2(atan2Node: FunctionNode, a: TokenNode, b: TokenNode): Calculation | -1;
@@ -0,0 +1,29 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { ComponentValue, SimpleBlockNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ import type { Globals } from '../util/globals';
4
+ import { FunctionNode } from '@csstools/css-parser-algorithms';
5
+ export declare const mathFunctions: Map<string, typeof abs>;
6
+ export declare function calc(calcNode: FunctionNode | SimpleBlockNode, globals: Globals): Calculation | -1;
7
+ export declare function singleNodeSolver(fnNode: FunctionNode, globals: Globals, solveFn: (node: FunctionNode, a: TokenNode) => Calculation | -1): Calculation | -1;
8
+ export declare function twoCommaSeparatedNodesSolver(fnNode: FunctionNode, globals: Globals, solveFn: (node: FunctionNode, a: TokenNode, b: TokenNode) => Calculation | -1): Calculation | -1;
9
+ export declare function variadicNodesSolver(fnNode: FunctionNode, globals: Globals, solveFn: (node: FunctionNode, x: Array<ComponentValue>) => Calculation | -1): Calculation | -1;
10
+ export declare function clamp(clampNode: FunctionNode, globals: Globals): Calculation | -1;
11
+ export declare function max(maxNode: FunctionNode, globals: Globals): Calculation | -1;
12
+ export declare function min(minNode: FunctionNode, globals: Globals): Calculation | -1;
13
+ export declare function round(roundNode: FunctionNode, globals: Globals): Calculation | -1;
14
+ export declare function mod(modNode: FunctionNode, globals: Globals): Calculation | -1;
15
+ export declare function rem(remNode: FunctionNode, globals: Globals): Calculation | -1;
16
+ export declare function abs(absNode: FunctionNode, globals: Globals): Calculation | -1;
17
+ export declare function sign(signNode: FunctionNode, globals: Globals): Calculation | -1;
18
+ export declare function sin(sinNode: FunctionNode, globals: Globals): Calculation | -1;
19
+ export declare function cos(codNode: FunctionNode, globals: Globals): Calculation | -1;
20
+ export declare function tan(tanNode: FunctionNode, globals: Globals): Calculation | -1;
21
+ export declare function asin(asinNode: FunctionNode, globals: Globals): Calculation | -1;
22
+ export declare function acos(acosNode: FunctionNode, globals: Globals): Calculation | -1;
23
+ export declare function atan(atanNode: FunctionNode, globals: Globals): Calculation | -1;
24
+ export declare function atan2(atan2Node: FunctionNode, globals: Globals): Calculation | -1;
25
+ export declare function exp(expNode: FunctionNode, globals: Globals): Calculation | -1;
26
+ export declare function sqrt(sqrtNode: FunctionNode, globals: Globals): Calculation | -1;
27
+ export declare function pow(powNode: FunctionNode, globals: Globals): Calculation | -1;
28
+ export declare function hypot(hypotNode: FunctionNode, globals: Globals): Calculation | -1;
29
+ export declare function log(logNode: FunctionNode, globals: Globals): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveClamp(clampNode: FunctionNode, minimum: TokenNode | -1, central: TokenNode | -1, maximum: TokenNode | -1): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveCos(cosNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveExp(expNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import { ComponentValue } from '@csstools/css-parser-algorithms';
2
+ import { Globals } from '../util/globals';
3
+ export declare function resolveGlobalsAndConstants(nodes: Array<ComponentValue>, globals: Globals): Array<ComponentValue>;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { ComponentValue, FunctionNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveHypot(hypotNode: FunctionNode, solvedNodes: Array<ComponentValue>): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { ComponentValue, FunctionNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveLog(logNode: FunctionNode, solvedNodes: Array<ComponentValue>): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { ComponentValue, FunctionNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveMax(maxNode: FunctionNode, solvedNodes: Array<ComponentValue>): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { ComponentValue, FunctionNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveMin(minNode: FunctionNode, solvedNodes: Array<ComponentValue>): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveMod(modNode: FunctionNode, a: TokenNode, b: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solvePow(powNode: FunctionNode, a: TokenNode, b: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveRem(remNode: FunctionNode, a: TokenNode, b: TokenNode): Calculation | -1;
@@ -0,0 +1,7 @@
1
+ import { CSSToken } from '@csstools/css-tokenizer';
2
+ import { FunctionNode } from '@csstools/css-parser-algorithms';
3
+ import { Calculation } from '../calculation';
4
+ export declare function resultToCalculation(node: FunctionNode, aToken: CSSToken, result: number): Calculation | -1;
5
+ export declare function dimensionToCalculation(node: FunctionNode, unit: string, result: number): Calculation | -1;
6
+ export declare function percentageToCalculation(node: FunctionNode, result: number): Calculation | -1;
7
+ export declare function numberToCalculation(node: FunctionNode, result: number): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveRound(roundNode: FunctionNode, roundingStrategy: string, a: TokenNode, b: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveSign(signNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveSin(sinNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveSqrt(sqrtNode: FunctionNode, a: TokenNode): Calculation | -1;
@@ -0,0 +1,3 @@
1
+ import type { Calculation } from '../calculation';
2
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
3
+ export declare function solveTan(tanNode: FunctionNode, a: TokenNode): Calculation | -1;
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";var e=require("@csstools/css-tokenizer"),n=require("@csstools/css-parser-algorithms");function isCalculation(e){return!!e&&"object"==typeof e&&"inputs"in e&&Array.isArray(e.inputs)&&"operation"in e}function solve(e){if(-1===e)return-1;const o=[];for(let t=0;t<e.inputs.length;t++){const u=e.inputs[t];if(n.isTokenNode(u)){o.push(u);continue}const r=solve(u);if(-1===r)return-1;o.push(r)}return e.operation(o)}const o={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"},t=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]]),u=new Map([["deg",e=>e],["grad",e=>e/.9],["rad",e=>e/180*Math.PI],["turn",e=>e/360]]),r=new Map([["deg",e=>.9*e],["grad",e=>e],["rad",e=>.9*e/180*Math.PI],["turn",e=>.9*e/360]]),i=new Map([["hz",e=>e],["khz",e=>e/1e3]]),a=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]]),l=new Map([["hz",e=>1e3*e],["khz",e=>e]]),s=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]]),c=new Map([["ms",e=>e],["s",e=>e/1e3]]),T=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]]),p=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]]),v=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]]),m=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]]),N=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]]),f=new Map([["ms",e=>1e3*e],["s",e=>e]]),y=new Map([["deg",e=>360*e],["grad",e=>360*e/.9],["rad",e=>360*e/180*Math.PI],["turn",e=>e]]),k=new Map([["cm",t],["mm",s],["q",m],["in",a],["pc",T],["pt",p],["px",v],["ms",c],["s",f],["deg",u],["grad",r],["rad",N],["turn",y],["hz",i],["khz",l]]);function convertUnit(n,o){if(n[0]!==e.TokenType.Dimension)return o;if(o[0]!==e.TokenType.Dimension)return o;const t=n[4].unit.toLowerCase(),u=o[4].unit.toLowerCase();if(t===u)return o;const r=k.get(u);if(!r)return o;const i=r.get(t);if(!i)return o;const a=i(o[4].value);return[e.TokenType.Dimension,a.toString()+n[4].unit,o[2],o[3],{value:a,unit:n[4].unit,type:Number.isInteger(a)?e.NumberType.Integer:e.NumberType.Number}]}function toCanonicalUnit(n){if(n[0]!==e.TokenType.Dimension)return n;const t=n[4].unit.toLowerCase(),u=o[t];if(t===u)return n;const r=k.get(t);if(!r)return n;const i=r.get(u);if(!i)return n;const a=i(n[4].value);return[e.TokenType.Dimension,a.toString()+u,n[2],n[3],{value:a,unit:u,type:Number.isInteger(a)?e.NumberType.Integer:e.NumberType.Number}]}function addition(o){if(2!==o.length)return-1;const t=o[0].value;let u=o[1].value;if(t[0]===e.TokenType.Number&&u[0]===e.TokenType.Number){const o=t[4].value+u[4].value;return new n.TokenNode([e.TokenType.Number,o.toString(),t[2],u[3],{value:o,type:t[4].type===e.NumberType.Integer&&u[4].type===e.NumberType.Integer?e.NumberType.Integer:e.NumberType.Number}])}if(t[0]===e.TokenType.Percentage&&u[0]===e.TokenType.Percentage){const o=t[4].value+u[4].value;return new n.TokenNode([e.TokenType.Percentage,o.toString()+"%",t[2],u[3],{value:o}])}if(t[0]===e.TokenType.Dimension&&u[0]===e.TokenType.Dimension&&(u=convertUnit(t,u),t[4].unit.toLowerCase()===u[4].unit.toLowerCase())){const o=t[4].value+u[4].value;return new n.TokenNode([e.TokenType.Dimension,o.toString()+t[4].unit,t[2],u[3],{value:o,type:t[4].type===e.NumberType.Integer&&u[4].type===e.NumberType.Integer?e.NumberType.Integer:e.NumberType.Number,unit:t[4].unit}])}return-1}function division(o){if(2!==o.length)return-1;const t=o[0].value,u=o[1].value;if(t[0]===e.TokenType.Number&&u[0]===e.TokenType.Number){const o=t[4].value/u[4].value;return new n.TokenNode([e.TokenType.Number,o.toString(),t[2],u[3],{value:o,type:Number.isInteger(o)?e.NumberType.Integer:e.NumberType.Number}])}if(t[0]===e.TokenType.Percentage&&u[0]===e.TokenType.Number){const o=t[4].value/u[4].value;return new n.TokenNode([e.TokenType.Percentage,o.toString()+"%",t[2],u[3],{value:o}])}if(t[0]===e.TokenType.Dimension&&u[0]===e.TokenType.Number){const o=t[4].value/u[4].value;return new n.TokenNode([e.TokenType.Dimension,o.toString()+t[4].unit,t[2],u[3],{value:o,type:Number.isInteger(o)?e.NumberType.Integer:e.NumberType.Number,unit:t[4].unit}])}return-1}function multiplication(o){if(2!==o.length)return-1;const t=o[0].value,u=o[1].value;if(t[0]===e.TokenType.Number&&u[0]===e.TokenType.Number){const o=t[4].value*u[4].value;return new n.TokenNode([e.TokenType.Number,o.toString(),t[2],u[3],{value:o,type:t[4].type===e.NumberType.Integer&&u[4].type===e.NumberType.Integer?e.NumberType.Integer:e.NumberType.Number}])}if(t[0]===e.TokenType.Percentage&&u[0]===e.TokenType.Number){const o=t[4].value*u[4].value;return new n.TokenNode([e.TokenType.Percentage,o.toString()+"%",t[2],u[3],{value:o}])}if(t[0]===e.TokenType.Number&&u[0]===e.TokenType.Percentage){const o=t[4].value*u[4].value;return new n.TokenNode([e.TokenType.Percentage,o.toString()+"%",t[2],u[3],{value:o}])}if(t[0]===e.TokenType.Dimension&&u[0]===e.TokenType.Number){const o=t[4].value*u[4].value;return new n.TokenNode([e.TokenType.Dimension,o.toString()+t[4].unit,t[2],u[3],{value:o,type:t[4].type===e.NumberType.Integer&&u[4].type===e.NumberType.Integer?e.NumberType.Integer:e.NumberType.Number,unit:t[4].unit}])}if(t[0]===e.TokenType.Number&&u[0]===e.TokenType.Dimension){const o=t[4].value*u[4].value;return new n.TokenNode([e.TokenType.Dimension,o.toString()+u[4].unit,t[2],u[3],{value:o,type:t[4].type===e.NumberType.Integer&&u[4].type===e.NumberType.Integer?e.NumberType.Integer:e.NumberType.Number,unit:u[4].unit}])}return-1}function resolveGlobalsAndConstants(o,t){for(let u=0;u<o.length;u++){const r=o[u];if(!n.isTokenNode(r))continue;const i=r.value;if(i[0]!==e.TokenType.Ident)continue;const a=i[4].value.toLowerCase();switch(a){case"e":o.splice(u,1,new n.TokenNode([e.TokenType.Number,Math.E.toString(),i[2],i[3],{value:Math.E,type:e.NumberType.Number}]));break;case"pi":o.splice(u,1,new n.TokenNode([e.TokenType.Number,Math.PI.toString(),i[2],i[3],{value:Math.PI,type:e.NumberType.Number}]));break;case"infinity":o.splice(u,1,new n.TokenNode([e.TokenType.Number,"infinity",i[2],i[3],{value:1/0,type:e.NumberType.Number}]));break;case"-infinity":o.splice(u,1,new n.TokenNode([e.TokenType.Number,"-infinity",i[2],i[3],{value:-1/0,type:e.NumberType.Number}]));break;case"nan":o.splice(u,1,new n.TokenNode([e.TokenType.Number,"NaN",i[2],i[3],{value:Number.NaN,type:e.NumberType.Number}]));break;default:if(t.has(a)){const e=t.get(a);o.splice(u,1,new n.TokenNode(e))}}}return o}function isNumeric(n){return n[0]===e.TokenType.Dimension||(n[0]===e.TokenType.Percentage||n[0]===e.TokenType.Number)}function isDimensionOrNumber(n){return n[0]===e.TokenType.Dimension||n[0]===e.TokenType.Number}function arrayOfSameNumeric(n){if(0===n.length)return!0;const o=n[0];if(!isNumeric(o))return!1;if(1===n.length)return!0;if(o[0]===e.TokenType.Dimension){const e=o[4].unit.toLowerCase();for(let t=1;t<n.length;t++){const u=n[t];if(o[0]!==u[0])return!1;if(e!==u[4].unit.toLowerCase())return!1}return!0}for(let e=1;e<n.length;e++){const t=n[e];if(o[0]!==t[0])return!1}return!0}function twoOfSameNumeric(n,o){return!!isNumeric(n)&&(n[0]===e.TokenType.Dimension?n[0]===o[0]&&n[4].unit.toLowerCase()===o[4].unit.toLowerCase():n[0]===o[0])}function unary(e){if(1!==e.length)return-1;return isNumeric(e[0].value)?e[0]:-1}function resultToCalculation(n,o,t){return o[0]===e.TokenType.Dimension?dimensionToCalculation(n,o[4].unit,t):o[0]===e.TokenType.Percentage?percentageToCalculation(n,t):o[0]===e.TokenType.Number?numberToCalculation(n,t):-1}function dimensionToCalculation(o,t,u){const r=o.tokens();return{inputs:[new n.TokenNode([e.TokenType.Dimension,u.toString()+t,r[0][2],r[r.length-1][3],{value:u,type:Number.isInteger(u)?e.NumberType.Integer:e.NumberType.Number,unit:t}])],operation:unary}}function percentageToCalculation(o,t){const u=o.tokens();return{inputs:[new n.TokenNode([e.TokenType.Percentage,t.toString()+"%",u[0][2],u[u.length-1][3],{value:t}])],operation:unary}}function numberToCalculation(o,t){const u=o.tokens();return{inputs:[new n.TokenNode([e.TokenType.Number,t.toString(),u[0][2],u[u.length-1][3],{value:t,type:Number.isInteger(t)?e.NumberType.Integer:e.NumberType.Number}])],operation:unary}}function solveACos(n,o){const t=o.value;if(t[0]!==e.TokenType.Number)return-1;return dimensionToCalculation(n,"rad",Math.acos(t[4].value))}function solveASin(n,o){const t=o.value;if(t[0]!==e.TokenType.Number)return-1;return dimensionToCalculation(n,"rad",Math.asin(t[4].value))}function solveATan(n,o){const t=o.value;if(t[0]!==e.TokenType.Number)return-1;return dimensionToCalculation(n,"rad",Math.atan(t[4].value))}function solveATan2(e,n,o){const t=n.value;if(!isDimensionOrNumber(t))return-1;const u=convertUnit(t,o.value);if(!twoOfSameNumeric(t,u))return-1;return dimensionToCalculation(e,"rad",Math.atan2(t[4].value,u[4].value))}function solveAbs(e,n){const o=n.value;if(!isDimensionOrNumber(o))return-1;return resultToCalculation(e,o,Math.abs(o[4].value))}function solveClamp(e,o,t,u){if(!n.isTokenNode(o)||!n.isTokenNode(t)||!n.isTokenNode(u))return-1;const r=o.value;if(!isNumeric(r))return-1;const i=convertUnit(r,t.value);if(!twoOfSameNumeric(r,i))return-1;const a=convertUnit(r,u.value);if(!twoOfSameNumeric(r,a))return-1;return resultToCalculation(e,r,Math.max(r[4].value,Math.min(i[4].value,a[4].value)))}function solveCos(n,o){const t=o.value;if(!isDimensionOrNumber(t))return-1;if(t[0]===e.TokenType.Dimension)switch(t[4].unit.toLowerCase()){case"rad":break;case"deg":t[4].value=u.get("rad")(t[4].value);break;case"grad":t[4].value=r.get("rad")(t[4].value);break;case"turn":t[4].value=y.get("rad")(t[4].value);break;default:return-1}return numberToCalculation(n,Math.cos(t[4].value))}function solveExp(n,o){const t=o.value;if(t[0]!==e.TokenType.Number)return-1;return numberToCalculation(n,Math.exp(t[4].value))}function solveHypot(e,o){const t=o[0];if(!t||!n.isTokenNode(t))return-1;if(1!==new Set(o.map((e=>e.type))).size)return-1;const u=t.value;if(!isNumeric(u))return-1;const r=o.map((e=>convertUnit(u,e.value)));if(!arrayOfSameNumeric(r))return-1;const i=r.map((e=>e[4].value)),a=Math.hypot(...i);return resultToCalculation(e,u,a)}function solveMax(e,o){const t=o[0];if(!t||!n.isTokenNode(t))return-1;if(1!==new Set(o.map((e=>e.type))).size)return-1;const u=t.value;if(!isNumeric(u))return-1;const r=o.map((e=>convertUnit(u,e.value)));if(!arrayOfSameNumeric(r))return-1;const i=r.map((e=>e[4].value)),a=Math.max(...i);return resultToCalculation(e,u,a)}function solveMin(e,o){const t=o[0];if(!t||!n.isTokenNode(t))return-1;if(1!==new Set(o.map((e=>e.type))).size)return-1;const u=t.value;if(!isNumeric(u))return-1;const r=o.map((e=>convertUnit(u,e.value)));if(!arrayOfSameNumeric(r))return-1;const i=r.map((e=>e[4].value)),a=Math.min(...i);return resultToCalculation(e,u,a)}function solveMod(e,n,o){const t=n.value;if(!isNumeric(t))return-1;const u=convertUnit(t,o.value);if(!twoOfSameNumeric(t,u))return-1;let r;return r=0===u[4].value?Number.NaN:Number.isFinite(t[4].value)&&(Number.isFinite(u[4].value)||(u[4].value!==Number.POSITIVE_INFINITY||t[4].value!==Number.NEGATIVE_INFINITY&&!Object.is(0*t[4].value,-0))&&(u[4].value!==Number.NEGATIVE_INFINITY||t[4].value!==Number.POSITIVE_INFINITY&&!Object.is(0*t[4].value,0)))?Number.isFinite(u[4].value)?(t[4].value%u[4].value+u[4].value)%u[4].value:t[4].value:Number.NaN,resultToCalculation(e,t,r)}function solvePow(n,o,t){const u=o.value,r=t.value;if(u[0]!==e.TokenType.Number)return-1;if(!twoOfSameNumeric(u,r))return-1;return numberToCalculation(n,Math.pow(u[4].value,r[4].value))}function solveRem(e,n,o){const t=n.value;if(!isNumeric(t))return-1;const u=convertUnit(t,o.value);if(!twoOfSameNumeric(t,u))return-1;let r;return r=0===u[4].value?Number.NaN:Number.isFinite(t[4].value)?Number.isFinite(u[4].value)?t[4].value%u[4].value:t[4].value:Number.NaN,resultToCalculation(e,t,r)}function solveRound(e,n,o,t){const u=o.value;if(!isNumeric(u))return-1;const r=convertUnit(u,t.value);if(!twoOfSameNumeric(u,r))return-1;let i;if(0===r[4].value)i=Number.NaN;else if(Number.isFinite(u[4].value)||Number.isFinite(r[4].value))if(!Number.isFinite(u[4].value)&&Number.isFinite(r[4].value))i=u[4].value;else if(Number.isFinite(u[4].value)&&!Number.isFinite(r[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(r[4].value))switch(n){case"down":i=Math.floor(u[4].value/r[4].value)*r[4].value;break;case"up":i=Math.ceil(u[4].value/r[4].value)*r[4].value;break;case"to-zero":i=Math.trunc(u[4].value/r[4].value)*r[4].value;break;default:{let e=Math.floor(u[4].value/r[4].value)*r[4].value,n=Math.ceil(u[4].value/r[4].value)*r[4].value;if(e>n){const o=e;e=n,n=o}const o=Math.abs(u[4].value-e),t=Math.abs(u[4].value-n);i=o===t?n:o<t?e:n;break}}else i=u[4].value;else i=Number.NaN;return resultToCalculation(e,u,i)}function solveSign(e,n){const o=n.value;if(!isDimensionOrNumber(o))return-1;return numberToCalculation(e,Math.sign(o[4].value))}function solveSin(n,o){const t=o.value;if(!isDimensionOrNumber(t))return-1;if(t[0]===e.TokenType.Dimension)switch(t[4].unit.toLowerCase()){case"rad":break;case"deg":t[4].value=u.get("rad")(t[4].value);break;case"grad":t[4].value=r.get("rad")(t[4].value);break;case"turn":t[4].value=y.get("rad")(t[4].value);break;default:return-1}return numberToCalculation(n,Math.sin(t[4].value))}function solveSqrt(n,o){const t=o.value;if(t[0]!==e.TokenType.Number)return-1;return numberToCalculation(n,Math.sqrt(t[4].value))}function solveTan(n,o){const t=o.value;if(!isDimensionOrNumber(t))return-1;const i=t[4].value;let a=0;if(t[0]===e.TokenType.Dimension)switch(t[4].unit.toLowerCase()){case"rad":a=N.get("deg")(i);break;case"deg":a=i,t[4].value=u.get("rad")(i);break;case"grad":a=r.get("deg")(i),t[4].value=r.get("rad")(i);break;case"turn":a=y.get("deg")(i),t[4].value=y.get("rad")(i);break;default:return-1}const l=a/90;let s;return s=a%90==0&&l%2!=0?l>0?1/0:-1/0:Math.tan(t[4].value),numberToCalculation(n,s)}function subtraction(o){if(2!==o.length)return-1;const t=o[0].value;let u=o[1].value;if(t[0]===e.TokenType.Number&&u[0]===e.TokenType.Number){const o=t[4].value-u[4].value;return new n.TokenNode([e.TokenType.Number,o.toString(),t[2],u[3],{value:o,type:t[4].type===e.NumberType.Integer&&u[4].type===e.NumberType.Integer?e.NumberType.Integer:e.NumberType.Number}])}if(t[0]===e.TokenType.Percentage&&u[0]===e.TokenType.Percentage){const o=t[4].value-u[4].value;return new n.TokenNode([e.TokenType.Percentage,o.toString()+"%",t[2],u[3],{value:o}])}if(t[0]===e.TokenType.Dimension&&u[0]===e.TokenType.Dimension&&(u=convertUnit(t,u),t[4].unit.toLowerCase()===u[4].unit.toLowerCase())){const o=t[4].value-u[4].value;return new n.TokenNode([e.TokenType.Dimension,o.toString()+t[4].unit,t[2],u[3],{value:o,type:t[4].type===e.NumberType.Integer&&u[4].type===e.NumberType.Integer?e.NumberType.Integer:e.NumberType.Number,unit:t[4].unit}])}return-1}function solveLog(o,t){if(1===t.length){const u=t[0];if(!u||!n.isTokenNode(u))return-1;const r=u.value;if(r[0]!==e.TokenType.Number)return-1;return numberToCalculation(o,Math.log(r[4].value))}if(2===t.length){const u=t[0];if(!u||!n.isTokenNode(u))return-1;const r=u.value;if(r[0]!==e.TokenType.Number)return-1;const i=t[1];if(!i||!n.isTokenNode(i))return-1;const a=i.value;if(a[0]!==e.TokenType.Number)return-1;return numberToCalculation(o,Math.log(r[4].value)/Math.log(a[4].value))}return-1}const d=new Map([["abs",function abs(e,n){return singleNodeSolver(e,n,solveAbs)}],["acos",function acos(e,n){return singleNodeSolver(e,n,solveACos)}],["asin",function asin(e,n){return singleNodeSolver(e,n,solveASin)}],["atan",function atan(e,n){return singleNodeSolver(e,n,solveATan)}],["atan2",function atan2(e,n){return twoCommaSeparatedNodesSolver(e,n,solveATan2)}],["calc",calc$1],["clamp",function clamp(o,t){const u=resolveGlobalsAndConstants([...o.value.filter((e=>!n.isCommentNode(e)&&!n.isWhitespaceNode(e)))],t),r=[],i=[],a=[];{let o=r;for(let t=0;t<u.length;t++){const l=u[t];if(n.isTokenNode(l)&&l.value[0]===e.TokenType.Comma){if(o===a)return-1;if(o===i){o=a;continue}if(o===r){o=i;continue}return-1}o.push(l)}}const l=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],r),t));if(-1===l)return-1;const s=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],i),t));if(-1===s)return-1;const c=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],a),t));if(-1===c)return-1;return solveClamp(o,l,s,c)}],["cos",function cos(e,n){return singleNodeSolver(e,n,solveCos)}],["exp",function exp(e,n){return singleNodeSolver(e,n,solveExp)}],["hypot",function hypot(e,n){return variadicNodesSolver(e,n,solveHypot)}],["log",function log(e,n){return variadicNodesSolver(e,n,solveLog)}],["max",function max(e,n){return variadicNodesSolver(e,n,solveMax)}],["min",function min(e,n){return variadicNodesSolver(e,n,solveMin)}],["mod",function mod(e,n){return twoCommaSeparatedNodesSolver(e,n,solveMod)}],["pow",function pow(e,n){return twoCommaSeparatedNodesSolver(e,n,solvePow)}],["rem",function rem(e,n){return twoCommaSeparatedNodesSolver(e,n,solveRem)}],["round",function round(o,t){const u=resolveGlobalsAndConstants([...o.value.filter((e=>!n.isCommentNode(e)&&!n.isWhitespaceNode(e)))],t);let r="";const i=[],a=[];{let o=i;for(let t=0;t<u.length;t++){const l=u[t];if(!r&&0===i.length&&0===a.length&&n.isTokenNode(l)&&l.value[0]===e.TokenType.Ident){const e=l.value;if(b.has(e[4].value.toLowerCase())){r=e[4].value.toLowerCase();continue}}if(n.isTokenNode(l)&&l.value[0]===e.TokenType.Comma){if(o===a)return-1;if(o===i&&r&&0===i.length)continue;if(o===i){o=a;continue}return-1}o.push(l)}}const l=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],i),t));if(-1===l)return-1;const s=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],a),t));if(-1===s)return-1;r||(r="nearest");return solveRound(o,r,l,s)}],["sign",function sign(e,n){return singleNodeSolver(e,n,solveSign)}],["sin",function sin(e,n){return singleNodeSolver(e,n,solveSin)}],["sqrt",function sqrt(e,n){return singleNodeSolver(e,n,solveSqrt)}],["tan",function tan(e,n){return singleNodeSolver(e,n,solveTan)}]]);function calc$1(o,t){const u=resolveGlobalsAndConstants([...o.value.filter((e=>!n.isCommentNode(e)&&!n.isWhitespaceNode(e)))],t);if(1===u.length&&n.isTokenNode(u[0]))return{inputs:[u[0]],operation:unary};let r=0;for(;r<u.length;){const o=u[r];if(n.isSimpleBlockNode(o)&&o.startToken[0]===e.TokenType.OpenParen){const e=calc$1(o,t);if(-1===e)return-1;u.splice(r,1,e)}else if(n.isFunctionNode(o)){const e=d.get(o.getName().toLowerCase());if(!e)return-1;{const n=e(o,t);if(-1===n)return-1;u.splice(r,1,n)}}else r++}if(r=0,1===u.length&&isCalculation(u[0]))return u[0];for(;r<u.length;){const o=u[r];if(!o||!n.isTokenNode(o)&&!isCalculation(o)){r++;continue}const t=u[r+1];if(!t||!n.isTokenNode(t)){r++;continue}const i=t.value;if(i[0]!==e.TokenType.Delim||"*"!==i[4].value&&"/"!==i[4].value){r++;continue}const a=u[r+2];if(!a||!n.isTokenNode(a)&&!isCalculation(a))return-1;"*"!==i[4].value?"/"!==i[4].value?r++:u.splice(r,3,{inputs:[o,a],operation:division}):u.splice(r,3,{inputs:[o,a],operation:multiplication})}if(r=0,1===u.length&&isCalculation(u[0]))return u[0];for(;r<u.length;){const o=u[r];if(!o||!n.isTokenNode(o)&&!isCalculation(o)){r++;continue}const t=u[r+1];if(!t||!n.isTokenNode(t)){r++;continue}const i=t.value;if(i[0]!==e.TokenType.Delim||"+"!==i[4].value&&"-"!==i[4].value){r++;continue}const a=u[r+2];if(!a||!n.isTokenNode(a)&&!isCalculation(a))return-1;"+"!==i[4].value?"-"!==i[4].value?r++:u.splice(r,3,{inputs:[o,a],operation:subtraction}):u.splice(r,3,{inputs:[o,a],operation:addition})}return 1===u.length&&isCalculation(u[0])?u[0]:-1}function singleNodeSolver(o,t,u){const r=resolveGlobalsAndConstants([...o.value.filter((e=>!n.isCommentNode(e)&&!n.isWhitespaceNode(e)))],t),i=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],r),t));return-1===i?-1:u(o,i)}function twoCommaSeparatedNodesSolver(o,t,u){const r=resolveGlobalsAndConstants([...o.value.filter((e=>!n.isCommentNode(e)&&!n.isWhitespaceNode(e)))],t),i=[],a=[];{let o=i;for(let t=0;t<r.length;t++){const u=r[t];if(n.isTokenNode(u)&&u.value[0]===e.TokenType.Comma){if(o===a)return-1;if(o===i){o=a;continue}return-1}o.push(u)}}const l=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],i),t));if(-1===l)return-1;const s=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],a),t));return-1===s?-1:u(o,l,s)}function variadicNodesSolver(o,t,u){const r=resolveGlobalsAndConstants([...o.value.filter((e=>!n.isCommentNode(e)&&!n.isWhitespaceNode(e)))],t),i=[];{const o=[];let u=[];for(let t=0;t<r.length;t++){const i=r[t];n.isTokenNode(i)&&i.value[0]===e.TokenType.Comma?(o.push(u),u=[]):u.push(i)}o.push(u);for(let u=0;u<o.length;u++){if(0===o[u].length)return-1;const r=solve(calc$1(new n.FunctionNode([e.TokenType.Function,"calc(",-1,-1,{value:"calc"}],[e.TokenType.CloseParen,")",-1,-1,void 0],o[u]),t));if(-1===r)return-1;i.push(r)}}return u(o,i)}const b=new Set(["nearest","up","down","to-zero"]);function tokenizeGlobals(n){const o=new Map;if(!n)return o;for(const[t,u]of n)if(e.isToken(u))o.set(t,u);else if("string"!=typeof u);else{const n=e.tokenizer({css:u}),r=n.nextToken();if(n.nextToken(),!n.endOfFile())continue;if(!r)continue;if(r[0]!==e.TokenType.Number&&r[0]!==e.TokenType.Dimension&&r[0]!==e.TokenType.Percentage)continue;o.set(t,r)}return o}function patchNaN(o){if(-1===o)return-1;if(n.isFunctionNode(o))return o;const t=o.value;return t[0]!==e.TokenType.Number&&t[0]!==e.TokenType.Percentage&&t[0]!==e.TokenType.Dimension?o:Number.isNaN(t[4].value)?t[0]===e.TokenType.Number?new n.FunctionNode([e.TokenType.Function,"calc(",t[2],t[3],{value:"calc"}],[e.TokenType.CloseParen,")",t[2],t[3],void 0],[new n.TokenNode([e.TokenType.Ident,"NaN",t[2],t[3],{value:"NaN"}])]):t[0]===e.TokenType.Dimension?new n.FunctionNode([e.TokenType.Function,"calc(",t[2],t[3],{value:"calc"}],[e.TokenType.CloseParen,")",t[2],t[3],void 0],[new n.TokenNode([e.TokenType.Ident,"NaN",t[2],t[3],{value:"NaN"}]),new n.WhitespaceNode([[e.TokenType.Whitespace," ",t[2],t[3],void 0]]),new n.TokenNode([e.TokenType.Delim,"*",t[2],t[3],{value:"*"}]),new n.WhitespaceNode([[e.TokenType.Whitespace," ",t[2],t[3],void 0]]),new n.TokenNode([e.TokenType.Dimension,"1"+t[4].unit,t[2],t[3],{value:1,type:e.NumberType.Integer,unit:t[4].unit}])]):t[0]===e.TokenType.Percentage?new n.FunctionNode([e.TokenType.Function,"calc(",t[2],t[3],{value:"calc"}],[e.TokenType.CloseParen,")",t[2],t[3],void 0],[new n.TokenNode([e.TokenType.Ident,"NaN",t[2],t[3],{value:"NaN"}]),new n.WhitespaceNode([[e.TokenType.Whitespace," ",t[2],t[3],void 0]]),new n.TokenNode([e.TokenType.Delim,"*",t[2],t[3],{value:"*"}]),new n.WhitespaceNode([[e.TokenType.Whitespace," ",t[2],t[3],void 0]]),new n.TokenNode([e.TokenType.Percentage,"1%",t[2],t[3],{value:1}])]):-1:o}function patchInfinity(o){if(-1===o)return-1;if(n.isFunctionNode(o))return o;const t=o.value;if(t[0]!==e.TokenType.Number&&t[0]!==e.TokenType.Percentage&&t[0]!==e.TokenType.Dimension)return o;if(Number.isFinite(t[4].value))return o;let u="";return Number.NEGATIVE_INFINITY===t[4].value&&(u="-"),t[0]===e.TokenType.Number?new n.FunctionNode([e.TokenType.Function,"calc(",t[2],t[3],{value:"calc"}],[e.TokenType.CloseParen,")",t[2],t[3],void 0],[new n.TokenNode([e.TokenType.Ident,u+"infinity",t[2],t[3],{value:u+"infinity"}])]):t[0]===e.TokenType.Dimension?new n.FunctionNode([e.TokenType.Function,"calc(",t[2],t[3],{value:"calc"}],[e.TokenType.CloseParen,")",t[2],t[3],void 0],[new n.TokenNode([e.TokenType.Ident,u+"infinity",t[2],t[3],{value:u+"infinity"}]),new n.WhitespaceNode([[e.TokenType.Whitespace," ",t[2],t[3],void 0]]),new n.TokenNode([e.TokenType.Delim,"*",t[2],t[3],{value:"*"}]),new n.WhitespaceNode([[e.TokenType.Whitespace," ",t[2],t[3],void 0]]),new n.TokenNode([e.TokenType.Dimension,"1"+t[4].unit,t[2],t[3],{value:1,type:e.NumberType.Integer,unit:t[4].unit}])]):t[0]===e.TokenType.Percentage?new n.FunctionNode([e.TokenType.Function,"calc(",t[2],t[3],{value:"calc"}],[e.TokenType.CloseParen,")",t[2],t[3],void 0],[new n.TokenNode([e.TokenType.Ident,u+"infinity",t[2],t[3],{value:u+"infinity"}]),new n.WhitespaceNode([[e.TokenType.Whitespace," ",t[2],t[3],void 0]]),new n.TokenNode([e.TokenType.Delim,"*",t[2],t[3],{value:"*"}]),new n.WhitespaceNode([[e.TokenType.Whitespace," ",t[2],t[3],void 0]]),new n.TokenNode([e.TokenType.Percentage,"1%",t[2],t[3],{value:1}])]):-1}function patchMinusZero(o){if(-1===o)return-1;if(n.isFunctionNode(o))return o;const t=o.value;return t[0]!==e.TokenType.Number&&t[0]!==e.TokenType.Percentage&&t[0]!==e.TokenType.Dimension?o:Object.is(-0,t[4].value)?("-0"===t[1]||(t[1]="-0"),o):o}function patchPrecision(o,t=13){if(-1===o)return-1;if(n.isFunctionNode(o))return o;const u=o.value;if(u[0]!==e.TokenType.Number&&u[0]!==e.TokenType.Percentage&&u[0]!==e.TokenType.Dimension)return o;if(Number.isInteger(u[4].value))return o;const r=Number(u[4].value.toFixed(t)).toString();return u[0]===e.TokenType.Number?u[1]=r:u[0]===e.TokenType.Percentage?u[1]=r+"%":u[0]===e.TokenType.Dimension&&(u[1]=r+u[4].unit),o}function patchCanonicalUnit(o){return-1===o?-1:(n.isFunctionNode(o)||o.value[0]!==e.TokenType.Dimension||(o.value=toCanonicalUnit(o.value)),o)}function patchCalcResult(e,n){let o=e;return o=patchNaN(e),o=patchInfinity(o),null!=n&&n.toCanonicalUnits&&(o=patchCanonicalUnit(o)),o=patchPrecision(o,null==n?void 0:n.precision),o=patchMinusZero(o),o}function calcFromComponentValues(e,o){const t=tokenizeGlobals(null==o?void 0:o.globals);for(let u=0;u<e.length;u++){const r=e[u];for(let e=0;e<r.length;e++){const u=r[e];if(n.isFunctionNode(u)){const n=d.get(u.getName().toLowerCase());if(n){const i=patchCalcResult(solve(n(u,t)),o);if(-1!==i){r.splice(e,1,i);continue}}}(n.isSimpleBlockNode(u)||n.isFunctionNode(u))&&u.walk(((e,u)=>{if("number"!=typeof u)return;const r=e.node;if(n.isFunctionNode(r)){const n=d.get(r.getName().toLowerCase());if(!n)return;const i=patchCalcResult(solve(n(r,t)),o);if(-1!==i)return void e.parent.value.splice(u,1,i)}}))}}return e}exports.calc=function calc(o,t){const u=e.tokenizer({css:o}),r=[];for(;!u.endOfFile();)r.push(u.nextToken());return r.push(u.nextToken()),calcFromComponentValues(n.parseCommaSeparatedListOfComponentValues(r,{}),t).map((n=>n.map((n=>e.stringify(...n.tokens()))).join(""))).join(",")},exports.calcFromComponentValues=calcFromComponentValues;
@@ -0,0 +1,5 @@
1
+ import { ComponentValue } from '@csstools/css-parser-algorithms';
2
+ import type { conversionOptions } from './options';
3
+ export type { conversionOptions } from './options';
4
+ export declare function calc(css: string, options?: conversionOptions): string;
5
+ export declare function calcFromComponentValues(componentValuesList: Array<Array<ComponentValue>>, options?: conversionOptions): ComponentValue[][];
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{TokenType as e,NumberType as n,isToken as t,tokenizer as r,stringify as u}from"@csstools/css-tokenizer";import{isTokenNode as i,TokenNode as a,isCommentNode as o,isWhitespaceNode as l,isSimpleBlockNode as c,isFunctionNode as s,FunctionNode as v,WhitespaceNode as m,parseCommaSeparatedListOfComponentValues as f}from"@csstools/css-parser-algorithms";function isCalculation(e){return!!e&&"object"==typeof e&&"inputs"in e&&Array.isArray(e.inputs)&&"operation"in e}function solve(e){if(-1===e)return-1;const n=[];for(let t=0;t<e.inputs.length;t++){const r=e.inputs[t];if(i(r)){n.push(r);continue}const u=solve(r);if(-1===u)return-1;n.push(u)}return e.operation(n)}const p={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"},N=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]]),g=new Map([["deg",e=>e],["grad",e=>e/.9],["rad",e=>e/180*Math.PI],["turn",e=>e/360]]),b=new Map([["deg",e=>.9*e],["grad",e=>e],["rad",e=>.9*e/180*Math.PI],["turn",e=>.9*e/360]]),d=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]]),h=new Map([["hz",e=>1e3*e],["khz",e=>e]]),C=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]]),I=new Map([["ms",e=>e],["s",e=>e/1e3]]),S=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]]),y=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]]),M=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]]),P=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]]),D=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]]),T=new Map([["ms",e=>1e3*e],["s",e=>e]]),k=new Map([["deg",e=>360*e],["grad",e=>360*e/.9],["rad",e=>360*e/180*Math.PI],["turn",e=>e]]),F=new Map([["cm",N],["mm",C],["q",P],["in",w],["pc",S],["pt",y],["px",M],["ms",I],["s",T],["deg",g],["grad",b],["rad",D],["turn",k],["hz",d],["khz",h]]);function convertUnit(t,r){if(t[0]!==e.Dimension)return r;if(r[0]!==e.Dimension)return r;const u=t[4].unit.toLowerCase(),i=r[4].unit.toLowerCase();if(u===i)return r;const a=F.get(i);if(!a)return r;const o=a.get(u);if(!o)return r;const l=o(r[4].value);return[e.Dimension,l.toString()+t[4].unit,r[2],r[3],{value:l,unit:t[4].unit,type:Number.isInteger(l)?n.Integer:n.Number}]}function toCanonicalUnit(t){if(t[0]!==e.Dimension)return t;const r=t[4].unit.toLowerCase(),u=p[r];if(r===u)return t;const i=F.get(r);if(!i)return t;const a=i.get(u);if(!a)return t;const o=a(t[4].value);return[e.Dimension,o.toString()+u,t[2],t[3],{value:o,unit:u,type:Number.isInteger(o)?n.Integer:n.Number}]}function addition(t){if(2!==t.length)return-1;const r=t[0].value;let u=t[1].value;if(r[0]===e.Number&&u[0]===e.Number){const t=r[4].value+u[4].value;return new a([e.Number,t.toString(),r[2],u[3],{value:t,type:r[4].type===n.Integer&&u[4].type===n.Integer?n.Integer:n.Number}])}if(r[0]===e.Percentage&&u[0]===e.Percentage){const n=r[4].value+u[4].value;return new a([e.Percentage,n.toString()+"%",r[2],u[3],{value:n}])}if(r[0]===e.Dimension&&u[0]===e.Dimension&&(u=convertUnit(r,u),r[4].unit.toLowerCase()===u[4].unit.toLowerCase())){const t=r[4].value+u[4].value;return new a([e.Dimension,t.toString()+r[4].unit,r[2],u[3],{value:t,type:r[4].type===n.Integer&&u[4].type===n.Integer?n.Integer:n.Number,unit:r[4].unit}])}return-1}function division(t){if(2!==t.length)return-1;const r=t[0].value,u=t[1].value;if(r[0]===e.Number&&u[0]===e.Number){const t=r[4].value/u[4].value;return new a([e.Number,t.toString(),r[2],u[3],{value:t,type:Number.isInteger(t)?n.Integer:n.Number}])}if(r[0]===e.Percentage&&u[0]===e.Number){const n=r[4].value/u[4].value;return new a([e.Percentage,n.toString()+"%",r[2],u[3],{value:n}])}if(r[0]===e.Dimension&&u[0]===e.Number){const t=r[4].value/u[4].value;return new a([e.Dimension,t.toString()+r[4].unit,r[2],u[3],{value:t,type:Number.isInteger(t)?n.Integer:n.Number,unit:r[4].unit}])}return-1}function multiplication(t){if(2!==t.length)return-1;const r=t[0].value,u=t[1].value;if(r[0]===e.Number&&u[0]===e.Number){const t=r[4].value*u[4].value;return new a([e.Number,t.toString(),r[2],u[3],{value:t,type:r[4].type===n.Integer&&u[4].type===n.Integer?n.Integer:n.Number}])}if(r[0]===e.Percentage&&u[0]===e.Number){const n=r[4].value*u[4].value;return new a([e.Percentage,n.toString()+"%",r[2],u[3],{value:n}])}if(r[0]===e.Number&&u[0]===e.Percentage){const n=r[4].value*u[4].value;return new a([e.Percentage,n.toString()+"%",r[2],u[3],{value:n}])}if(r[0]===e.Dimension&&u[0]===e.Number){const t=r[4].value*u[4].value;return new a([e.Dimension,t.toString()+r[4].unit,r[2],u[3],{value:t,type:r[4].type===n.Integer&&u[4].type===n.Integer?n.Integer:n.Number,unit:r[4].unit}])}if(r[0]===e.Number&&u[0]===e.Dimension){const t=r[4].value*u[4].value;return new a([e.Dimension,t.toString()+u[4].unit,r[2],u[3],{value:t,type:r[4].type===n.Integer&&u[4].type===n.Integer?n.Integer:n.Number,unit:u[4].unit}])}return-1}function resolveGlobalsAndConstants(t,r){for(let u=0;u<t.length;u++){const o=t[u];if(!i(o))continue;const l=o.value;if(l[0]!==e.Ident)continue;const c=l[4].value.toLowerCase();switch(c){case"e":t.splice(u,1,new a([e.Number,Math.E.toString(),l[2],l[3],{value:Math.E,type:n.Number}]));break;case"pi":t.splice(u,1,new a([e.Number,Math.PI.toString(),l[2],l[3],{value:Math.PI,type:n.Number}]));break;case"infinity":t.splice(u,1,new a([e.Number,"infinity",l[2],l[3],{value:1/0,type:n.Number}]));break;case"-infinity":t.splice(u,1,new a([e.Number,"-infinity",l[2],l[3],{value:-1/0,type:n.Number}]));break;case"nan":t.splice(u,1,new a([e.Number,"NaN",l[2],l[3],{value:Number.NaN,type:n.Number}]));break;default:if(r.has(c)){const e=r.get(c);t.splice(u,1,new a(e))}}}return t}function isNumeric(n){return n[0]===e.Dimension||(n[0]===e.Percentage||n[0]===e.Number)}function isDimensionOrNumber(n){return n[0]===e.Dimension||n[0]===e.Number}function arrayOfSameNumeric(n){if(0===n.length)return!0;const t=n[0];if(!isNumeric(t))return!1;if(1===n.length)return!0;if(t[0]===e.Dimension){const e=t[4].unit.toLowerCase();for(let r=1;r<n.length;r++){const u=n[r];if(t[0]!==u[0])return!1;if(e!==u[4].unit.toLowerCase())return!1}return!0}for(let e=1;e<n.length;e++){const r=n[e];if(t[0]!==r[0])return!1}return!0}function twoOfSameNumeric(n,t){return!!isNumeric(n)&&(n[0]===e.Dimension?n[0]===t[0]&&n[4].unit.toLowerCase()===t[4].unit.toLowerCase():n[0]===t[0])}function unary(e){if(1!==e.length)return-1;return isNumeric(e[0].value)?e[0]:-1}function resultToCalculation(n,t,r){return t[0]===e.Dimension?dimensionToCalculation(n,t[4].unit,r):t[0]===e.Percentage?percentageToCalculation(n,r):t[0]===e.Number?numberToCalculation(n,r):-1}function dimensionToCalculation(t,r,u){const i=t.tokens();return{inputs:[new a([e.Dimension,u.toString()+r,i[0][2],i[i.length-1][3],{value:u,type:Number.isInteger(u)?n.Integer:n.Number,unit:r}])],operation:unary}}function percentageToCalculation(n,t){const r=n.tokens();return{inputs:[new a([e.Percentage,t.toString()+"%",r[0][2],r[r.length-1][3],{value:t}])],operation:unary}}function numberToCalculation(t,r){const u=t.tokens();return{inputs:[new a([e.Number,r.toString(),u[0][2],u[u.length-1][3],{value:r,type:Number.isInteger(r)?n.Integer:n.Number}])],operation:unary}}function solveACos(n,t){const r=t.value;if(r[0]!==e.Number)return-1;return dimensionToCalculation(n,"rad",Math.acos(r[4].value))}function solveASin(n,t){const r=t.value;if(r[0]!==e.Number)return-1;return dimensionToCalculation(n,"rad",Math.asin(r[4].value))}function solveATan(n,t){const r=t.value;if(r[0]!==e.Number)return-1;return dimensionToCalculation(n,"rad",Math.atan(r[4].value))}function solveATan2(e,n,t){const r=n.value;if(!isDimensionOrNumber(r))return-1;const u=convertUnit(r,t.value);if(!twoOfSameNumeric(r,u))return-1;return dimensionToCalculation(e,"rad",Math.atan2(r[4].value,u[4].value))}function solveAbs(e,n){const t=n.value;if(!isDimensionOrNumber(t))return-1;return resultToCalculation(e,t,Math.abs(t[4].value))}function solveClamp(e,n,t,r){if(!i(n)||!i(t)||!i(r))return-1;const u=n.value;if(!isNumeric(u))return-1;const a=convertUnit(u,t.value);if(!twoOfSameNumeric(u,a))return-1;const o=convertUnit(u,r.value);if(!twoOfSameNumeric(u,o))return-1;return resultToCalculation(e,u,Math.max(u[4].value,Math.min(a[4].value,o[4].value)))}function solveCos(n,t){const r=t.value;if(!isDimensionOrNumber(r))return-1;if(r[0]===e.Dimension)switch(r[4].unit.toLowerCase()){case"rad":break;case"deg":r[4].value=g.get("rad")(r[4].value);break;case"grad":r[4].value=b.get("rad")(r[4].value);break;case"turn":r[4].value=k.get("rad")(r[4].value);break;default:return-1}return numberToCalculation(n,Math.cos(r[4].value))}function solveExp(n,t){const r=t.value;if(r[0]!==e.Number)return-1;return numberToCalculation(n,Math.exp(r[4].value))}function solveHypot(e,n){const t=n[0];if(!t||!i(t))return-1;if(1!==new Set(n.map((e=>e.type))).size)return-1;const r=t.value;if(!isNumeric(r))return-1;const u=n.map((e=>convertUnit(r,e.value)));if(!arrayOfSameNumeric(u))return-1;const a=u.map((e=>e[4].value)),o=Math.hypot(...a);return resultToCalculation(e,r,o)}function solveMax(e,n){const t=n[0];if(!t||!i(t))return-1;if(1!==new Set(n.map((e=>e.type))).size)return-1;const r=t.value;if(!isNumeric(r))return-1;const u=n.map((e=>convertUnit(r,e.value)));if(!arrayOfSameNumeric(u))return-1;const a=u.map((e=>e[4].value)),o=Math.max(...a);return resultToCalculation(e,r,o)}function solveMin(e,n){const t=n[0];if(!t||!i(t))return-1;if(1!==new Set(n.map((e=>e.type))).size)return-1;const r=t.value;if(!isNumeric(r))return-1;const u=n.map((e=>convertUnit(r,e.value)));if(!arrayOfSameNumeric(u))return-1;const a=u.map((e=>e[4].value)),o=Math.min(...a);return resultToCalculation(e,r,o)}function solveMod(e,n,t){const r=n.value;if(!isNumeric(r))return-1;const u=convertUnit(r,t.value);if(!twoOfSameNumeric(r,u))return-1;let i;return i=0===u[4].value?Number.NaN:Number.isFinite(r[4].value)&&(Number.isFinite(u[4].value)||(u[4].value!==Number.POSITIVE_INFINITY||r[4].value!==Number.NEGATIVE_INFINITY&&!Object.is(0*r[4].value,-0))&&(u[4].value!==Number.NEGATIVE_INFINITY||r[4].value!==Number.POSITIVE_INFINITY&&!Object.is(0*r[4].value,0)))?Number.isFinite(u[4].value)?(r[4].value%u[4].value+u[4].value)%u[4].value:r[4].value:Number.NaN,resultToCalculation(e,r,i)}function solvePow(n,t,r){const u=t.value,i=r.value;if(u[0]!==e.Number)return-1;if(!twoOfSameNumeric(u,i))return-1;return numberToCalculation(n,Math.pow(u[4].value,i[4].value))}function solveRem(e,n,t){const r=n.value;if(!isNumeric(r))return-1;const u=convertUnit(r,t.value);if(!twoOfSameNumeric(r,u))return-1;let i;return i=0===u[4].value?Number.NaN:Number.isFinite(r[4].value)?Number.isFinite(u[4].value)?r[4].value%u[4].value:r[4].value:Number.NaN,resultToCalculation(e,r,i)}function solveRound(e,n,t,r){const u=t.value;if(!isNumeric(u))return-1;const i=convertUnit(u,r.value);if(!twoOfSameNumeric(u,i))return-1;let a;if(0===i[4].value)a=Number.NaN;else if(Number.isFinite(u[4].value)||Number.isFinite(i[4].value))if(!Number.isFinite(u[4].value)&&Number.isFinite(i[4].value))a=u[4].value;else if(Number.isFinite(u[4].value)&&!Number.isFinite(i[4].value))switch(n){case"down":a=u[4].value<0?-1/0:Object.is(-0,0*u[4].value)?-0:0;break;case"up":a=u[4].value>0?1/0:Object.is(0,0*u[4].value)?0:-0;break;default:a=Object.is(0,0*u[4].value)?0:-0}else if(Number.isFinite(i[4].value))switch(n){case"down":a=Math.floor(u[4].value/i[4].value)*i[4].value;break;case"up":a=Math.ceil(u[4].value/i[4].value)*i[4].value;break;case"to-zero":a=Math.trunc(u[4].value/i[4].value)*i[4].value;break;default:{let e=Math.floor(u[4].value/i[4].value)*i[4].value,n=Math.ceil(u[4].value/i[4].value)*i[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);a=t===r?n:t<r?e:n;break}}else a=u[4].value;else a=Number.NaN;return resultToCalculation(e,u,a)}function solveSign(e,n){const t=n.value;if(!isDimensionOrNumber(t))return-1;return numberToCalculation(e,Math.sign(t[4].value))}function solveSin(n,t){const r=t.value;if(!isDimensionOrNumber(r))return-1;if(r[0]===e.Dimension)switch(r[4].unit.toLowerCase()){case"rad":break;case"deg":r[4].value=g.get("rad")(r[4].value);break;case"grad":r[4].value=b.get("rad")(r[4].value);break;case"turn":r[4].value=k.get("rad")(r[4].value);break;default:return-1}return numberToCalculation(n,Math.sin(r[4].value))}function solveSqrt(n,t){const r=t.value;if(r[0]!==e.Number)return-1;return numberToCalculation(n,Math.sqrt(r[4].value))}function solveTan(n,t){const r=t.value;if(!isDimensionOrNumber(r))return-1;const u=r[4].value;let i=0;if(r[0]===e.Dimension)switch(r[4].unit.toLowerCase()){case"rad":i=D.get("deg")(u);break;case"deg":i=u,r[4].value=g.get("rad")(u);break;case"grad":i=b.get("deg")(u),r[4].value=b.get("rad")(u);break;case"turn":i=k.get("deg")(u),r[4].value=k.get("rad")(u);break;default:return-1}const a=i/90;let o;return o=i%90==0&&a%2!=0?a>0?1/0:-1/0:Math.tan(r[4].value),numberToCalculation(n,o)}function subtraction(t){if(2!==t.length)return-1;const r=t[0].value;let u=t[1].value;if(r[0]===e.Number&&u[0]===e.Number){const t=r[4].value-u[4].value;return new a([e.Number,t.toString(),r[2],u[3],{value:t,type:r[4].type===n.Integer&&u[4].type===n.Integer?n.Integer:n.Number}])}if(r[0]===e.Percentage&&u[0]===e.Percentage){const n=r[4].value-u[4].value;return new a([e.Percentage,n.toString()+"%",r[2],u[3],{value:n}])}if(r[0]===e.Dimension&&u[0]===e.Dimension&&(u=convertUnit(r,u),r[4].unit.toLowerCase()===u[4].unit.toLowerCase())){const t=r[4].value-u[4].value;return new a([e.Dimension,t.toString()+r[4].unit,r[2],u[3],{value:t,type:r[4].type===n.Integer&&u[4].type===n.Integer?n.Integer:n.Number,unit:r[4].unit}])}return-1}function solveLog(n,t){if(1===t.length){const r=t[0];if(!r||!i(r))return-1;const u=r.value;if(u[0]!==e.Number)return-1;return numberToCalculation(n,Math.log(u[4].value))}if(2===t.length){const r=t[0];if(!r||!i(r))return-1;const u=r.value;if(u[0]!==e.Number)return-1;const a=t[1];if(!a||!i(a))return-1;const o=a.value;if(o[0]!==e.Number)return-1;return numberToCalculation(n,Math.log(u[4].value)/Math.log(o[4].value))}return-1}const x=new Map([["abs",function abs(e,n){return singleNodeSolver(e,n,solveAbs)}],["acos",function acos(e,n){return singleNodeSolver(e,n,solveACos)}],["asin",function asin(e,n){return singleNodeSolver(e,n,solveASin)}],["atan",function atan(e,n){return singleNodeSolver(e,n,solveATan)}],["atan2",function atan2(e,n){return twoCommaSeparatedNodesSolver(e,n,solveATan2)}],["calc",calc$1],["clamp",function clamp(n,t){const r=resolveGlobalsAndConstants([...n.value.filter((e=>!o(e)&&!l(e)))],t),u=[],a=[],c=[];{let n=u;for(let t=0;t<r.length;t++){const o=r[t];if(i(o)&&o.value[0]===e.Comma){if(n===c)return-1;if(n===a){n=c;continue}if(n===u){n=a;continue}return-1}n.push(o)}}const s=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],u),t));if(-1===s)return-1;const m=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],a),t));if(-1===m)return-1;const f=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],c),t));if(-1===f)return-1;return solveClamp(n,s,m,f)}],["cos",function cos(e,n){return singleNodeSolver(e,n,solveCos)}],["exp",function exp(e,n){return singleNodeSolver(e,n,solveExp)}],["hypot",function hypot(e,n){return variadicNodesSolver(e,n,solveHypot)}],["log",function log(e,n){return variadicNodesSolver(e,n,solveLog)}],["max",function max(e,n){return variadicNodesSolver(e,n,solveMax)}],["min",function min(e,n){return variadicNodesSolver(e,n,solveMin)}],["mod",function mod(e,n){return twoCommaSeparatedNodesSolver(e,n,solveMod)}],["pow",function pow(e,n){return twoCommaSeparatedNodesSolver(e,n,solvePow)}],["rem",function rem(e,n){return twoCommaSeparatedNodesSolver(e,n,solveRem)}],["round",function round(n,t){const r=resolveGlobalsAndConstants([...n.value.filter((e=>!o(e)&&!l(e)))],t);let u="";const a=[],c=[];{let n=a;for(let t=0;t<r.length;t++){const o=r[t];if(!u&&0===a.length&&0===c.length&&i(o)&&o.value[0]===e.Ident){const e=o.value;if(O.has(e[4].value.toLowerCase())){u=e[4].value.toLowerCase();continue}}if(i(o)&&o.value[0]===e.Comma){if(n===c)return-1;if(n===a&&u&&0===a.length)continue;if(n===a){n=c;continue}return-1}n.push(o)}}const s=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],a),t));if(-1===s)return-1;const m=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],c),t));if(-1===m)return-1;u||(u="nearest");return solveRound(n,u,s,m)}],["sign",function sign(e,n){return singleNodeSolver(e,n,solveSign)}],["sin",function sin(e,n){return singleNodeSolver(e,n,solveSin)}],["sqrt",function sqrt(e,n){return singleNodeSolver(e,n,solveSqrt)}],["tan",function tan(e,n){return singleNodeSolver(e,n,solveTan)}]]);function calc$1(n,t){const r=resolveGlobalsAndConstants([...n.value.filter((e=>!o(e)&&!l(e)))],t);if(1===r.length&&i(r[0]))return{inputs:[r[0]],operation:unary};let u=0;for(;u<r.length;){const n=r[u];if(c(n)&&n.startToken[0]===e.OpenParen){const e=calc$1(n,t);if(-1===e)return-1;r.splice(u,1,e)}else if(s(n)){const e=x.get(n.getName().toLowerCase());if(!e)return-1;{const i=e(n,t);if(-1===i)return-1;r.splice(u,1,i)}}else u++}if(u=0,1===r.length&&isCalculation(r[0]))return r[0];for(;u<r.length;){const n=r[u];if(!n||!i(n)&&!isCalculation(n)){u++;continue}const t=r[u+1];if(!t||!i(t)){u++;continue}const a=t.value;if(a[0]!==e.Delim||"*"!==a[4].value&&"/"!==a[4].value){u++;continue}const o=r[u+2];if(!o||!i(o)&&!isCalculation(o))return-1;"*"!==a[4].value?"/"!==a[4].value?u++:r.splice(u,3,{inputs:[n,o],operation:division}):r.splice(u,3,{inputs:[n,o],operation:multiplication})}if(u=0,1===r.length&&isCalculation(r[0]))return r[0];for(;u<r.length;){const n=r[u];if(!n||!i(n)&&!isCalculation(n)){u++;continue}const t=r[u+1];if(!t||!i(t)){u++;continue}const a=t.value;if(a[0]!==e.Delim||"+"!==a[4].value&&"-"!==a[4].value){u++;continue}const o=r[u+2];if(!o||!i(o)&&!isCalculation(o))return-1;"+"!==a[4].value?"-"!==a[4].value?u++:r.splice(u,3,{inputs:[n,o],operation:subtraction}):r.splice(u,3,{inputs:[n,o],operation:addition})}return 1===r.length&&isCalculation(r[0])?r[0]:-1}function singleNodeSolver(n,t,r){const u=resolveGlobalsAndConstants([...n.value.filter((e=>!o(e)&&!l(e)))],t),i=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],u),t));return-1===i?-1:r(n,i)}function twoCommaSeparatedNodesSolver(n,t,r){const u=resolveGlobalsAndConstants([...n.value.filter((e=>!o(e)&&!l(e)))],t),a=[],c=[];{let n=a;for(let t=0;t<u.length;t++){const r=u[t];if(i(r)&&r.value[0]===e.Comma){if(n===c)return-1;if(n===a){n=c;continue}return-1}n.push(r)}}const s=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],a),t));if(-1===s)return-1;const m=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],c),t));return-1===m?-1:r(n,s,m)}function variadicNodesSolver(n,t,r){const u=resolveGlobalsAndConstants([...n.value.filter((e=>!o(e)&&!l(e)))],t),a=[];{const n=[];let r=[];for(let t=0;t<u.length;t++){const a=u[t];i(a)&&a.value[0]===e.Comma?(n.push(r),r=[]):r.push(a)}n.push(r);for(let r=0;r<n.length;r++){if(0===n[r].length)return-1;const u=solve(calc$1(new v([e.Function,"calc(",-1,-1,{value:"calc"}],[e.CloseParen,")",-1,-1,void 0],n[r]),t));if(-1===u)return-1;a.push(u)}}return r(n,a)}const O=new Set(["nearest","up","down","to-zero"]);function tokenizeGlobals(n){const u=new Map;if(!n)return u;for(const[i,a]of n)if(t(a))u.set(i,a);else if("string"!=typeof a);else{const n=r({css:a}),t=n.nextToken();if(n.nextToken(),!n.endOfFile())continue;if(!t)continue;if(t[0]!==e.Number&&t[0]!==e.Dimension&&t[0]!==e.Percentage)continue;u.set(i,t)}return u}function patchNaN(t){if(-1===t)return-1;if(s(t))return t;const r=t.value;return r[0]!==e.Number&&r[0]!==e.Percentage&&r[0]!==e.Dimension?t:Number.isNaN(r[4].value)?r[0]===e.Number?new v([e.Function,"calc(",r[2],r[3],{value:"calc"}],[e.CloseParen,")",r[2],r[3],void 0],[new a([e.Ident,"NaN",r[2],r[3],{value:"NaN"}])]):r[0]===e.Dimension?new v([e.Function,"calc(",r[2],r[3],{value:"calc"}],[e.CloseParen,")",r[2],r[3],void 0],[new a([e.Ident,"NaN",r[2],r[3],{value:"NaN"}]),new m([[e.Whitespace," ",r[2],r[3],void 0]]),new a([e.Delim,"*",r[2],r[3],{value:"*"}]),new m([[e.Whitespace," ",r[2],r[3],void 0]]),new a([e.Dimension,"1"+r[4].unit,r[2],r[3],{value:1,type:n.Integer,unit:r[4].unit}])]):r[0]===e.Percentage?new v([e.Function,"calc(",r[2],r[3],{value:"calc"}],[e.CloseParen,")",r[2],r[3],void 0],[new a([e.Ident,"NaN",r[2],r[3],{value:"NaN"}]),new m([[e.Whitespace," ",r[2],r[3],void 0]]),new a([e.Delim,"*",r[2],r[3],{value:"*"}]),new m([[e.Whitespace," ",r[2],r[3],void 0]]),new a([e.Percentage,"1%",r[2],r[3],{value:1}])]):-1:t}function patchInfinity(t){if(-1===t)return-1;if(s(t))return t;const r=t.value;if(r[0]!==e.Number&&r[0]!==e.Percentage&&r[0]!==e.Dimension)return t;if(Number.isFinite(r[4].value))return t;let u="";return Number.NEGATIVE_INFINITY===r[4].value&&(u="-"),r[0]===e.Number?new v([e.Function,"calc(",r[2],r[3],{value:"calc"}],[e.CloseParen,")",r[2],r[3],void 0],[new a([e.Ident,u+"infinity",r[2],r[3],{value:u+"infinity"}])]):r[0]===e.Dimension?new v([e.Function,"calc(",r[2],r[3],{value:"calc"}],[e.CloseParen,")",r[2],r[3],void 0],[new a([e.Ident,u+"infinity",r[2],r[3],{value:u+"infinity"}]),new m([[e.Whitespace," ",r[2],r[3],void 0]]),new a([e.Delim,"*",r[2],r[3],{value:"*"}]),new m([[e.Whitespace," ",r[2],r[3],void 0]]),new a([e.Dimension,"1"+r[4].unit,r[2],r[3],{value:1,type:n.Integer,unit:r[4].unit}])]):r[0]===e.Percentage?new v([e.Function,"calc(",r[2],r[3],{value:"calc"}],[e.CloseParen,")",r[2],r[3],void 0],[new a([e.Ident,u+"infinity",r[2],r[3],{value:u+"infinity"}]),new m([[e.Whitespace," ",r[2],r[3],void 0]]),new a([e.Delim,"*",r[2],r[3],{value:"*"}]),new m([[e.Whitespace," ",r[2],r[3],void 0]]),new a([e.Percentage,"1%",r[2],r[3],{value:1}])]):-1}function patchMinusZero(n){if(-1===n)return-1;if(s(n))return n;const t=n.value;return t[0]!==e.Number&&t[0]!==e.Percentage&&t[0]!==e.Dimension?n:Object.is(-0,t[4].value)?("-0"===t[1]||(t[1]="-0"),n):n}function patchPrecision(n,t=13){if(-1===n)return-1;if(s(n))return n;const r=n.value;if(r[0]!==e.Number&&r[0]!==e.Percentage&&r[0]!==e.Dimension)return n;if(Number.isInteger(r[4].value))return n;const u=Number(r[4].value.toFixed(t)).toString();return r[0]===e.Number?r[1]=u:r[0]===e.Percentage?r[1]=u+"%":r[0]===e.Dimension&&(r[1]=u+r[4].unit),n}function patchCanonicalUnit(n){return-1===n?-1:(s(n)||n.value[0]!==e.Dimension||(n.value=toCanonicalUnit(n.value)),n)}function patchCalcResult(e,n){let t=e;return t=patchNaN(e),t=patchInfinity(t),null!=n&&n.toCanonicalUnits&&(t=patchCanonicalUnit(t)),t=patchPrecision(t,null==n?void 0:n.precision),t=patchMinusZero(t),t}function calc(e,n){const t=r({css:e}),i=[];for(;!t.endOfFile();)i.push(t.nextToken());i.push(t.nextToken());return calcFromComponentValues(f(i,{}),n).map((e=>e.map((e=>u(...e.tokens()))).join(""))).join(",")}function calcFromComponentValues(e,n){const t=tokenizeGlobals(null==n?void 0:n.globals);for(let r=0;r<e.length;r++){const u=e[r];for(let e=0;e<u.length;e++){const r=u[e];if(s(r)){const i=x.get(r.getName().toLowerCase());if(i){const a=patchCalcResult(solve(i(r,t)),n);if(-1!==a){u.splice(e,1,a);continue}}}(c(r)||s(r))&&r.walk(((e,r)=>{if("number"!=typeof r)return;const u=e.node;if(s(u)){const i=x.get(u.getName().toLowerCase());if(!i)return;const a=patchCalcResult(solve(i(u,t)),n);if(-1!==a)return void e.parent.value.splice(r,1,a)}}))}}return e}export{calc,calcFromComponentValues};
@@ -0,0 +1,2 @@
1
+ import { TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function addition(inputs: Array<TokenNode>): TokenNode | -1;
@@ -0,0 +1,2 @@
1
+ import { TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function division(inputs: Array<TokenNode>): TokenNode | -1;
@@ -0,0 +1,2 @@
1
+ import { TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function multiplication(inputs: Array<TokenNode>): TokenNode | -1;
@@ -0,0 +1,2 @@
1
+ import type { TokenNode } from '@csstools/css-parser-algorithms';
2
+ export type Operation = (inputs: Array<TokenNode>) => TokenNode | -1;
@@ -0,0 +1,2 @@
1
+ import { TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function subtraction(inputs: Array<TokenNode>): TokenNode | -1;
@@ -0,0 +1,2 @@
1
+ import type { TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function unary(inputs: Array<TokenNode>): TokenNode | -1;
@@ -0,0 +1,23 @@
1
+ import { GlobalsWithStrings } from './util/globals';
2
+ export type conversionOptions = {
3
+ /**
4
+ * Pass global values as a map of key value pairs.
5
+ */
6
+ globals?: GlobalsWithStrings;
7
+ /**
8
+ * The default precision is fairly high.
9
+ * It aims to be high enough to make rounding unnoticeable in the browser.
10
+ * You can set it to a lower number to suite your needs.
11
+ */
12
+ precision?: number;
13
+ /**
14
+ * By default this package will try to preserve units.
15
+ * The heuristic to do this is very simplistic.
16
+ * We take the first unit we encounter and try to convert other dimensions to that unit.
17
+ *
18
+ * This better matches what users expect from a CSS dev tool.
19
+ *
20
+ * If you want to have outputs that are closes to CSS serialized values you can set `true`.
21
+ */
22
+ toCanonicalUnits?: boolean;
23
+ };
@@ -0,0 +1 @@
1
+ export declare const canonicalUnits: Record<string, string>;
@@ -0,0 +1 @@
1
+ export declare const convert_cm: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_deg: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_grad: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_hz: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_in: Map<string, (number: number) => number>;
@@ -0,0 +1,4 @@
1
+ import type { CSSToken } from '@csstools/css-tokenizer';
2
+ export declare const conversions: Map<string, Map<string, (number: number) => number>>;
3
+ export declare function convertUnit<T extends CSSToken>(a: CSSToken, b: T): T;
4
+ export declare function toCanonicalUnit<T extends CSSToken>(a: T): T;
@@ -0,0 +1 @@
1
+ export declare const convert_khz: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_mm: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_ms: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_pc: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_pt: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_px: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_q: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_rad: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_s: Map<string, (number: number) => number>;
@@ -0,0 +1 @@
1
+ export declare const convert_turn: Map<string, (number: number) => number>;
@@ -0,0 +1,2 @@
1
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function patchCanonicalUnit(x: TokenNode | FunctionNode | -1): TokenNode | FunctionNode | -1;
@@ -0,0 +1,4 @@
1
+ import type { TokenDimension, TokenNumber, TokenPercentage } from '@csstools/css-tokenizer';
2
+ export type Globals = Map<string, TokenDimension | TokenNumber | TokenPercentage>;
3
+ export type GlobalsWithStrings = Map<string, TokenDimension | TokenNumber | TokenPercentage | string>;
4
+ export declare function tokenizeGlobals(x: GlobalsWithStrings | undefined): Globals;
@@ -0,0 +1,2 @@
1
+ import { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function patchInfinity(x: TokenNode | FunctionNode | -1): TokenNode | FunctionNode | -1;
@@ -0,0 +1,5 @@
1
+ import { CSSToken, TokenDimension, TokenNumber, TokenPercentage } from '@csstools/css-tokenizer';
2
+ export declare function isNumeric(x: CSSToken): x is TokenDimension | TokenPercentage | TokenNumber;
3
+ export declare function isDimensionOrNumber(x: CSSToken): x is TokenDimension | TokenNumber;
4
+ export declare function arrayOfSameNumeric<T extends TokenDimension | TokenPercentage | TokenNumber>(x: Array<CSSToken>): x is Array<T>;
5
+ export declare function twoOfSameNumeric<T extends TokenDimension | TokenPercentage | TokenNumber>(x: T, y: CSSToken): y is T;
@@ -0,0 +1,2 @@
1
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function patchMinusZero(x: TokenNode | FunctionNode | -1): TokenNode | FunctionNode | -1;
@@ -0,0 +1,2 @@
1
+ import { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function patchNaN(x: TokenNode | FunctionNode | -1): TokenNode | FunctionNode | -1;
@@ -0,0 +1,3 @@
1
+ import { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
2
+ import { conversionOptions } from '../options';
3
+ export declare function patchCalcResult(x: TokenNode | FunctionNode | -1, options?: conversionOptions): TokenNode | FunctionNode | -1;
@@ -0,0 +1,2 @@
1
+ import type { FunctionNode, TokenNode } from '@csstools/css-parser-algorithms';
2
+ export declare function patchPrecision(x: TokenNode | FunctionNode | -1, precision?: number): TokenNode | FunctionNode | -1;
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@csstools/css-calc",
3
+ "description": "Solve CSS math expressions",
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
+ "peerDependencies": {
42
+ "@csstools/css-parser-algorithms": "^2.0.1",
43
+ "@csstools/css-tokenizer": "^2.0.1"
44
+ },
45
+ "scripts": {
46
+ "benchmark": "node ./test/benchmark.mjs",
47
+ "prebuild": "npm run clean",
48
+ "build": "rollup -c ../../rollup/default.mjs",
49
+ "clean": "node -e \"fs.rmSync('./dist', { recursive: true, force: true }); fs.mkdirSync('./dist');\"",
50
+ "lint": "npm run lint:eslint && npm run lint:package-json",
51
+ "lint:eslint": "eslint ./src --ext .js --ext .ts --ext .mjs --no-error-on-unmatched-pattern",
52
+ "lint:package-json": "node ../../.github/bin/format-package-json.mjs",
53
+ "prepublishOnly": "npm run clean && npm run build && npm run test",
54
+ "stryker": "stryker run --logLevel error",
55
+ "test": "npm run test:exports && node ./test/test.mjs",
56
+ "test:exports": "node ./test/_import.mjs && node ./test/_require.cjs"
57
+ },
58
+ "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/css-calc#readme",
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "https://github.com/csstools/postcss-plugins.git",
62
+ "directory": "packages/css-calc"
63
+ },
64
+ "bugs": "https://github.com/csstools/postcss-plugins/issues",
65
+ "keywords": [
66
+ "calc",
67
+ "css"
68
+ ],
69
+ "volta": {
70
+ "extends": "../../package.json"
71
+ }
72
+ }