Skip to content
This repository was archived by the owner on Dec 15, 2024. It is now read-only.

Commit 5ae5f76

Browse files
committed
Initial commit
0 parents  commit 5ae5f76

File tree

8 files changed

+7680
-0
lines changed

8 files changed

+7680
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/node_modules/

.release-it.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"git": {
3+
"tagName": "v%s"
4+
}
5+
}

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Changelog
2+
3+
All notable changes to this project will be documented in this file.
4+
5+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6+
and this project mostly adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7+
8+
## [1.0.0] - 2019-12-20
9+
10+
Initial release
11+
12+
[Unreleased]: https://github.com/benface/tailwindcss-alt/compare/v1.0.0...HEAD
13+
[1.0.0]: https://github.com/benface/tailwindcss-alt/releases/tag/v1.0.0

README.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# Alt Variant Plugin for Tailwind CSS
2+
3+
## Installation
4+
5+
```bash
6+
npm install tailwindcss-alt
7+
```
8+
9+
## Usage
10+
11+
```js
12+
// tailwind.config.js
13+
{
14+
variants: {
15+
display: ['alt', 'alt-hover', 'alt-focus', 'alt-focus-within', 'alt-active', 'alt-visited', 'alt-disabled', 'alt-group-hover', 'alt-group-focus', 'alt-group-focus-within', 'alt-group-active', 'alt-group-visited', 'alt-group-disabled', 'responsive'],
16+
},
17+
plugins: [
18+
require('tailwindcss-alt')({
19+
className: 'alt', // defaults to this value
20+
}),
21+
],
22+
}
23+
```
24+
25+
The above configuration would generate the following CSS:
26+
27+
```css
28+
.block {
29+
display: block;
30+
}
31+
32+
.alt .alt\:block {
33+
display: block;
34+
}
35+
36+
.alt .alt\:hover\:block:hover {
37+
display: block;
38+
}
39+
40+
.alt .alt\:focus\:block:focus {
41+
display: block;
42+
}
43+
44+
.alt .alt\:focus-within\:block:focus-within {
45+
display: block;
46+
}
47+
48+
.alt .alt\:active\:block:active {
49+
display: block;
50+
}
51+
52+
.alt .alt\:visited\:block:visited {
53+
display: block;
54+
}
55+
56+
.alt .alt\:disabled\:block:disabled {
57+
display: block;
58+
}
59+
60+
.alt .group:hover .alt\:group-hover\:block {
61+
display: block;
62+
}
63+
64+
.alt .group:focus .alt\:group-focus\:block {
65+
display: block;
66+
}
67+
68+
.alt .group:focus-within .alt\:group-focus-within\:block {
69+
display: block;
70+
}
71+
72+
.alt .group:active .alt\:group-active\:block {
73+
display: block;
74+
}
75+
76+
.alt .group:visited .alt\:group-visited\:block {
77+
display: block;
78+
}
79+
80+
.alt .group:disabled .alt\:group-disabled\:block {
81+
display: block;
82+
}
83+
84+
/* etc. */
85+
```
86+
87+
Which you can then use in your HTML like this:
88+
89+
```html
90+
<header class="alt">
91+
<img class="block alt:hidden" src="logo.png">
92+
<img class="hidden alt:block" src="alt-logo.png">
93+
94+
<a class="text-black hover:text-blue alt:text-white alt:hover:text-green">Home</a>
95+
96+
<div class="group">
97+
<div class="group-hover:opacity-50 alt:group-hover:opacity-100">...</div>
98+
</div>
99+
</header>
100+
```

index.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
const _ = require('lodash');
2+
const selectorParser = require('postcss-selector-parser');
3+
4+
module.exports = function(options = {}) {
5+
return ({ addVariant }) => {
6+
const defaultOptions = {
7+
className: 'alt',
8+
};
9+
options = _.defaults({}, options, defaultOptions);
10+
11+
const altPseudoClassVariant = function(pseudoClass) {
12+
return ({ modifySelectors, separator }) => {
13+
modifySelectors(({ selector }) => {
14+
return selectorParser(selectors => {
15+
selectors.walkClasses(classNode => {
16+
classNode.value = `${options.className}${separator}${pseudoClass}${separator}${classNode.value}`;
17+
classNode.parent.insertBefore(classNode, selectorParser().astSync(`.${options.className} `));
18+
classNode.parent.insertAfter(classNode, selectorParser.pseudo({ value: `:${pseudoClass}` }));
19+
});
20+
}).processSync(selector);
21+
});
22+
};
23+
};
24+
25+
const altGroupPseudoClassVariant = function(pseudoClass) {
26+
return ({ modifySelectors, separator }) => {
27+
modifySelectors(({ selector }) => {
28+
return selectorParser(selectors => {
29+
selectors.walkClasses(classNode => {
30+
classNode.value = `${options.className}${separator}group-${pseudoClass}${separator}${classNode.value}`;
31+
classNode.parent.insertBefore(classNode, selectorParser().astSync(`.${options.className} .group:${pseudoClass} `));
32+
});
33+
}).processSync(selector);
34+
});
35+
};
36+
};
37+
38+
addVariant('alt', ({ modifySelectors, separator }) => {
39+
modifySelectors(({ selector }) => {
40+
return selectorParser(selectors => {
41+
selectors.walkClasses(classNode => {
42+
classNode.value = `${options.className}${separator}${classNode.value}`;
43+
classNode.parent.insertBefore(classNode, selectorParser().astSync(`.${options.className} `));
44+
});
45+
}).processSync(selector);
46+
});
47+
});
48+
49+
addVariant('alt-hover', altPseudoClassVariant('hover'));
50+
addVariant('alt-focus', altPseudoClassVariant('focus'));
51+
addVariant('alt-focus-within', altPseudoClassVariant('focus-within'));
52+
addVariant('alt-active', altPseudoClassVariant('active'));
53+
addVariant('alt-visited', altPseudoClassVariant('visited'));
54+
addVariant('alt-disabled', altPseudoClassVariant('disabled'));
55+
addVariant('alt-group-hover', altGroupPseudoClassVariant('hover'));
56+
addVariant('alt-group-focus', altGroupPseudoClassVariant('focus'));
57+
addVariant('alt-group-focus-within', altGroupPseudoClassVariant('focus-within'));
58+
addVariant('alt-group-active', altGroupPseudoClassVariant('active'));
59+
addVariant('alt-group-visited', altGroupPseudoClassVariant('visited'));
60+
addVariant('alt-group-disabled', altGroupPseudoClassVariant('disabled'));
61+
};
62+
};

0 commit comments

Comments
 (0)