UNPKG

@arwes/theme

Version:

Futuristic Sci-Fi UI Web Framework

76 lines (75 loc) 3.14 kB
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 };