@terrazzo/token-tools
Version:
Various utilities for token types
56 lines • 1.61 kB
JavaScript
import { A98RGB, ColorSpace as ColorJS, HSL, HWB, inGamut, Lab, Lab_D65, LCH, Okhsv, OKLab, OKLCH, P3, parse, ProPhoto, REC_2020, serialize, sRGB, sRGB_Linear, XYZ_D50, XYZ_D65, } from 'colorjs.io/fn';
/** Complete list of CSS Module 4 color spaces */
export const COLOR_SPACE = {
'a98-rgb': A98RGB,
'display-p3': P3,
hsl: HSL,
hwb: HWB,
lab: Lab,
'lab-d65': Lab_D65,
lch: LCH,
okhsv: Okhsv,
oklab: OKLab,
oklch: OKLCH,
'prophoto-rgb': ProPhoto,
rec2020: REC_2020,
srgb: sRGB,
'srgb-linear': sRGB_Linear,
xyz: XYZ_D65,
'xyz-d50': XYZ_D50,
'xyz-d65': XYZ_D65,
};
const COLOR_ID_TO_SPACE = {};
for (const s of Object.values(COLOR_SPACE)) {
ColorJS.register(s);
COLOR_ID_TO_SPACE[s.id] = s;
for (const alias of s.aliases ?? []) {
COLOR_ID_TO_SPACE[alias] = s;
}
}
/** Parse any color */
export function parseColor(color) {
const result = parse(color);
const value = {
colorSpace: COLOR_ID_TO_SPACE[result.spaceId].cssId,
components: result.coords,
alpha: result.alpha ?? 1,
};
if (!inGamut(result, 'srgb')) {
value.hex = serialize(result, { format: 'hex' });
}
return value;
}
/** Convert a color token to a Color.js color */
export function tokenToColor(value) {
const space = COLOR_SPACE[value.colorSpace];
if (!space) {
throw new Error(`Invalid color space "${value.colorSpace}".`);
}
return {
spaceId: space.id,
space,
coords: value.components,
alpha: value.alpha,
};
}
//# sourceMappingURL=color.js.map