apphouse
Version:
Component library for React that uses observable state management and theme-able components.
80 lines (73 loc) • 2.17 kB
text/typescript
import { ThemeFull } from '../../styles/defaults/themes.interface';
import { Palette } from '../Palette';
import { Style } from '../Style';
import { Token } from '../Token';
import { StyleType } from '../style.interface';
import { TokenType } from '../token.interface';
import { PaletteType, ThemeModeType } from '../palette.interface';
export const objTokensToTokens = (
tokens: TokenType[]
): Record<string, Token> => {
const tkns: Record<string, Token> = {};
tokens.forEach((token) => {
const tokenId = `${token.type}.${token.key}`;
if (!tkns[tokenId]) {
tkns[tokenId] = objTokenToToken(token);
}
});
return tkns;
};
export const objStylesToStyles = (
styles: StyleType[]
): Record<string, Style> => {
const s: Record<string, Style> = {};
styles.forEach((style) => {
const id = style.id;
s[id] = objStyleToStyle(style);
});
return s;
};
export const objThemeToTheme = (
themeObj: ThemeFull
): {
palette: Record<string, Palette>;
tokens: Record<string, Token>;
styles: Record<string, Style>;
} => {
const theme = {
palette: PaletteUtils.objPaletteToPalettes(themeObj.colors),
tokens: objTokensToTokens(themeObj.tokens),
styles: objStylesToStyles(themeObj.styles)
};
return theme;
};
export const objTokenToToken = (token: TokenType): Token => {
return new Token(token);
};
export const objStyleToStyle = (style: StyleType): Style => {
return new Style(style);
};
export class PaletteUtils {
static objPaletteToPalettes = (
palette: PaletteType[]
): { [paletteId: string]: Palette } => {
const colors: { [paletteId: string]: Palette } = {};
palette?.forEach((p) => {
if (colors && p.id && !colors[p.id]) {
colors[p.id] = PaletteUtils.objPaletteToPalette(p);
}
});
return colors;
};
static objPaletteToPalette = (palette: PaletteType): Palette => {
return new Palette({
title: palette.title,
id: palette.id,
description: palette.description,
mode: palette.mode as ThemeModeType,
referenceThemeId: palette.referenceThemeId || '',
themeId: palette.themeId || '',
colors: palette.colors
});
};
}