Skip to content

Commit 005dd68

Browse files
committed
feat: add inline-style-prefixer addon
1 parent a44f8bf commit 005dd68

File tree

4 files changed

+81
-2
lines changed

4 files changed

+81
-2
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {createElement as h} from 'react';
2+
import {storiesOf} from '@storybook/react';
3+
const {action} = require('@storybook/addon-actions');
4+
const {linkTo} = require('@storybook/addon-links');
5+
const {create} = require('../index');
6+
const {addon: addonRule} = require('../addon/rule');
7+
const {addon: addonPrefixer} = require('../addon/inline-style-prefixer');
8+
9+
const renderer = create();
10+
addonRule(renderer);
11+
addonPrefixer(renderer);
12+
const {rule} = renderer;
13+
14+
const className1 = rule({
15+
alignItems: 'center'
16+
});
17+
18+
storiesOf('Addons/inline-style-prefixer', module)
19+
.add('Default', () =>
20+
h('div', {className: className1}, 'Hello world')
21+
)

addon/inline-style-prefixer.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
'use strict';
2+
3+
var prefixAll = require('inline-style-prefixer/static');
4+
5+
var CAMEL_REGEX = /-[a-z\u00E0-\u00F6\u00F8-\u00FE]/g;
6+
7+
var matchCallback = function (match) {
8+
return match.slice(1).toUpperCase();
9+
};
10+
11+
exports.addon = function (renderer) {
12+
var decl = renderer.decl;
13+
14+
renderer.toCamel = function (prop) {
15+
return prop.replace(CAMEL_REGEX, matchCallback);
16+
};
17+
18+
renderer.prefix = function (prop, value) {
19+
var obj = {};
20+
obj[renderer.toCamel(prop)] = value;
21+
obj = prefixAll(obj);
22+
23+
var str = '';
24+
25+
for (var propPrefixed in obj) {
26+
str += propPrefixed + ':' + obj[propPrefixed] + ';';
27+
}
28+
29+
return str;
30+
};
31+
32+
renderer.decl = function (prop, value) {
33+
var str = decl(prop, value);
34+
var declarations = str.split(';');
35+
36+
if (!declarations.length) {
37+
return str;
38+
}
39+
40+
var prefixed = '';
41+
42+
for (var i = 0; i < declarations.length; i++) {
43+
var declaration = declarations[i];
44+
45+
if (declaration) {
46+
var pos = declaration.indexOf(':');
47+
48+
prefixed += renderer.prefix(declaration.substr(0, pos), declaration.substr(pos + 1));
49+
}
50+
}
51+
52+
return prefixed;
53+
};
54+
};

index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ exports.create = function (config) {
2020
client: typeof window === 'object',
2121
assign: assign,
2222
stringify: JSON.stringify,
23+
toKebab: function (prop) {
24+
return prop.replace(KEBAB_REGEX, '-$&').toLowerCase();
25+
},
2326
decl: function (key, value) {
24-
key = key.replace(KEBAB_REGEX, '-$&').toLowerCase();
27+
key = renderer.toKebab(key);
2528
return key + ':' + value + ';';
2629
},
2730
hash: function (obj) {

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
},
3838
"dependencies": {
3939
"fastest-stable-stringify": "^1.0.1",
40-
"stylis": "3.5.0"
40+
"stylis": "3.5.0",
41+
"inline-style-prefixer": "^4.0.0"
4142
},
4243
"devDependencies": {
4344
"@types/react": "16.0.40",

0 commit comments

Comments
 (0)