ens-usernames/app/ui/theme/palettes.js

67 lines
1.7 KiB
JavaScript
Raw Normal View History

/* @flow */
import status from './status.json'
// These need to match the names in the Open Color palettes
const THEME_NAME = 'Status UI'
const THEME_DARK_NAME = 'Status UI Dark'
const BRAND_NAME = 'Status Brand'
// Name of the group a given palette belong to
const getGroupName = (name) => {
if (name === THEME_NAME) return 'theme'
if (name === THEME_DARK_NAME) return 'themeDark'
if (name === BRAND_NAME) return 'brand'
return 'colors'
}
// Resolve a single color
const resolveColor = (value, palettes) => {
// already resolved color
if (!value.startsWith('=')) {
return value
}
const [paletteName, key] = value.slice(1).split('.')
const color = palettes[paletteName] && palettes[paletteName][key]
if (!color) {
throw new Error(`resolveColor: ${value} doesnt seem to exist`)
}
// follow the references until we find one
if (color.startsWith('=')) {
return resolveColor(color, palettes)
}
return color
}
// Resolve all the colors in a palette
const resolveColors = (palette, palettes) =>
Object.entries(palette).reduce((pal, [name, value]) => {
if (typeof value === 'string') {
pal[name] = resolveColor(value, palettes)
}
return pal
}, {})
// Prepare groups from the palettes: theme, themeDark, brand and colors.
const groups = (palettes) =>
Object.entries(palettes).reduce(
(groups, [paletteName, palette]) => {
const groupName = getGroupName(paletteName)
if (groupName === 'colors') {
groups.colors[paletteName] = resolveColors(palette, palettes)
} else {
groups[groupName] = resolveColors(palette, palettes)
}
return groups
},
{ colors: {} }
)
const { themeDark, theme, brand, colors } = groups(status)
export { themeDark, theme, brand, colors }