Skip to content

Commit 07ab8e6

Browse files
committedMar 13, 2018
feat: implement put() function
1 parent 32a7caf commit 07ab8e6

File tree

3 files changed

+68
-59
lines changed

3 files changed

+68
-59
lines changed
 

‎lib/ast.js

+28-34
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,41 @@
22

33
var interpolateSelectors = require('./interpolateSelectors');
44

5-
var KEBAB_REGEX = /[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g;
6-
var KEBAB_MATCHER = function(match) { return '-' + match.toLowerCase(); };
5+
var KEBAB_REGEX = /[A-Z]/g;
76

8-
function kebabCase(str) {
9-
return str.replace(KEBAB_REGEX, KEBAB_MATCHER);
10-
}
7+
function onDecls (selector, decls) {
8+
var selectors = selector.split(',');
9+
var str = '', strDecls = '';
10+
var prop, value;
1111

12-
exports.toCss = function toCss (pojso) {
13-
var str = '';
12+
for (prop in decls) {
13+
value = decls[prop];
1414

15-
for (var selector in pojso) {
16-
var values = pojso[selector];
15+
if (value instanceof Object) {
16+
var selectorsInterpolated = interpolateSelectors(selectors, prop);
17+
str += onDecls(selectorsInterpolated, value);
18+
} else {
19+
prop = prop.replace(KEBAB_REGEX, '-$&').toLowerCase();
20+
strDecls += prop + ':' + value + ';';
21+
}
22+
}
1723

18-
// Atrule: @media, @keyframe, ...
24+
return str + selector + '{' + strDecls + '}';
25+
}
26+
27+
function onStyles (styles) {
28+
var str = '', selector;
29+
30+
for (selector in styles) {
1931
if (selector[0] === '@') {
20-
str += selector + '{' + toCss(values) + '}';
32+
str += selector + '{' + onStyles(styles[selector]) + '}';
2133
} else {
22-
var selectors = selector.split(',');
23-
var declarations = '';
24-
25-
for (var prop in values) {
26-
var value = values[prop];
27-
28-
switch (typeof value) {
29-
case 'string':
30-
case 'number':
31-
prop = kebabCase(prop);
32-
declarations += prop + ':' + value + ';';
33-
break;
34-
case 'object': {
35-
var selectorsInterpolated = interpolateSelectors(selectors, prop);
36-
var obj = {};
37-
obj[selectorsInterpolated] = value;
38-
str += toCss(obj);
39-
break;
40-
}
41-
}
42-
}
43-
str += selectors + '{' + declarations + '}';
34+
str += onDecls(selector, styles[selector]);
4435
}
4536
}
4637

4738
return str;
48-
};
39+
}
40+
41+
exports.onDecls = onDecls;
42+
exports.onStyles = onStyles;

‎lib/index.js

+39-24
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,59 @@
11
'use strict';
22

3-
var h = require('react').createElement;
4-
var toCss = require('./ast').toCss;
5-
var hoistGlobalsAndWrapContext = require('./hoistGlobalsAndWrapContext');
63
var hash = require('./hash').hash;
4+
var interpolateSelectors = require('./interpolateSelectors');
75

8-
function stringify(styles, block) {
9-
return toCss(hoistGlobalsAndWrapContext(styles, '.' + block));
10-
}
11-
6+
var KEBAB_REGEX = /[A-Z]/g;
127
var isClient = typeof window === 'object';
138

14-
exports.create = function () {
9+
exports.create = function (h) {
1510
var renderer = {
1611
raw: '',
1712
cns: {},
1813
pfx: ' _',
1914
cnt: 0
2015
};
2116

17+
var putRaw;
18+
19+
if (isClient) {
20+
var sheet = document.head.appendChild(document.createElement('style')).sheet;
21+
putRaw = function (rawCss) {
22+
sheet.insertRule(rawCss, 0);
23+
};
24+
} else {
25+
putRaw = function (rawCss) {
26+
renderer.raw += rawCss;
27+
};
28+
}
29+
30+
function put (selector, decls) {
31+
var selectors = selector.split(',');
32+
var str = '';
33+
var prop, value;
34+
35+
for (prop in decls) {
36+
value = decls[prop];
37+
38+
if (value instanceof Object) {
39+
var selectorInterpolated = interpolateSelectors(selectors, prop);
40+
put(selectorInterpolated, value);
41+
} else {
42+
prop = prop.replace(KEBAB_REGEX, '-$&').toLowerCase();
43+
str += prop + ':' + value + ';';
44+
}
45+
}
46+
47+
str = selector + '{' + str + '}';
48+
49+
putRaw(str);
50+
}
51+
2252
renderer.rule = function(styles, block) {
2353
if (!block) {
2454
block = hash(styles);
2555
}
2656

27-
var rawCss = stringify(styles, block);
28-
2957
if (isClient) {
3058
if (process.env.NODE_ENV !== 'production') {
3159
if (isClient) {
@@ -46,22 +74,9 @@ exports.create = function () {
4674

4775
return;
4876
}
49-
50-
var el= document.createElement('style');
51-
52-
document.head.appendChild(el);
53-
54-
if (process.env.NODE_ENV !== 'production') {
55-
if (isClient) {
56-
el.id = 'css-' + block;
57-
}
58-
}
59-
60-
el.appendChild(document.createTextNode(rawCss));
61-
} else {
62-
this.raw += rawCss;
6377
}
6478

79+
put(block, styles);
6580
this.cns[block] = 1;
6681

6782
return ' ' + block;

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "pico-style",
2+
"name": "zepto-style",
33
"version": "0.0.1",
44
"description": "Smallest 4th gen CSS-in-JS library",
55
"main": "lib/index.js",

0 commit comments

Comments
 (0)