This repository was archived by the owner on Dec 15, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
80 lines (73 loc) · 3.78 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
const plugin = require('tailwindcss/plugin');
const _ = require('lodash');
const selectorParser = require('postcss-selector-parser');
const defaultOptions = {
variants: ['alt'],
};
module.exports = plugin.withOptions(function(options = {}) {
return function({ addVariant, config, e }) {
options = _.defaults({}, options, defaultOptions);
const prefixClass = function(className) {
const prefix = config('prefix');
const getPrefix = typeof prefix === 'function' ? prefix : () => prefix;
return `${getPrefix(`.${className}`)}${className}`;
};
_.forEach(options.variants, variant => {
const altVariant = function() {
return ({ modifySelectors, separator }) => {
modifySelectors(({ selector }) => {
return selectorParser(selectors => {
selectors.walkClasses(classNode => {
classNode.value = `${variant}${separator}${classNode.value}`;
classNode.parent.insertBefore(classNode, selectorParser().astSync(`.${e(variant)} `));
});
}).processSync(selector);
});
};
};
const altPseudoClassVariant = function(pseudoClass, pseudoSelector = null) {
pseudoSelector = pseudoSelector ? pseudoSelector : `:${pseudoClass}`;
return ({ modifySelectors, separator }) => {
modifySelectors(({ selector }) => {
return selectorParser(selectors => {
selectors.walkClasses(classNode => {
classNode.value = `${variant}${separator}${pseudoClass}${separator}${classNode.value}`;
classNode.parent.insertBefore(classNode, selectorParser().astSync(`.${e(variant)} `));
classNode.parent.insertAfter(classNode, selectorParser.pseudo({ value: pseudoSelector }));
});
}).processSync(selector);
});
};
};
const altGroupPseudoClassVariant = function(pseudoClass) {
return ({ modifySelectors, separator }) => {
modifySelectors(({ selector }) => {
return selectorParser(selectors => {
selectors.walkClasses(classNode => {
classNode.value = `${variant}${separator}group-${pseudoClass}${separator}${classNode.value}`;
classNode.parent.insertBefore(classNode, selectorParser().astSync(`.${e(variant)} .${prefixClass('group')}:${pseudoClass} `));
});
}).processSync(selector);
});
};
};
addVariant(`${variant}`, altVariant());
addVariant(`${variant}-hover`, altPseudoClassVariant('hover'));
addVariant(`${variant}-focus`, altPseudoClassVariant('focus'));
addVariant(`${variant}-focus-within`, altPseudoClassVariant('focus-within'));
addVariant(`${variant}-active`, altPseudoClassVariant('active'));
addVariant(`${variant}-visited`, altPseudoClassVariant('visited'));
addVariant(`${variant}-disabled`, altPseudoClassVariant('disabled'));
addVariant(`${variant}-first`, altPseudoClassVariant('first', ':first-child'));
addVariant(`${variant}-last`, altPseudoClassVariant('last', ':last-child'));
addVariant(`${variant}-odd`, altPseudoClassVariant('odd', ':nth-child(odd)'));
addVariant(`${variant}-even`, altPseudoClassVariant('even', ':nth-child(even)'));
addVariant(`${variant}-group-hover`, altGroupPseudoClassVariant('hover'));
addVariant(`${variant}-group-focus`, altGroupPseudoClassVariant('focus'));
addVariant(`${variant}-group-focus-within`, altGroupPseudoClassVariant('focus-within'));
addVariant(`${variant}-group-active`, altGroupPseudoClassVariant('active'));
addVariant(`${variant}-group-visited`, altGroupPseudoClassVariant('visited'));
addVariant(`${variant}-group-disabled`, altGroupPseudoClassVariant('disabled'));
});
};
});