{"version":3,"file":"index.mjs","sources":["../src/color.ts","../src/on-css-function.ts","../src/index.ts","../src/has-supports-at-rule-ancestor.ts"],"sourcesContent":["// Taken from @csstools/convert-colors\n// That package is in need of maintenance but this is out of scope for preset-env\n// We only need lab() -> rgb() and lch() -> rgb()\n\nexport function labToSRgb(lab: [number, number, number]): [number, number, number] {\n\treturn xyz2rgb(lab2xyz(lab, true));\n}\n\nexport function lchToSRgb(lch: [number, number, number]): [number, number, number] {\n\treturn xyz2rgb(\n\t\tlab2xyz(lch2lab(lch),\n\t\tfalse, /* do not clamp \"a\" and \"b\" when processing lch */\n\t));\n}\n\nfunction lch2lab(lch: [number, number, number]): [number, number, number] {\n\t// Convert from polar form\n\treturn [\n\t\tlch[0], // L is still L\n\t\tlch[1] * Math.cos(lch[2] * Math.PI / 180), // a\n\t\tlch[1] * Math.sin(lch[2] * Math.PI / 180), // b\n\t];\n}\n\nfunction lab2xyz(lab: [number, number, number], clamp : boolean): [number, number, number] {\n\tconst [labLRaw, labARaw, labBRaw] = lab;\n\n\tconst labL = Math.min(\n\t\tMath.max(\n\t\t\tlabLRaw,\n\t\t\t0,\n\t\t),\n\t\t100,\n\t);\n\n\tlet labA = 0;\n\tlet labB = 0;\n\n\tif (clamp) {\n\t\tlabA = Math.min(\n\t\t\tMath.max(\n\t\t\t\tlabARaw,\n\t\t\t\t-127,\n\t\t\t),\n\t\t\t128,\n\t\t);\n\n\t\tlabB = Math.min(\n\t\t\tMath.max(\n\t\t\t\tlabBRaw,\n\t\t\t\t-127,\n\t\t\t),\n\t\t\t128,\n\t\t);\n\t} else {\n\t\tlabA = labARaw;\n\t\tlabB = labBRaw;\n\t}\n\n\t// compute f, starting with the luminance-related term\n\tconst f2 = (labL + 16) / 116;\n\tconst f1 = labA / 500 + f2;\n\tconst f3 = f2 - labB / 200;\n\n\t// compute pre-scaled XYZ\n\tconst [ initX, initY, initZ ] = [\n\t\tMath.pow(f1, 3) > epsilon ? Math.pow(f1, 3) : (116 * f1 - 16) / kappa,\n\t\tlabL > kappa * epsilon ? Math.pow((labL + 16) / 116, 3) : labL / kappa,\n\t\tMath.pow(f3, 3) > epsilon ? Math.pow(f3, 3) : (116 * f3 - 16) / kappa,\n\t];\n\n\tconst [ xyzX, xyzY, xyzZ ] = matrix(\n\t\t// compute XYZ by scaling pre-scaled XYZ by reference white\n\t\t[ initX * wd50X, initY * wd50Y, initZ * wd50Z ],\n\t\t// calculate D65 XYZ from D50 XYZ\n\t\t[\n\t\t\t[ 0.9554734527042182, -0.023098536874261423, 0.0632593086610217 ],\n\t\t\t[ -0.028369706963208136, 1.0099954580058226, 0.021041398966943008 ],\n\t\t\t[ 0.012314001688319899, -0.020507696433477912, 1.3303659366080753 ],\n\t\t],\n\t);\n\n\treturn [ xyzX, xyzY, xyzZ ];\n}\n\nexport function xyz2rgb(xyz: [number, number, number]): [number, number, number] {\n\tconst [xyzX, xyzY, xyzZ] = xyz;\n\tconst [ lrgbR, lrgbB, lrgbG ] = matrix([ xyzX, xyzY, xyzZ ], [\n\t\t[ 3.2409699419045226, -1.537383177570094, -0.4986107602930034 ],\n\t\t[ -0.9692436362808796, 1.8759675015077202, 0.04155505740717559 ],\n\t\t[ 0.05563007969699366, -0.20397695888897652, 1.0569715142428786 ],\n\t]);\n\n\tconst [ rgbR, rgbG, rgbB ] = [ lrgbR, lrgbB, lrgbG ].map(\n\t\tv => v > 0.31308 ? 1.055 * Math.pow(v / 100, 1 / 2.4) * 100 - 5.5 : 12.92 * v,\n\t);\n\n\treturn [ rgbR, rgbG, rgbB ];\n}\n\nfunction matrix(params: [number, number, number], mats: [[number, number, number], [number, number, number], [number, number, number]]): [number, number, number] {\n\treturn mats.map(\n\t\tmat => mat.reduce(\n\t\t\t// (acc, value, index) => acc + params[index] * value,\n\t\t\t(acc, value, index) => acc + params[index] * precision * (value * precision) / precision / precision,\n\t\t\t0,\n\t\t),\n\t) as [number, number, number];\n}\n\n/* Precision\n/* ========================================================================== */\n\nconst precision = 100000000;\n\n/* D50 reference white\n/* ========================================================================== */\n\nconst [ wd50X, wd50Y, wd50Z ] = [ 96.422, 100.000, 82.521 ];\n\n/* Math Constants\n/* ========================================================================== */\n\nconst epsilon = Math.pow(6, 3) / Math.pow(29, 3);\nconst kappa = Math.pow(29, 3) / Math.pow(3, 3);\n","import valueParser from 'postcss-value-parser';\nimport type { FunctionNode, Dimension, Node, DivNode, WordNode } from 'postcss-value-parser';\nimport { labToSRgb, lchToSRgb } from './color';\n\nfunction onCSSFunction(node: FunctionNode) {\n\tconst value = node.value;\n\tconst rawNodes = node.nodes;\n\tconst relevantNodes = rawNodes.slice().filter((x) => {\n\t\treturn x.type !== 'comment' && x.type !== 'space';\n\t});\n\n\tlet nodes: Lch | Lab | null = null;\n\tif (value === 'lab') {\n\t\tnodes = labFunctionContents(relevantNodes);\n\t} else if (value === 'lch') {\n\t\tnodes = lchFunctionContents(relevantNodes);\n\t}\n\n\tif (!nodes) {\n\t\treturn;\n\t}\n\n\tif (relevantNodes.length > 3 && (!nodes.slash || !nodes.alpha)) {\n\t\treturn;\n\t}\n\n\t// rename the Color function to `rgb`\n\tnode.value = 'rgb';\n\n\ttransformAlpha(node, nodes.slash, nodes.alpha);\n\n\t/** Extracted Color channels. */\n\tconst [channelNode1, channelNode2, channelNode3] = channelNodes(nodes);\n\tconst [channelDimension1, channelDimension2, channelDimension3] = channelDimensions(nodes);\n\n\t/** Corresponding Color transformer. */\n\tconst toRGB = value === 'lab' ? labToSRgb : lchToSRgb;\n\n\t/** RGB channels from the source color. */\n\tconst channelNumbers: [number, number, number] = [\n\t\tchannelDimension1.number,\n\t\tchannelDimension2.number,\n\t\tchannelDimension3.number,\n\t].map(\n\t\tchannelNumber => parseFloat(channelNumber),\n\t) as [number, number, number];\n\n\tconst rgbValues = toRGB(\n\t\tchannelNumbers,\n\t).map(\n\t\tchannelValue => Math.max(Math.min(Math.round(channelValue * 2.55), 255), 0),\n\t);\n\n\tnode.nodes.splice(node.nodes.indexOf(channelNode1) + 1, 0, commaNode());\n\tnode.nodes.splice(node.nodes.indexOf(channelNode2) + 1, 0, commaNode());\n\n\treplaceWith(node.nodes, channelNode1, {\n\t\t...channelNode1,\n\t\tvalue: String(rgbValues[0]),\n\t});\n\n\treplaceWith(node.nodes, channelNode2, {\n\t\t...channelNode2,\n\t\tvalue: String(rgbValues[1]),\n\t});\n\n\treplaceWith(node.nodes, channelNode3, {\n\t\t...channelNode3,\n\t\tvalue: String(rgbValues[2]),\n\t});\n\n}\n\nexport default onCSSFunction;\n\nfunction commaNode(): DivNode {\n\treturn {\n\t\tsourceIndex: 0,\n\t\tsourceEndIndex: 1,\n\t\tvalue: ',',\n\t\ttype: 'div',\n\t\tbefore: '',\n\t\tafter: '',\n\t};\n}\n\nfunction isNumericNode(node: Node): node is WordNode {\n\tif (!node || node.type !== 'word') {\n\t\treturn false;\n\t}\n\n\tif (!canParseAsUnit(node)) {\n\t\treturn false;\n\t}\n\n\tconst unitAndValue = valueParser.unit(node.value);\n\tif (!unitAndValue) {\n\t\treturn false;\n\t}\n\n\treturn !!unitAndValue.number;\n}\n\nfunction isNumericNodeNumber(node): node is WordNode {\n\tif (!node || node.type !== 'word') {\n\t\treturn false;\n\t}\n\n\tif (!canParseAsUnit(node)) {\n\t\treturn false;\n\t}\n\n\tconst unitAndValue = valueParser.unit(node.value);\n\tif (!unitAndValue) {\n\t\treturn false;\n\t}\n\n\treturn !!unitAndValue.number && unitAndValue.unit === '';\n}\n\nfunction isNumericNodeHueLike(node: Node): node is WordNode {\n\tif (!node || node.type !== 'word') {\n\t\treturn false;\n\t}\n\n\tif (!canParseAsUnit(node)) {\n\t\treturn false;\n\t}\n\n\tconst unitAndValue = valueParser.unit(node.value);\n\tif (!unitAndValue) {\n\t\treturn false;\n\t}\n\n\treturn !!unitAndValue.number && (\n\t\tunitAndValue.unit === 'deg' ||\n\t\tunitAndValue.unit === 'grad' ||\n\t\tunitAndValue.unit === 'rad' ||\n\t\tunitAndValue.unit === 'turn' ||\n\t\tunitAndValue.unit === ''\n\t);\n}\n\nfunction isNumericNodePercentage(node: Node): node is WordNode {\n\tif (!node || node.type !== 'word') {\n\t\treturn false;\n\t}\n\n\tif (!canParseAsUnit(node)) {\n\t\treturn false;\n\t}\n\n\tconst unitAndValue = valueParser.unit(node.value);\n\tif (!unitAndValue) {\n\t\treturn false;\n\t}\n\n\treturn unitAndValue.unit === '%';\n}\n\nfunction isNumericNodePercentageOrNumber(node: Node): node is WordNode {\n\tif (!node || node.type !== 'word') {\n\t\treturn false;\n\t}\n\n\tif (!canParseAsUnit(node)) {\n\t\treturn false;\n\t}\n\n\tconst unitAndValue = valueParser.unit(node.value);\n\tif (!unitAndValue) {\n\t\treturn false;\n\t}\n\n\treturn unitAndValue.unit === '%' || unitAndValue.unit === '';\n}\n\nfunction isCalcNode(node: Node): node is FunctionNode {\n\treturn node && node.type === 'function' && node.value === 'calc';\n}\n\nfunction isVarNode(node: Node): node is FunctionNode {\n\treturn node && node.type === 'function' && node.value === 'var';\n}\n\nfunction isSlashNode(node: Node): node is DivNode {\n\treturn node && node.type === 'div' && node.value === '/';\n}\n\ntype Lch = {\n\tl: Dimension,\n\tlNode: Node,\n\tc: Dimension,\n\tcNode: Node,\n\th: Dimension,\n\thNode: Node,\n\tslash?: DivNode,\n\talpha?: WordNode|FunctionNode,\n}\n\nfunction lchFunctionContents(nodes): Lch|null {\n\tif (!isNumericNodePercentage(nodes[0])) {\n\t\treturn null;\n\t}\n\n\tif (!isNumericNodeNumber(nodes[1])) {\n\t\treturn null;\n\t}\n\n\tif (!isNumericNodeHueLike(nodes[2])) {\n\t\treturn null;\n\t}\n\n\tconst out: Lch = {\n\t\tl: valueParser.unit(nodes[0].value) as Dimension,\n\t\tlNode: nodes[0],\n\t\tc: valueParser.unit(nodes[1].value) as Dimension,\n\t\tcNode: nodes[1],\n\t\th: valueParser.unit(nodes[2].value) as Dimension,\n\t\thNode: nodes[2],\n\t};\n\n\tnormalizeHueNode(out.h);\n\tif (out.h.unit !== '') {\n\t\treturn null;\n\t}\n\n\tif (isSlashNode(nodes[3])) {\n\t\tout.slash = nodes[3];\n\t}\n\n\tif ((isNumericNodePercentageOrNumber(nodes[4]) || isCalcNode(nodes[4]) || isVarNode(nodes[4]))) {\n\t\tout.alpha = nodes[4];\n\t}\n\n\treturn out;\n}\n\ntype Lab = {\n\tl: Dimension,\n\tlNode: Node,\n\ta: Dimension,\n\taNode: Node,\n\tb: Dimension,\n\tbNode: Node,\n\tslash?: DivNode,\n\talpha?: WordNode | FunctionNode,\n}\n\nfunction labFunctionContents(nodes): Lab|null {\n\tif (!isNumericNodePercentage(nodes[0])) {\n\t\treturn null;\n\t}\n\n\tif (!isNumericNodeNumber(nodes[1])) {\n\t\treturn null;\n\t}\n\n\tif (!isNumericNodeNumber(nodes[2])) {\n\t\treturn null;\n\t}\n\n\tconst out: Lab = {\n\t\tl: valueParser.unit(nodes[0].value) as Dimension,\n\t\tlNode: nodes[0],\n\t\ta: valueParser.unit(nodes[1].value) as Dimension,\n\t\taNode: nodes[1],\n\t\tb: valueParser.unit(nodes[2].value) as Dimension,\n\t\tbNode: nodes[2],\n\t};\n\n\tif (isSlashNode(nodes[3])) {\n\t\tout.slash = nodes[3];\n\t}\n\n\tif ((isNumericNodePercentageOrNumber(nodes[4]) || isCalcNode(nodes[4]))) {\n\t\tout.alpha = nodes[4];\n\t}\n\n\treturn out;\n}\n\nfunction isLab(x: Lch | Lab): x is Lab {\n\tif (typeof (x as Lab).a !== 'undefined') {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction channelNodes(x: Lch | Lab): [Node, Node, Node] {\n\tif (isLab(x)) {\n\t\treturn [x.lNode, x.aNode, x.bNode];\n\t}\n\n\treturn [x.lNode, x.cNode, x.hNode];\n}\n\nfunction channelDimensions(x: Lch | Lab): [Dimension, Dimension, Dimension] {\n\tif (isLab(x)) {\n\t\treturn [x.l, x.a, x.b];\n\t}\n\n\treturn [x.l, x.c, x.h];\n}\n\nfunction transformAlpha(node: FunctionNode, slashNode: DivNode | undefined, alphaNode: WordNode | FunctionNode | undefined) {\n\tif (!slashNode || !alphaNode) {\n\t\treturn;\n\t}\n\n\tnode.value = 'rgba';\n\tslashNode.value = ',';\n\tslashNode.before = '';\n\n\tif (!isNumericNode(alphaNode)) {\n\t\treturn;\n\t}\n\n\tconst unitAndValue = valueParser.unit(alphaNode.value);\n\tif (!unitAndValue) {\n\t\treturn;\n\t}\n\n\tif (unitAndValue.unit === '%') {\n\t\t// transform the Alpha channel from a Percentage to (0-1) Number\n\t\tunitAndValue.number = String(parseFloat(unitAndValue.number) / 100);\n\t\talphaNode.value = String(unitAndValue.number);\n\t}\n}\n\nfunction replaceWith(nodes: Array, oldNode: Node, newNode: Node) {\n\tconst index = nodes.indexOf(oldNode);\n\tnodes[index] = newNode;\n}\n\nfunction normalizeHueNode(dimension: Dimension) {\n\tswitch (dimension.unit) {\n\t\tcase 'deg':\n\t\t\tdimension.unit = '';\n\t\t\treturn;\n\t\tcase 'rad':\n\t\t\t// radians -> degrees\n\t\t\tdimension.unit = '';\n\t\t\tdimension.number = (parseFloat(dimension.number) * 180 / Math.PI).toString();\n\t\t\treturn;\n\n\t\tcase 'grad':\n\t\t\t// grades -> degrees\n\t\t\tdimension.unit = '';\n\t\t\tdimension.number = (parseFloat(dimension.number) * 0.9).toString();\n\t\t\treturn;\n\n\t\tcase 'turn':\n\t\t\t// turns -> degrees\n\t\t\tdimension.unit = '';\n\t\t\tdimension.number = (parseFloat(dimension.number) * 360).toString();\n\t\t\treturn;\n\t}\n}\n\nfunction canParseAsUnit(node : Node): boolean {\n\tif (!node || !node.value) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\treturn valueParser.unit(node.value) !== false;\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n","import { hasSupportsAtRuleAncestor } from './has-supports-at-rule-ancestor';\nimport valueParser from 'postcss-value-parser';\nimport type { ParsedValue, FunctionNode } from 'postcss-value-parser';\nimport type { Declaration, Postcss, Result } from 'postcss';\nimport onCSSFunction from './on-css-function';\n\nimport type { PluginCreator } from 'postcss';\n\n// NOTE : Used in unit tests.\nimport { labToSRgb, lchToSRgb } from './color';\n\n/** Transform lab() and lch() functions in CSS. */\nconst postcssPlugin: PluginCreator<{ preserve: boolean }> = (opts?: { preserve: boolean }) => {\n\tconst preserve = 'preserve' in Object(opts) ? Boolean(opts.preserve) : false;\n\n\treturn {\n\t\tpostcssPlugin: 'postcss-lab-function',\n\t\tDeclaration: (decl: Declaration, { result, postcss }: { result: Result, postcss: Postcss }) => {\n\t\t\tif (preserve && hasSupportsAtRuleAncestor(decl)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst originalValue = decl.value;\n\t\t\tif (!(/(^|[^\\w-])(lab|lch)\\(/i.test(originalValue))) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet valueAST: ParsedValue|undefined;\n\n\t\t\ttry {\n\t\t\t\tvalueAST = valueParser(originalValue);\n\t\t\t} catch (error) {\n\t\t\t\tdecl.warn(\n\t\t\t\t\tresult,\n\t\t\t\t\t`Failed to parse value '${originalValue}' as a lab or hcl function. Leaving the original value intact.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof valueAST === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvalueAST.walk((node) => {\n\t\t\t\tif (!node.type || node.type !== 'function') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (node.value !== 'lab' && node.value !== 'lch') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tonCSSFunction(node as FunctionNode);\n\t\t\t});\n\t\t\tconst modifiedValue = String(valueAST);\n\n\t\t\tif (modifiedValue === originalValue) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (preserve && decl.variable) {\n\t\t\t\tconst parent = decl.parent;\n\t\t\t\tconst atSupportsParams = '(color: lab(0% 0 0)) and (color: lch(0% 0 0))';\n\t\t\t\tconst atSupports = postcss.atRule({ name: 'supports', params: atSupportsParams, source: decl.source });\n\n\t\t\t\tconst parentClone = parent.clone();\n\t\t\t\tparentClone.removeAll();\n\n\t\t\t\tparentClone.append(decl.clone());\n\t\t\t\tatSupports.append(parentClone);\n\n\t\t\t\t// Ensure correct order of @supports rules\n\t\t\t\t// Find the last one created by us or the current parent and insert after.\n\t\t\t\tlet insertAfter = parent;\n\t\t\t\tlet nextInsertAfter = parent.next();\n\t\t\t\twhile (\n\t\t\t\t\tinsertAfter &&\n\t\t\t\t\tnextInsertAfter &&\n\t\t\t\t\tnextInsertAfter.type === 'atrule' &&\n\t\t\t\t\tnextInsertAfter.name === 'supports' &&\n\t\t\t\t\tnextInsertAfter.params === atSupportsParams\n\t\t\t\t) {\n\t\t\t\t\tinsertAfter = nextInsertAfter;\n\t\t\t\t\tnextInsertAfter = nextInsertAfter.next();\n\t\t\t\t}\n\n\t\t\t\tinsertAfter.after(atSupports);\n\n\t\t\t\tdecl.value = modifiedValue;\n\t\t\t} else if (preserve) {\n\t\t\t\tdecl.cloneBefore({ value: modifiedValue });\n\t\t\t} else {\n\t\t\t\tdecl.value = modifiedValue;\n\t\t\t}\n\t\t},\n\t};\n};\n\npostcssPlugin.postcss = true;\n\n// Used by unit tests.\n// Mixing named and default export causes issues with CJS.\n// Attaching these to the default export is the best solution.\npostcssPlugin['_labToSRgb'] = labToSRgb;\npostcssPlugin['_lchToSRgb'] = lchToSRgb;\n\nexport default postcssPlugin;\n","import type { Node, AtRule } from 'postcss';\n\nexport function hasSupportsAtRuleAncestor(node: Node): boolean {\n\tlet parent = node.parent;\n\twhile (parent) {\n\t\tif (parent.type !== 'atrule') {\n\t\t\tparent = parent.parent;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ((parent as AtRule).name === 'supports' && (parent as AtRule).params.indexOf('(color: lab(0% 0 0)) and (color: lch(0% 0 0))') !== -1) {\n\t\t\treturn true;\n\t\t}\n\n\t\tparent = parent.parent;\n\t}\n\n\treturn false;\n}\n"],"names":["labToSRgb","lab","xyz2rgb","lab2xyz","lchToSRgb","lch","Math","cos","PI","sin","lch2lab","clamp","labLRaw","labARaw","labBRaw","labL","min","max","labA","labB","f2","f1","f3","initX","initY","initZ","pow","epsilon","kappa","xyzX","xyzY","xyzZ","matrix","wd50X","wd50Y","wd50Z","xyz","lrgbR","lrgbB","lrgbG","rgbR","rgbG","rgbB","map","v","params","mats","mat","reduce","acc","value","index","precision","onCSSFunction","node","relevantNodes","nodes","slice","filter","x","type","isNumericNodePercentage","isNumericNodeNumber","out","l","valueParser","unit","lNode","a","aNode","b","bNode","isSlashNode","slash","isNumericNodePercentageOrNumber","isCalcNode","alpha","labFunctionContents","canParseAsUnit","unitAndValue","number","isNumericNodeHueLike","c","cNode","h","hNode","dimension","parseFloat","toString","normalizeHueNode","isVarNode","lchFunctionContents","length","slashNode","alphaNode","before","isNumericNode","String","transformAlpha","channelNode1","channelNode2","channelNode3","isLab","channelNodes","channelDimension1","channelDimension2","channelDimension3","channelDimensions","rgbValues","channelNumber","channelValue","round","splice","indexOf","sourceIndex","sourceEndIndex","after","replaceWith","oldNode","newNode","e","postcssPlugin","opts","preserve","Object","Boolean","Declaration","decl","result","postcss","parent","name","hasSupportsAtRuleAncestor","originalValue","test","valueAST","error","warn","walk","modifiedValue","variable","atSupportsParams","atSupports","atRule","source","parentClone","clone","removeAll","append","insertAfter","nextInsertAfter","next","cloneBefore"],"mappings":"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"}