| import postcssValueParser from 'postcss-value-parser'; |
| import cssnanoUtils from 'cssnano-utils'; |
| import addSpace from '../lib/addSpace.js'; |
| import getValue from '../lib/getValue.js'; |
| import easingFunctions from './easingFunctions.json' with { type: 'json' }; |
| |
| const { unit } = postcssValueParser; |
| const { getArguments } = cssnanoUtils; |
| // transition: [ none | <single-transition-property> ] || <time> || <single-transition-timing-function> || <time> |
| |
| const timingFunctions = new Set(easingFunctions.keywords); |
| const timingFunctionNames = new Set(easingFunctions.functions); |
| |
| /** |
| * @param {import('postcss-value-parser').Node[][]} args |
| * @return {import('postcss-value-parser').Node[][]} |
| */ |
| function normalize(args) { |
| const list = []; |
| for (const arg of args) { |
| /** @type {Record<string, import('postcss-value-parser').Node[]>} */ |
| const state = { |
| timingFunction: [], |
| property: [], |
| time1: [], |
| time2: [], |
| }; |
| |
| for (const node of arg) { |
| const { type, value } = node; |
| |
| if (type === 'space') { |
| continue; |
| } |
| |
| if (type === 'function' && timingFunctionNames.has(value.toLowerCase())) { |
| state.timingFunction = [...state.timingFunction, node, addSpace()]; |
| } else if (unit(value)) { |
| if (!state.time1.length) { |
| state.time1 = [...state.time1, node, addSpace()]; |
| } else { |
| state.time2 = [...state.time2, node, addSpace()]; |
| } |
| } else if (timingFunctions.has(value.toLowerCase())) { |
| state.timingFunction = [...state.timingFunction, node, addSpace()]; |
| } else { |
| state.property = [...state.property, node, addSpace()]; |
| } |
| } |
| |
| list.push([ |
| ...state.property, |
| ...state.time1, |
| ...state.timingFunction, |
| ...state.time2, |
| ]); |
| } |
| return list; |
| } |
| /** |
| * @param {import('postcss-value-parser').ParsedValue} parsed |
| * @return {string} |
| */ |
| function normalizeTransition(parsed) { |
| const values = normalize(getArguments(parsed)); |
| return getValue(values); |
| } |
| |
| export default normalizeTransition; |