Skip to content

Commit 419511b

Browse files
committed
feat: add supportn for pseudo classes
1 parent 609c251 commit 419511b

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

examples/webpack/styles.react.css

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ Header {
77
font-size: 200%;
88
font-weight: bold;
99
color: black;
10+
11+
:hover {
12+
color: red;
13+
}
1014
}
1115

1216
Content {

src/index.js

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as types from 'babel-types';
77
import * as postcss from 'postcss';
88
import * as LoaderUtils from 'loader-utils';
99
import generate from 'babel-generator';
10+
import transformVariants, {isVariant} from './transformVariants';
1011

1112
const LOADER = require.resolve('../webpack');
1213

@@ -35,6 +36,7 @@ export function render(source: string, config: RenderConfig = {}): {js: string;
3536

3637
function renderToCSS(source: string, config: RenderConfig): string {
3738
let root = postcss.parse(source);
39+
root = transformVariants(root);
3840
root.walkRules(node => {
3941
let cssNode = node.clone();
4042
cssNode.selector = `:local(.${node.selector})`;
@@ -47,6 +49,9 @@ function renderToJS(source: string, config: RenderConfig): string {
4749
let root = postcss.parse(source);
4850
let statements = [];
4951
root.walkRules(node => {
52+
if (isVariant(node)) {
53+
return;
54+
}
5055
statements.push(exportComponent(node.selector, 'div', node.selector));
5156
});
5257
statements.unshift(

src/transformVariants.js

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* @copyright 2016-present, React CSS Components team
3+
* @flow
4+
*/
5+
6+
export default function transformVariants(root) {
7+
let rules = [];
8+
root.walkRules(rule => {
9+
if (!isVariant(rule)) {
10+
return;
11+
}
12+
let component = findComponent(rule);
13+
rule = rule.remove().clone();
14+
rule.selector = component.selector + rule.selector;
15+
rules.push(rule);
16+
});
17+
root.append(...rules);
18+
return root;
19+
}
20+
21+
export function isVariant(node) {
22+
return (
23+
node.type === 'rule' &&
24+
node.selector.charAt(0) === ':'
25+
);
26+
}
27+
28+
function findComponent(node) {
29+
while (true) {
30+
if (node.type === 'rule' && !isVariant(node)) {
31+
return node;
32+
}
33+
if (!node.parent) {
34+
break;
35+
}
36+
node = node.parent;
37+
}
38+
return null;
39+
}

0 commit comments

Comments
 (0)