UNPKG

vira

Version:

A simple and highly versatile design system using element-vir.

66 lines (65 loc) 2.47 kB
import { check } from '@augment-vir/assert'; import { arrayToObject, filterMap, getEnumValues, getObjectTypedKeys, mapEnumToObject, removeDuplicates, removePrefix, removeSuffix, } from '@augment-vir/common'; import { ContrastLevelName } from '@electrovir/color/dist/data/contrast/contrast.js'; import { viraTheme } from './vira-color-theme.js'; const sortedContrastLevelNames = [ 'highest-contrast', 'lowest-contrast', ...getEnumValues(ContrastLevelName).sort((a, b) => Number(b.includes('-')) - Number(a.includes('-'))), ]; const viraThemeColorNames = removeDuplicates(filterMap(Object.keys(viraTheme.colors), (key) => key.split('-')[1], (mappedKey) => mappedKey !== 'default')).filter(check.isTruthy); /** * An enum of {@link ViraThemeColorName}. * * @category Internal */ export const ViraThemeColorName = arrayToObject(viraThemeColorNames, (colorKey) => { return { key: colorKey, value: colorKey, }; }, { useRequired: true, }); /** * All {@link viraTheme} color pair keys. * * @category Internal */ export const allViraThemeKeys = getObjectTypedKeys(viraTheme.colors); /** * All {@link viraTheme} color pair grouped by their color name, pair name, and contrast level. See * {@link viraTheme} for extensive documentation on what the colors pairs mean. * * @category Internal */ export const viraThemeByKeys = mapEnumToObject(ViraThemeColorName, (colorName) => { const colorPairKeys = removeDuplicates(filterMap(allViraThemeKeys, (key) => { return sortedContrastLevelNames.reduce((final, current) => { return removeSuffix({ value: final, suffix: `-${current}`, }); }, removePrefix({ value: key, prefix: `vira-${colorName}-`, })); }, (mappedKey, originalKey) => { return originalKey.startsWith(`vira-${colorName}-`); })); return arrayToObject(colorPairKeys, (colorPairKey) => { return { key: colorPairKey, value: arrayToObject(sortedContrastLevelNames, (contrastLevel) => { const finalKey = `vira-${colorName}-${colorPairKey}-${contrastLevel}`; if (!check.hasKey(viraTheme.colors, finalKey)) { return undefined; } return { key: contrastLevel, value: viraTheme.colors[finalKey], }; }), }; }); });