@arwes/theme
Version:
Futuristic Sci-Fi UI Web Framework
76 lines (75 loc) • 3.14 kB
JavaScript
import { createThemeMultiplier } from '../createThemeMultiplier/index.js';
import { createThemeUnit } from '../createThemeUnit/index.js';
import { createThemeColor } from '../createThemeColor/index.js';
import { createThemeStyle } from '../createThemeStyle/index.js';
import { createThemeBreakpoints } from '../createThemeBreakpoints/index.js';
const extendDeepObject = (structure, defaults, extension) => {
const newObject = {};
Object.keys(structure).forEach((key) => {
if (typeof structure[key] === 'object') {
if (structure[key] === null) {
throw new Error('Theme structure values can not be null.');
}
if (!defaults[key] || typeof defaults[key] !== 'object') {
throw new Error('Theme default value should match theme structure object.');
}
newObject[key] = extendDeepObject(structure[key], defaults[key], extension?.[key]);
}
else {
newObject[key] = extension?.[key] ?? defaults[key];
}
});
return newObject;
};
const createDeepThemeSetup = (structure, settings) => {
const newObject = {};
Object.keys(structure).forEach((key) => {
if (typeof structure[key] === 'object') {
newObject[key] = createDeepThemeSetup(structure[key], settings[key]);
}
else {
switch (structure[key]) {
case 'multiplier':
newObject[key] = createThemeMultiplier(settings[key]);
break;
case 'unit':
newObject[key] = createThemeUnit(settings[key]);
break;
case 'color':
newObject[key] = createThemeColor(settings[key]);
break;
case 'style':
newObject[key] = createThemeStyle(settings[key]);
break;
case 'breakpoints':
newObject[key] = createThemeBreakpoints(settings[key]);
break;
case 'other':
newObject[key] = settings[key];
break;
default:
throw new Error(`Invalid theme structure key "${structure[key]}" provided.`);
}
}
});
return newObject;
};
const createCreateTheme = (themeStructure, themeSettingsDefaults) => {
const createTheme = (themeSettingsExtensions = {}) => {
let themeSettings;
if (Array.isArray(themeSettingsExtensions)) {
themeSettings = themeSettingsExtensions.reduce((settingsTotal, settingsItem) => {
if (!settingsItem) {
return settingsTotal;
}
return extendDeepObject(themeStructure, settingsTotal, settingsItem);
}, themeSettingsDefaults);
}
else {
themeSettings = extendDeepObject(themeStructure, themeSettingsDefaults, themeSettingsExtensions);
}
return createDeepThemeSetup(themeStructure, themeSettings);
};
return createTheme;
};
export { createCreateTheme };