11const 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