46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
const DEPENDENCIES = {};
|
|
|
|
export default function defineTheme (theme) {
|
|
return generateModifiers(theme)(theme);
|
|
}
|
|
|
|
function generateModifiers (components) {
|
|
return compose(Object.keys(components).map(function (component) {
|
|
return compose(getDependencies(component).map(function (dependency) {
|
|
return getModifier(component, dependency);
|
|
}));
|
|
}, idp));
|
|
}
|
|
|
|
function getDependencies (component) {
|
|
return DEPENDENCIES[component] || [];
|
|
}
|
|
|
|
function idp (x) {
|
|
return x;
|
|
}
|
|
|
|
|
|
function compose (fns) {
|
|
return fns.reduce(function (f, g) {
|
|
return function (x) {
|
|
return f(g(x));
|
|
};
|
|
}, idp);
|
|
}
|
|
|
|
function getModifier (component, dependency) {
|
|
return function dependencyThemeModifier (theme) {
|
|
return { ...theme, [dependency]: modifyClasses(theme[dependency], theme[component])
|
|
};
|
|
};
|
|
}
|
|
|
|
function modifyClasses (baseTheme = {}, dependentTheme) {
|
|
return Object.keys(baseTheme).reduce((result, baseKey) => (
|
|
dependentTheme[baseKey]
|
|
? { ...result, [baseKey]: `${baseTheme[baseKey]} ${dependentTheme[baseKey]}` }
|
|
: result
|
|
), baseTheme);
|
|
}
|