|
1 | 1 | import type { StringifiedUtil } from '@unocss/core' |
2 | 2 | import { expandVariantGroup, notNull, regexScopePlaceholder } from '@unocss/core' |
3 | 3 | import type { CssNode, Rule, Selector, SelectorList } from 'css-tree' |
4 | | -import { clone, generate, parse } from 'css-tree' |
| 4 | +import { List, clone, generate, parse } from 'css-tree' |
5 | 5 | import type { TransformerDirectivesContext } from '.' |
6 | 6 | import { transformDirectives } from '.' |
7 | 7 |
|
@@ -63,24 +63,28 @@ export async function parseApply({ code, uno, offset, applyVariable }: Transform |
63 | 63 |
|
64 | 64 | for (const i of utils) { |
65 | 65 | const [, _selector, body, parent] = i |
66 | | - const selector = _selector?.replace(regexScopePlaceholder, ' ') || _selector |
| 66 | + const selectorOrGroup = _selector?.replace(regexScopePlaceholder, ' ') || _selector |
67 | 67 |
|
68 | | - if (parent || (selector && selector !== '.\\-')) { |
| 68 | + if (parent || (selectorOrGroup && selectorOrGroup !== '.\\-')) { |
69 | 69 | let newSelector = generate(node.prelude) |
70 | | - if (selector && selector !== '.\\-') { |
71 | | - const selectorAST = parse(selector, { |
72 | | - context: 'selector', |
73 | | - }) as Selector |
| 70 | + if (selectorOrGroup && selectorOrGroup !== '.\\-') { |
| 71 | + // use rule context since it could be a selector(.foo) or a selector group(.foo, .bar) |
| 72 | + const ruleAST = parse(`${selectorOrGroup}{}`, { |
| 73 | + context: 'rule', |
| 74 | + }) as Rule |
74 | 75 |
|
75 | 76 | const prelude = clone(node.prelude) as SelectorList |
76 | 77 |
|
77 | 78 | prelude.children.forEach((child) => { |
78 | | - const parentSelectorAst = clone(selectorAST) as Selector |
79 | | - parentSelectorAst.children.forEach((i) => { |
80 | | - if (i.type === 'ClassSelector' && i.name === '\\-') |
81 | | - Object.assign(i, clone(child)) |
| 79 | + const selectorListAst = clone(ruleAST.prelude) as SelectorList |
| 80 | + const classSelectors: List<CssNode> = new List() |
| 81 | + |
| 82 | + selectorListAst.children.forEach((selectorAst) => { |
| 83 | + classSelectors.appendList((selectorAst as Selector).children.filter(i => i.type === 'ClassSelector' && i.name === '\\-')) |
82 | 84 | }) |
83 | | - Object.assign(child, parentSelectorAst) |
| 85 | + classSelectors.forEach(i => Object.assign(i, clone(child))) |
| 86 | + |
| 87 | + Object.assign(child, selectorListAst) |
84 | 88 | }) |
85 | 89 | newSelector = generate(prelude) |
86 | 90 | } |
|
0 commit comments