vira
Version:
A simple and highly versatile design system using element-vir.
66 lines (65 loc) • 2.47 kB
JavaScript
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],
};
}),
};
});
});