import { lab2rgb, lch2rgb } from '@csstools/convert-colors'; import postcss from 'postcss'; import parser from 'postcss-values-parser'; var index = postcss.plugin('postcss-lab-function', opts => { const preserve = 'preserve' in Object(opts) ? Boolean(opts.preserve) : false; return root => { root.walkDecls(decl => { const value = decl.value; if (colorAnyRegExp.test(value)) { const ast = parser(value).parse(); ast.walkType('func', node => { if (colorRegExp.test(node.value)) { const children = node.nodes.slice(1, -1); const isLab = labRegExp.test(node.value); const isGray = grayRegExp.test(node.value); const isFunctionalLAB = !isGray && matchFunctionalLAB(children); const isFunctionalLCH = !isGray && matchFunctionalLCH(children); const isFunctionalGray = isGray && matchFunctionalGray(children); if (isFunctionalLAB || isFunctionalLCH) { node.value = 'rgb'; const slashNode = children[3]; const alphaNode = children[4]; if (alphaNode) { if (isPercentage(alphaNode) && !isCalc(alphaNode)) { alphaNode.unit = ''; alphaNode.value = String(alphaNode.value / 100); } if (alphaNode.value === '1') { slashNode.remove(); alphaNode.remove(); } else { node.value += 'a'; } } if (slashNode && isSlash(slashNode)) { slashNode.replaceWith(newComma()); } const converter = isLab ? lab2rgb : lch2rgb; const rgbValues = converter(...[children[0].value, children[1].value, children[2].value].map(number => parseFloat(number))).map(sourceValue => Math.max(Math.min(parseInt(sourceValue * 2.55), 255), 0)); children[0].value = String(rgbValues[0]); children[1].value = String(rgbValues[1]); children[2].value = String(rgbValues[2]); node.nodes.splice(3, 0, [newComma()]); node.nodes.splice(2, 0, [newComma()]); } else if (isFunctionalGray) { node.value = 'rgb'; const alphaNode = children[2]; const rgbValues = lab2rgb(...[children[0].value, 0, 0].map(number => parseFloat(number))).map(sourceValue => Math.max(Math.min(parseInt(sourceValue * 2.55), 255), 0)); node.removeAll().append(newParen('(')).append(newNumber(rgbValues[0])).append(newComma()).append(newNumber(rgbValues[1])).append(newComma()).append(newNumber(rgbValues[2])).append(newParen(')')); if (alphaNode) { if (isPercentage(alphaNode) && !isCalc(alphaNode)) { alphaNode.unit = ''; alphaNode.value = String(alphaNode.value / 100); } if (alphaNode.value !== '1') { node.value += 'a'; node.insertBefore(node.last, newComma()).insertBefore(node.last, alphaNode); } } } } }); const newValue = String(ast); if (preserve) { decl.cloneBefore({ value: newValue }); } else { decl.value = newValue; } } }); }; }); const colorAnyRegExp = /(^|[^\w-])(lab|lch|gray)\(/i; const colorRegExp = /^(lab|lch|gray)$/i; const labRegExp = /^lab$/i; const grayRegExp = /^gray$/i; const alphaUnitMatch = /^%?$/i; const calcFuncMatch = /^calc$/i; const hueUnitMatch = /^(deg|grad|rad|turn)?$/i; const isAlphaValue = node => isCalc(node) || node.type === 'number' && alphaUnitMatch.test(node.unit); const isCalc = node => node.type === 'func' && calcFuncMatch.test(node.value); const isHue = node => isCalc(node) || node.type === 'number' && hueUnitMatch.test(node.unit); const isNumber = node => isCalc(node) || node.type === 'number' && node.unit === ''; const isPercentage = node => isCalc(node) || node.type === 'number' && node.unit === '%'; const isSlash = node => node.type === 'operator' && node.value === '/'; const functionalLABMatch = [isNumber, isNumber, isNumber, isSlash, isAlphaValue]; const functionalLCHMatch = [isNumber, isNumber, isHue, isSlash, isAlphaValue]; const functionalGrayMatch = [isNumber, isSlash, isAlphaValue]; const matchFunctionalLAB = children => children.every((child, index) => typeof functionalLABMatch[index] === 'function' && functionalLABMatch[index](child)); const matchFunctionalLCH = children => children.every((child, index) => typeof functionalLCHMatch[index] === 'function' && functionalLCHMatch[index](child)); const matchFunctionalGray = children => children.every((child, index) => typeof functionalGrayMatch[index] === 'function' && functionalGrayMatch[index](child)); const newComma = () => parser.comma({ value: ',' }); const newNumber = value => parser.number({ value }); const newParen = value => parser.paren({ value }); export default index; //# sourceMappingURL=index.es.mjs.map