@bruitt/classnames
Version:
A simple utility to manage CSS modules with SUIT CSS -like naming conventions on React
85 lines (64 loc) • 2.33 kB
JavaScript
import flatten from 'ramda/src/flatten';
import type from 'ramda/src/type';
import uniq from 'ramda/src/uniq';
var settings = {
prefix: "_",
separator: "-"
};
var is = {};
["String", "Boolean", "Array", "Object", "Number"].forEach(function (typeKey) {
is[typeKey] = function (object) { return type(object) === typeKey; };
});
var exclude = function (array) {
return array.filter(function (el) { return is.String(el) && el.trim() !== ""; }).map(function (className) { return className.trim(); });
};
var split = function (className) { return className.trim().split(/ +/); };
var toClassName = function (names) { return names.join(" ").trim(); };
var getModifier = function (key, value, prefix, separator) {
if (is.String(value) || is.Number(value)) {
return prefix + key + separator + value;
}
return prefix + key;
};
var getClassNames = function (propNames, props, prefix, separator) {
if ( prefix === void 0 ) prefix = "";
if ( separator === void 0 ) separator = "";
if (is.Object(props)) {
return Object.keys(props).filter(function (name) { return props[name]; }).map(function (name) { return propNames[getModifier(name, props[name], prefix, separator)]; });
}
if (is.Array(props)) {
return props.map(function (name) { return propNames[name] || name; });
}
return [];
};
var classnames = function (classes) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
if (!classes) {
return "";
}
var prefix = settings.prefix;
var separator = settings.separator;
var mapArg = function (arg) {
switch (type(arg)) {
case "String":
return getClassNames(classes, split(arg), prefix, separator);
case "Array":
case "Object":
return getClassNames(classes, arg, prefix, separator);
default:
return null;
}
};
var classNames = flatten(args.map(mapArg));
return toClassName(exclude(uniq(classNames)));
};
var withStyles = function (classes) { return function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return classnames.apply(void 0, [ classes ].concat( args ));
} };
classnames.settings = settings;
export default classnames;
export { withStyles };
//# sourceMappingURL=classnames.module.js.map