@quarkly/atomize
Version:
Library for creating atomic react components
350 lines (282 loc) • 10.5 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports["default"] = exports.sortByBreakpointsOrder = exports.getSortedBreakpoints = exports.createChainStream = exports.replaceKey = exports.createOverriderStyles = exports.createStyleRule = exports.createMediaWrapper = exports.createEffectWrapper = exports.createCssRule = exports.ruleExists = exports.transformVar = exports.testExistPrefix = exports.trimComma = exports.getThemePrefix = exports.getTransformer = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _camelCase2 = _interopRequireDefault(require("lodash/camelCase"));
var _sortBy2 = _interopRequireDefault(require("lodash/sortBy"));
var _memoize2 = _interopRequireDefault(require("lodash/memoize"));
var _get2 = _interopRequireDefault(require("lodash/get"));
var _merge2 = _interopRequireDefault(require("lodash/merge"));
var _flow2 = _interopRequireDefault(require("lodash/flow"));
var _dict = _interopRequireWildcard(require("../constants/dict"));
var _theme = require("../constants/theme");
var _theme2 = require("../utils/theme");
var _splitCssRule = _interopRequireDefault(require("./split-css-rule"));
var _validate = _interopRequireDefault(require("../utils/validate"));
var _transformers = _interopRequireWildcard(require("../utils/transformers"));
var _modifiers = require("../utils/modifiers");
var _searchRule = require("./search-rule");
var getTransformer = function getTransformer(name) {
return (0, _get2["default"])(_transformers["default"], name, _transformers.defaultTransformer);
};
exports.getTransformer = getTransformer;
var getThemePrefix = function getThemePrefix(key) {
if (key.endsWith('-color')) return 'color';
if (_theme.themeProps.includes(key)) return (0, _camelCase2["default"])(key);
return '';
};
exports.getThemePrefix = getThemePrefix;
var trimComma = function trimComma(value) {
if (typeof value !== 'string') return value;
return (0, _splitCssRule["default"])(value).filter(function (v) {
return v;
}).join(',');
};
exports.trimComma = trimComma;
var testExistPrefix = function testExistPrefix(name) {
var splited = name.split('-') || [];
if (splited.length <= 1) return false;
return _theme.themePrefixes.includes(splited[0]);
};
exports.testExistPrefix = testExistPrefix;
var transformVar = function transformVar(key, value) {
if (typeof value !== 'string' || value.indexOf('--') === -1) return value;
var prefix = getThemePrefix(key);
return value.replace(/(^|\s|,|calc\()(?:var\()?--([^,\s]*)/gi, function (res, before, name) {
if (res.includes('var(')) return res;
if (prefix && !testExistPrefix(name)) return before + "var(--qtheme-" + prefix + "-" + name + ")";
return before + "var(--qtheme-" + name + ")";
});
};
exports.transformVar = transformVar;
var ruleExists = function ruleExists(key, config) {
if (!config) return _dict.hashPropsWithAliases[key];
if (config.useAliases) return _dict.hashPropsWithAliases[key];
return _dict["default"][key];
};
exports.ruleExists = ruleExists;
var createCssRule = function createCssRule(_ref) {
var propKey = _ref.propKey,
value = _ref.value,
props = _ref.props,
config = _ref.config;
var currentKey = propKey[0],
otherKeys = propKey.slice(1);
if (!ruleExists(currentKey, config)) return {};
var _hashPropsWithAliases = _dict.hashPropsWithAliases[currentKey],
transformer = _hashPropsWithAliases.transformer,
compose = _hashPropsWithAliases.compose;
var transform = getTransformer(transformer);
var createCss = function createCss(n, key) {
var _ref2;
var resultValue = trimComma(transformVar(key, transform(n, [])));
var isValid = typeof resultValue === 'string' ? (0, _validate["default"])(resultValue) : true;
if (!isValid) return null;
return _ref2 = {}, _ref2[key] = resultValue, _ref2;
};
var css = compose ? compose.reduce(function (acc, composeKey) {
var cCss = createCss(value, composeKey);
return (0, _merge2["default"])(acc, cCss);
}, {}) : createCss(value, _dict.hashPropsWithAliases[currentKey].name);
return {
propKey: otherKeys,
value: value,
css: css,
props: props,
config: config
};
};
exports.createCssRule = createCssRule;
var createEffectWrapper = function createEffectWrapper(_ref3) {
var _newCss;
var propKey = _ref3.propKey,
value = _ref3.value,
props = _ref3.props,
css = _ref3.css,
config = _ref3.config;
if (!css) return {};
var currentKey = propKey[0],
otherKeys = propKey.slice(1);
var effects = config.effects;
if (!effects) {
return {
propKey: propKey,
value: value,
css: css,
props: props,
config: config
};
}
var effectNames = Object.keys(effects);
if (!effectNames || !effectNames.length) {
return {
propKey: propKey,
value: value,
css: css,
props: props,
config: config
};
} // текущий ключ - не медиа выражение
if (!effects[currentKey]) {
return {
propKey: propKey,
value: value,
css: css,
props: props,
config: config
};
}
var effectCssKey = effects[currentKey];
var newCss = (_newCss = {}, _newCss["&" + effectCssKey + ", &[data-quarkly-state=\"" + currentKey + "\"]"] = css, _newCss);
return {
propKey: otherKeys,
value: value,
css: newCss,
props: props,
config: config
};
};
exports.createEffectWrapper = createEffectWrapper;
var createMediaWrapper = function createMediaWrapper(_ref4) {
var _newCss2;
var propKey = _ref4.propKey,
value = _ref4.value,
props = _ref4.props,
css = _ref4.css,
config = _ref4.config;
if (!css) return {};
var currentKey = propKey[0];
var breakpoints = (0, _theme2.getBreakpoints)(props);
if (!breakpoints[currentKey]) return {
propKey: propKey,
value: value,
css: css,
props: props,
config: config
};
var mediaSelector = breakpoints[currentKey];
var newCss = (_newCss2 = {}, _newCss2[mediaSelector] = css, _newCss2);
return {
propKey: currentKey,
value: value,
css: newCss,
config: config
};
};
exports.createMediaWrapper = createMediaWrapper;
var createStyleRule = (0, _flow2["default"])([createCssRule, createEffectWrapper, createMediaWrapper]);
exports.createStyleRule = createStyleRule;
var createOverriderStyles = function createOverriderStyles(overriders) {
return function (props) {
return overriders.reduce(function (acc, ov) {
return (0, _merge2["default"])(acc, ov(props));
}, {});
};
};
exports.createOverriderStyles = createOverriderStyles;
var replaceKey = function replaceKey(key, replaced) {
return key.replace(replaced, '').split('-').filter(function (a) {
return a;
}).join('-');
};
exports.replaceKey = replaceKey;
var createChunks = function createChunks(props, config) {
return Object.entries(props).reduce(function (acc, _ref5) {
var key = _ref5[0],
value = _ref5[1];
var ruleChain = (0, _searchRule.searchRuleInKey)(key);
if (!ruleChain) return acc;
key = replaceKey(key, ruleChain);
var effectChain = (0, _searchRule.searchEffectInKey)(key, config.effects || {});
if (effectChain) {
key = replaceKey(key, effectChain);
}
var breakpoints = (0, _theme2.themeGet)(props, 'breakpoints', {});
var breackpointChain = (0, _searchRule.searchBreakpointInKey)(key, breakpoints);
acc.push({
chains: {
ruleChain: ruleChain,
breackpointChain: breackpointChain,
effectChain: effectChain
},
value: value
});
return acc;
}, []);
};
var createChainStream = function createChainStream(chains) {
var ruleChain = chains.ruleChain,
effectChain = chains.effectChain,
breackpointChain = chains.breackpointChain;
var listChains = [ruleChain, effectChain, breackpointChain];
return listChains.filter(function (a) {
return a;
});
};
exports.createChainStream = createChainStream;
var getSortedBreakpoints = (0, _memoize2["default"])(function (breakpoints) {
return (0, _sortBy2["default"])(Object.entries(breakpoints), function (_ref6) {
var _ref6$ = _ref6[1],
item = _ref6$[0];
return item.type === 'max-width' ? -1 : 1;
}, function (_ref7) {
var _ref7$ = _ref7[1],
item = _ref7$[0];
return item.value * (item.type === 'max-width' ? -1 : 1);
});
});
exports.getSortedBreakpoints = getSortedBreakpoints;
var sortByBreakpointsOrder = function sortByBreakpointsOrder(chunks, props) {
var sortedBreakpoints = getSortedBreakpoints((0, _theme2.themeGet)(props, 'breakpoints'));
return (0, _sortBy2["default"])(chunks, function (_ref8) {
var chains = _ref8.chains;
return sortedBreakpoints.findIndex(function (_ref9) {
var key = _ref9[0];
return key === chains.breackpointChain;
});
});
};
exports.sortByBreakpointsOrder = sortByBreakpointsOrder;
var _default = function _default(config, defaultProps) {
if (defaultProps === void 0) {
defaultProps = {};
}
return function (componentProps) {
var props = (0, _extends2["default"])((0, _extends2["default"])({}, defaultProps), componentProps);
var deps = [];
if (config.name) {
deps.push((0, _modifiers.themed)(config.name));
}
if (config.variant) {
deps.push((0, _modifiers.variants)(config.variant));
}
if (config.mixins) {
deps.push(_modifiers.mixins);
} // apply styles in breakpoints order
var overrider = createOverriderStyles(deps);
var chunks = sortByBreakpointsOrder(createChunks(props, config), props);
var cleanedProps = (0, _extends2["default"])({}, props);
var cssObject = chunks.reduce(function (acc, _ref10) {
var chains = _ref10.chains,
value = _ref10.value;
var propKey = createChainStream(chains);
var _createStyleRule = createStyleRule({
propKey: propKey,
value: value,
props: props,
config: config
}),
css = _createStyleRule.css;
if (!css) return acc;
delete cleanedProps[propKey.reverse().join('-')];
return (0, _merge2["default"])(acc, css);
}, overrider(props));
return {
cssObject: cssObject,
cleanedProps: cleanedProps
};
};
};
exports["default"] = _default;