Skip to content

Commit 80bfade

Browse files
committed
fix(plugin): improve classes generation when a pseudo class is present
Uses the same approach as Tailwind CSS for variants generation. fix #2
1 parent 0b5a4dd commit 80bfade

File tree

1 file changed

+37
-71
lines changed

1 file changed

+37
-71
lines changed

src/index.js

Lines changed: 37 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const selectorParser = require('postcss-selector-parser')
22

3-
module.exports = ({ addVariant, theme, e }) => {
3+
module.exports = ({ addVariant, theme }) => {
44
const themeVariants = theme('themeVariants')
55
if (!themeVariants) {
66
throw new Error('tailwindcss-multi-theme expects a themeVariants property in theme.')
@@ -16,96 +16,62 @@ module.exports = ({ addVariant, theme, e }) => {
1616
)
1717
}
1818

19-
themeVariants.forEach((tv) => {
20-
const root = `.theme-${tv} `
21-
22-
addVariant(`${tv}`, ({ modifySelectors, separator }) => {
19+
function generatePseudoClassVariant(themeVariant, pseudoClass, selectorPrefix = pseudoClass) {
20+
const root = `.theme-${themeVariant} `
21+
addVariant(`${themeVariant}:${selectorPrefix}`, ({ modifySelectors, separator }) => {
2322
modifySelectors(({ selector }) => {
2423
return selectorParser((selectors) => {
2524
selectors.walkClasses((sel) => {
26-
sel.value = `${tv}${separator}${sel.value}`
25+
sel.value = `${themeVariant}${separator}${selectorPrefix}${separator}${sel.value}`
2726
sel.parent.insertBefore(sel, selectorParser().astSync(root))
27+
sel.parent.insertAfter(sel, selectorParser.pseudo({ value: `:${pseudoClass}` }))
2828
})
2929
}).processSync(selector)
3030
})
3131
})
32+
}
3233

33-
addVariant(`${tv}:group-hover`, ({ modifySelectors, separator }) => {
34-
modifySelectors(({ className }) => {
35-
return `${root} .group:hover .${e(`${tv}${separator}group-hover${separator}${className}`)}`
36-
})
37-
})
38-
39-
addVariant(`${tv}:group-focus`, ({ modifySelectors, separator }) => {
40-
modifySelectors(({ className }) => {
41-
return `${root} .group:focus .${e(`${tv}${separator}group-focus${separator}${className}`)}`
42-
})
43-
})
44-
45-
addVariant(`${tv}:focus-within`, ({ modifySelectors, separator }) => {
46-
modifySelectors(({ className }) => {
47-
return `${root}.${e(`${tv}${separator}focus-within${separator}${className}`)}:focus-within`
48-
})
49-
})
50-
51-
addVariant(`${tv}:first`, ({ modifySelectors, separator }) => {
52-
modifySelectors(({ className }) => {
53-
return `${root}.${e(`${tv}${separator}first${separator}${className}`)}:first-child`
54-
})
55-
})
56-
57-
addVariant(`${tv}:last`, ({ modifySelectors, separator }) => {
58-
modifySelectors(({ className }) => {
59-
return `${root}.${e(`${tv}${separator}last${separator}${className}`)}:last-child`
60-
})
61-
})
62-
63-
addVariant(`${tv}:odd`, ({ modifySelectors, separator }) => {
64-
modifySelectors(({ className }) => {
65-
return `${root}.${e(`${tv}${separator}odd${separator}${className}`)}:nth-child(odd)`
66-
})
67-
})
68-
69-
addVariant(`${tv}:even`, ({ modifySelectors, separator }) => {
70-
modifySelectors(({ className }) => {
71-
return `${root}.${e(`${tv}${separator}even${separator}${className}`)}:nth-child(even)`
72-
})
73-
})
74-
75-
addVariant(`${tv}:hover`, ({ modifySelectors, separator }) => {
76-
modifySelectors(({ className }) => {
77-
return `${root}.${e(`${tv}${separator}hover${separator}${className}`)}:hover`
34+
function generateGroupVariant(themeVariant, pseudoClass, selectorPrefix) {
35+
const root = `.theme-${themeVariant} `
36+
addVariant(`${themeVariant}:${selectorPrefix}`, ({ modifySelectors, separator }) => {
37+
modifySelectors(({ selector }) => {
38+
return selectorParser((selectors) => {
39+
selectors.walkClasses((sel) => {
40+
sel.value = `${themeVariant}${separator}${selectorPrefix}${separator}${sel.value}`
41+
sel.parent.insertBefore(sel, selectorParser().astSync(`${root}.${pseudoClass} `))
42+
})
43+
}).processSync(selector)
7844
})
7945
})
46+
}
8047

81-
addVariant(`${tv}:focus`, ({ modifySelectors, separator }) => {
48+
function generateDefaultVariant(themeVariant) {
49+
const root = `.theme-${themeVariant} `
50+
addVariant(`${themeVariant}`, ({ modifySelectors, separator }) => {
8251
modifySelectors(({ selector }) => {
8352
return selectorParser((selectors) => {
8453
selectors.walkClasses((sel) => {
85-
sel.value = `${tv}${separator}focus${separator}${sel.value}`
54+
sel.value = `${themeVariant}${separator}${sel.value}`
8655
sel.parent.insertBefore(sel, selectorParser().astSync(root))
87-
sel.parent.insertAfter(sel, selectorParser.pseudo({ value: ':focus' }))
8856
})
8957
}).processSync(selector)
9058
})
9159
})
60+
}
9261

93-
addVariant(`${tv}:active`, ({ modifySelectors, separator }) => {
94-
modifySelectors(({ className }) => {
95-
return `${root}.${e(`${tv}${separator}active${separator}${className}`)}:active`
96-
})
97-
})
98-
99-
addVariant(`${tv}:visited`, ({ modifySelectors, separator }) => {
100-
modifySelectors(({ className }) => {
101-
return `${root}.${e(`${tv}${separator}visited${separator}${className}`)}:visited`
102-
})
103-
})
104-
105-
addVariant(`${tv}:disabled`, ({ modifySelectors, separator }) => {
106-
modifySelectors(({ className }) => {
107-
return `${root}.${e(`${tv}${separator}disabled${separator}${className}`)}:disabled`
108-
})
109-
})
62+
themeVariants.forEach((tv) => {
63+
generateDefaultVariant(tv)
64+
generateGroupVariant(tv, 'group:hover', 'group-hover')
65+
generateGroupVariant(tv, 'group:focus', 'group-focus')
66+
generatePseudoClassVariant(tv, 'focus')
67+
generatePseudoClassVariant(tv, 'hover')
68+
generatePseudoClassVariant(tv, 'active')
69+
generatePseudoClassVariant(tv, 'visited')
70+
generatePseudoClassVariant(tv, 'disabled')
71+
generatePseudoClassVariant(tv, 'focus-within')
72+
generatePseudoClassVariant(tv, 'first-child', 'first')
73+
generatePseudoClassVariant(tv, 'last-child', 'last')
74+
generatePseudoClassVariant(tv, 'nth-child(even)', 'even')
75+
generatePseudoClassVariant(tv, 'nth-child(odd)', 'odd')
11076
})
11177
}

0 commit comments

Comments
 (0)