| import postcssValueParser from 'postcss-value-parser'; |
| import cssnanoUtils from 'cssnano-utils'; |
| import addSpace from '../lib/addSpace.js'; |
| import getValue from '../lib/getValue.js'; |
| import mathFunctions from '../lib/mathfunctions.js'; |
| import vendorUnprefixed from '../lib/vendorUnprefixed.js'; |
| |
| const { unit } = postcssValueParser; |
| const { getArguments } = cssnanoUtils; |
| /** |
| * @param {import('postcss-value-parser').Node[][]} args |
| * @return {false | import('postcss-value-parser').Node[][]} |
| */ |
| function normalize(args) { |
| const list = []; |
| let abort = false; |
| for (const arg of args) { |
| /** @type {import('postcss-value-parser').Node[]} */ |
| let val = []; |
| /** @type {Record<'inset'|'color', import('postcss-value-parser').Node[]>} */ |
| const state = { |
| inset: [], |
| color: [], |
| }; |
| |
| for (const node of arg) { |
| const { type, value } = node; |
| |
| if ( |
| type === 'function' && |
| mathFunctions.has(vendorUnprefixed(value.toLowerCase())) |
| ) { |
| abort = true; |
| continue; |
| } |
| |
| if (type === 'space') { |
| continue; |
| } |
| |
| if (unit(value)) { |
| val = [...val, node, addSpace()]; |
| } else if (value.toLowerCase() === 'inset') { |
| state.inset = [...state.inset, node, addSpace()]; |
| } else { |
| state.color = [...state.color, node, addSpace()]; |
| } |
| } |
| |
| if (abort) { |
| return false; |
| } |
| |
| list.push([...state.inset, ...val, ...state.color]); |
| } |
| return list; |
| } |
| /** |
| * @param {import('postcss-value-parser').ParsedValue} parsed |
| * @return {string} |
| */ |
| function normalizeBoxShadow(parsed) { |
| const args = getArguments(parsed); |
| const normalized = normalize(args); |
| if (normalized === false) { |
| return parsed.toString(); |
| } |
| return getValue(normalized); |
| } |
| |
| export default normalizeBoxShadow; |