Skip to content

Commit 19fce51

Browse files
committed
Using class instead of inline-styles
1 parent 0f92e8f commit 19fce51

File tree

5 files changed

+53
-68
lines changed

5 files changed

+53
-68
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,5 @@ jspm_packages
3535

3636
# Optional REPL history
3737
.node_repl_history
38+
39+
.DS_Store

api.js

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@ let css = (rawCSS) => (parentClass, name, descriptor) => ({
2323
let rendered = descriptor.value.apply(getProps(this), arguments);
2424

2525
/* Replace props and return realCSS™ */
26-
let realCSS = fillProps(rawCSS, originalProps)
26+
let realCSS = fillProps(rawCSS, originalProps);
27+
let className = insertRules(realCSS);
2728

2829
/* Convert real CSS to javascripty CSS */
29-
let style = parseCss(realCSS);
30+
//let style = parseCss(realCSS);
3031

3132
/* Merge styles into original props */
32-
let newProps = {...originalProps, style};
33+
let newProps = {...originalProps, className};
3334

3435
/*
3536
Pass on a clone of the rendered component
@@ -68,25 +69,36 @@ let fillProps = (rawCSS, props) => {
6869
}
6970

7071
/*
71-
Convert realCSS to javascripty CSS
72-
73-
Split on semi-colon
74-
Trim the whitespace
75-
Split on :
76-
Camel case keys
72+
Add stylesheet for component
7773
*/
78-
let parseCss = (realCSS) => {
79-
let styles = {};
80-
let rules = realCSS.trim().split(';');
81-
for (let rule of rules) {
82-
let [key, value] = rule.trim().split(':');
83-
if (key && value) {
84-
key = camelCase(key.trim());
85-
value = value.trim();
86-
styles[key] = value;
87-
}
74+
75+
let insertRules = (realCSS) => {
76+
let sheet = getStyleSheet();
77+
let className = getHash(realCSS);
78+
sheet.insertRule(`.${className}{${realCSS}}`, sheet.cssRules.length);
79+
return className;
80+
}
81+
82+
let getHash = (string) => {
83+
/* Get random string */
84+
let hash = Math.random().toString(36).substring(22);
85+
/* CSS classnames should begin with an alphabet */
86+
return 'c' + hash;
87+
}
88+
89+
let getStyleSheet = () => {
90+
let sheets = document.styleSheets;
91+
let index = -1;
92+
for (let i = 0; i < sheets.length; i++) {
93+
if (sheets[i].title === 'css-constructor') index = i;
94+
}
95+
if (index !== -1) return sheets[index];
96+
else {
97+
let styleElement = document.createElement('style');
98+
styleElement.setAttribute('title', 'css-constructor');
99+
document.head.appendChild(styleElement);
100+
return styleElement.sheet;
88101
}
89-
return styles;
90102
}
91103

92104
let camelCase = (key) => key.replace(/(\-[a-z])/g, $1 => $1.toUpperCase().replace('-',''));

css-constructor.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/bundle.js

Lines changed: 17 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,6 @@
11
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
22
'use strict';
3-
Object.defineProperty(exports, '__esModule', { value: !0 });var _slicedToArray = function () {
4-
function sliceIterator(arr, i) {
5-
var _arr = [],
6-
_n = !0,
7-
_d = !1,
8-
_e = void 0;try {
9-
for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value), !(i && _arr.length === i)); _n = !0) {}
10-
} catch (err) {
11-
_d = !0, _e = err;
12-
} finally {
13-
try {
14-
!_n && _i['return'] && _i['return']();
15-
} finally {
16-
if (_d) throw _e;
17-
}
18-
}return _arr;
19-
}return function (arr, i) {
20-
if (Array.isArray(arr)) return arr;if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);throw new TypeError('Invalid attempt to destructure non-iterable instance');
21-
};
22-
}(),
23-
_extends = Object.assign || function (target) {
3+
Object.defineProperty(exports, '__esModule', { value: !0 });var _extends = Object.assign || function (target) {
244
for (var i = 1; i < arguments.length; i++) {
255
var source = arguments[i];for (var key in source) {
266
Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
@@ -33,12 +13,12 @@ Object.defineProperty(exports, '__esModule', { value: !0 });var _slicedToArray =
3313
return function (b, c, d) {
3414
return _extends({}, d, { value: function value() {
3515
var e = void 0,
36-
f = d.value.apply(function (j) {
37-
return e = j.props, j;
16+
f = d.value.apply(function (k) {
17+
return e = k.props, k;
3818
}(this), arguments),
3919
g = fillProps(a, e),
40-
h = parseCss(g),
41-
i = _extends({}, e, { style: h });return _react2.default.cloneElement(f, i, f.props.children);
20+
h = insertRules(g),
21+
j = _extends({}, e, { className: h });return _react2.default.cloneElement(f, j, f.props.children);
4222
} });
4323
};
4424
},
@@ -63,27 +43,18 @@ Object.defineProperty(exports, '__esModule', { value: !0 });var _slicedToArray =
6343
}
6444
}return a;
6545
},
66-
parseCss = function parseCss(a) {
67-
var b = {},
68-
c = a.trim().split(';');var _iteratorNormalCompletion2 = !0,
69-
_didIteratorError2 = !1,
70-
_iteratorError2 = void 0;try {
71-
for (var _step2, _iterator2 = c[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) {
72-
var d = _step2.value,
73-
_d$trim$split = d.trim().split(':'),
74-
_d$trim$split2 = _slicedToArray(_d$trim$split, 2),
75-
e = _d$trim$split2[0],
76-
f = _d$trim$split2[1];e && f && (e = camelCase(e.trim()), f = f.trim(), b[e] = f);
77-
}
78-
} catch (err) {
79-
_didIteratorError2 = !0, _iteratorError2 = err;
80-
} finally {
81-
try {
82-
!_iteratorNormalCompletion2 && _iterator2.return && _iterator2.return();
83-
} finally {
84-
if (_didIteratorError2) throw _iteratorError2;
85-
}
86-
}return b;
46+
insertRules = function insertRules(a) {
47+
var b = getStyleSheet(),
48+
c = getHash(a);return b.insertRule('.' + c + '{' + a + '}', b.cssRules.length), c;
49+
},
50+
getHash = function getHash() {
51+
var a = Math.random().toString(36).substring(22);return 'c' + a;
52+
},
53+
getStyleSheet = function getStyleSheet() {
54+
var a = document.styleSheets,
55+
b = -1;for (var c = 0; c < a.length; c++) {
56+
'css-constructor' === a[c].title && (b = c);
57+
}if (-1 !== b) return a[b];var _c = document.createElement('style');return _c.setAttribute('title', 'css-constructor'), document.head.appendChild(_c), _c.sheet;
8758
},
8859
camelCase = function camelCase(a) {
8960
return a.replace(/(\-[a-z])/g, function (b) {

example/css-constructor.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)