145 lines
3.6 KiB
JavaScript
145 lines
3.6 KiB
JavaScript
import createCache from '@emotion/cache';
|
|
import { serializeStyles } from '@emotion/serialize';
|
|
import { getRegisteredStyles, insertStyles } from '@emotion/utils';
|
|
|
|
function insertWithoutScoping(cache, serialized) {
|
|
if (cache.inserted[serialized.name] === undefined) {
|
|
return cache.insert('', serialized, cache.sheet, true);
|
|
}
|
|
}
|
|
|
|
function merge(registered, css, className) {
|
|
var registeredStyles = [];
|
|
var rawClassName = getRegisteredStyles(registered, registeredStyles, className);
|
|
|
|
if (registeredStyles.length < 2) {
|
|
return className;
|
|
}
|
|
|
|
return rawClassName + css(registeredStyles);
|
|
}
|
|
|
|
var createEmotion = function createEmotion(options) {
|
|
var cache = createCache(options); // $FlowFixMe
|
|
|
|
cache.sheet.speedy = function (value) {
|
|
if (process.env.NODE_ENV !== 'production' && this.ctr !== 0) {
|
|
throw new Error('speedy must be changed before any rules are inserted');
|
|
}
|
|
|
|
this.isSpeedy = value;
|
|
};
|
|
|
|
cache.compat = true;
|
|
|
|
var css = function css() {
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
var serialized = serializeStyles(args, cache.registered, undefined);
|
|
insertStyles(cache, serialized, false);
|
|
return cache.key + "-" + serialized.name;
|
|
};
|
|
|
|
var keyframes = function keyframes() {
|
|
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
args[_key2] = arguments[_key2];
|
|
}
|
|
|
|
var serialized = serializeStyles(args, cache.registered);
|
|
var animation = "animation-" + serialized.name;
|
|
insertWithoutScoping(cache, {
|
|
name: serialized.name,
|
|
styles: "@keyframes " + animation + "{" + serialized.styles + "}"
|
|
});
|
|
return animation;
|
|
};
|
|
|
|
var injectGlobal = function injectGlobal() {
|
|
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
args[_key3] = arguments[_key3];
|
|
}
|
|
|
|
var serialized = serializeStyles(args, cache.registered);
|
|
insertWithoutScoping(cache, serialized);
|
|
};
|
|
|
|
var cx = function cx() {
|
|
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
args[_key4] = arguments[_key4];
|
|
}
|
|
|
|
return merge(cache.registered, css, classnames(args));
|
|
};
|
|
|
|
return {
|
|
css: css,
|
|
cx: cx,
|
|
injectGlobal: injectGlobal,
|
|
keyframes: keyframes,
|
|
hydrate: function hydrate(ids) {
|
|
ids.forEach(function (key) {
|
|
cache.inserted[key] = true;
|
|
});
|
|
},
|
|
flush: function flush() {
|
|
cache.registered = {};
|
|
cache.inserted = {};
|
|
cache.sheet.flush();
|
|
},
|
|
// $FlowFixMe
|
|
sheet: cache.sheet,
|
|
cache: cache,
|
|
getRegisteredStyles: getRegisteredStyles.bind(null, cache.registered),
|
|
merge: merge.bind(null, cache.registered, css)
|
|
};
|
|
};
|
|
|
|
var classnames = function classnames(args) {
|
|
var cls = '';
|
|
|
|
for (var i = 0; i < args.length; i++) {
|
|
var arg = args[i];
|
|
if (arg == null) continue;
|
|
var toAdd = void 0;
|
|
|
|
switch (typeof arg) {
|
|
case 'boolean':
|
|
break;
|
|
|
|
case 'object':
|
|
{
|
|
if (Array.isArray(arg)) {
|
|
toAdd = classnames(arg);
|
|
} else {
|
|
toAdd = '';
|
|
|
|
for (var k in arg) {
|
|
if (arg[k] && k) {
|
|
toAdd && (toAdd += ' ');
|
|
toAdd += k;
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
toAdd = arg;
|
|
}
|
|
}
|
|
|
|
if (toAdd) {
|
|
cls && (cls += ' ');
|
|
cls += toAdd;
|
|
}
|
|
}
|
|
|
|
return cls;
|
|
};
|
|
|
|
export default createEmotion;
|