@terrazzo/token-tools 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/color.d.ts +1 -9
- package/dist/color.js.map +1 -1
- package/dist/css/boolean.d.ts +6 -0
- package/dist/css/boolean.js +12 -0
- package/dist/css/boolean.js.map +1 -0
- package/dist/css/border.d.ts +13 -0
- package/dist/css/border.js +30 -0
- package/dist/css/border.js.map +1 -0
- package/dist/css/color.d.ts +13 -0
- package/dist/css/color.js +72 -0
- package/dist/css/color.js.map +1 -0
- package/dist/css/cubic-bezier.d.ts +8 -0
- package/dist/css/cubic-bezier.js +11 -0
- package/dist/css/cubic-bezier.js.map +1 -0
- package/dist/css/dimension.d.ts +6 -0
- package/dist/css/dimension.js +12 -0
- package/dist/css/dimension.js.map +1 -0
- package/dist/css/duration.d.ts +6 -0
- package/dist/css/duration.js +12 -0
- package/dist/css/duration.js.map +1 -0
- package/dist/css/font-family.d.ts +7 -0
- package/dist/css/font-family.js +22 -0
- package/dist/css/font-family.js.map +1 -0
- package/dist/css/font-weight.d.ts +6 -0
- package/dist/css/font-weight.js +9 -0
- package/dist/css/font-weight.js.map +1 -0
- package/dist/css/gradient.d.ts +9 -0
- package/dist/css/gradient.js +24 -0
- package/dist/css/gradient.js.map +1 -0
- package/dist/css/index.d.ts +25 -162
- package/dist/css/index.js +93 -315
- package/dist/css/index.js.map +1 -1
- package/dist/css/lib.d.ts +24 -0
- package/dist/css/lib.js +36 -0
- package/dist/css/lib.js.map +1 -0
- package/dist/css/link.d.ts +6 -0
- package/dist/css/link.js +9 -0
- package/dist/css/link.js.map +1 -0
- package/dist/css/number.d.ts +6 -0
- package/dist/css/number.js +6 -0
- package/dist/css/number.js.map +1 -0
- package/dist/css/shadow.d.ts +14 -0
- package/dist/css/shadow.js +42 -0
- package/dist/css/shadow.js.map +1 -0
- package/dist/css/string.d.ts +6 -0
- package/dist/css/string.js +8 -0
- package/dist/css/string.js.map +1 -0
- package/dist/css/stroke-style.d.ts +7 -0
- package/dist/css/stroke-style.js +9 -0
- package/dist/css/stroke-style.js.map +1 -0
- package/dist/css/transition.d.ts +14 -0
- package/dist/css/transition.js +21 -0
- package/dist/css/transition.js.map +1 -0
- package/dist/css/typography.d.ts +7 -0
- package/dist/css/typography.js +38 -0
- package/dist/css/typography.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/js/index.d.ts +12 -0
- package/dist/js/index.js +16 -0
- package/dist/js/index.js.map +1 -0
- package/dist/transform.d.ts +6 -0
- package/dist/transform.js +17 -0
- package/dist/transform.js.map +1 -0
- package/dist/types.d.ts +384 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +7 -5
- package/src/color.ts +1 -27
- package/src/css/boolean.ts +15 -0
- package/src/css/border.ts +46 -0
- package/src/css/color.ts +80 -0
- package/src/css/cubic-bezier.ts +23 -0
- package/src/css/dimension.ts +15 -0
- package/src/css/duration.ts +15 -0
- package/src/css/font-family.ts +32 -0
- package/src/css/font-weight.ts +12 -0
- package/src/css/gradient.ts +42 -0
- package/src/css/index.ts +105 -539
- package/src/css/lib.ts +54 -0
- package/src/css/link.ts +12 -0
- package/src/css/number.ts +9 -0
- package/src/css/shadow.ts +75 -0
- package/src/css/string.ts +11 -0
- package/src/css/stroke-style.ts +13 -0
- package/src/css/transition.ts +41 -0
- package/src/css/typography.ts +44 -0
- package/src/index.ts +2 -0
- package/src/js/index.ts +31 -0
- package/src/transform.ts +23 -0
- package/src/types.ts +524 -0
package/src/color.ts
CHANGED
|
@@ -1,32 +1,6 @@
|
|
|
1
1
|
import 'culori/css';
|
|
2
2
|
import { type Color, parse } from 'culori/fn';
|
|
3
|
-
|
|
4
|
-
export interface ColorValueNormalized {
|
|
5
|
-
/** Colorspace (default: `srgb`) @see https://www.w3.org/TR/css-color-4/#predefined */
|
|
6
|
-
colorSpace: ColorSpace;
|
|
7
|
-
/** Color channels. Will be normalized to 1 unless the colorspace prevents it (e.g. XYZ, LAB) */
|
|
8
|
-
channels: [number, number, number];
|
|
9
|
-
/** Alpha channel, normalized from 0 – 1 */
|
|
10
|
-
alpha: number;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type ColorSpace =
|
|
14
|
-
| 'a98'
|
|
15
|
-
| 'display-p3'
|
|
16
|
-
| 'hsb'
|
|
17
|
-
| 'hsl'
|
|
18
|
-
| 'hsv'
|
|
19
|
-
| 'hwb'
|
|
20
|
-
| 'lab'
|
|
21
|
-
| 'lch'
|
|
22
|
-
| 'oklab'
|
|
23
|
-
| 'oklch'
|
|
24
|
-
| 'prophoto-rgb'
|
|
25
|
-
| 'rec2020'
|
|
26
|
-
| 'srgb-linear'
|
|
27
|
-
| 'srgb'
|
|
28
|
-
| 'xyz-d50'
|
|
29
|
-
| 'xyz-d65';
|
|
3
|
+
import type { ColorSpace, ColorValueNormalized } from './types.js';
|
|
30
4
|
|
|
31
5
|
export const CULORI_TO_CSS: Record<
|
|
32
6
|
Extract<
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
2
|
+
|
|
3
|
+
/** Convert boolean value to CSS string */
|
|
4
|
+
export function transformBooleanValue(
|
|
5
|
+
value: boolean,
|
|
6
|
+
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
7
|
+
): string {
|
|
8
|
+
if (aliasOf) {
|
|
9
|
+
return transformAlias(aliasOf);
|
|
10
|
+
}
|
|
11
|
+
if (typeof value !== 'boolean') {
|
|
12
|
+
throw new Error(`Expected boolean, received ${typeof value} "${value}"`);
|
|
13
|
+
}
|
|
14
|
+
return value ? '1' : '0';
|
|
15
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { displayable } from 'culori';
|
|
2
|
+
import type { BorderValue } from '../types.js';
|
|
3
|
+
import { transformColorValue } from './color.js';
|
|
4
|
+
import { transformDimensionValue } from './dimension.js';
|
|
5
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
6
|
+
import { transformStrokeStyleValue } from './stroke-style.js';
|
|
7
|
+
|
|
8
|
+
/** Convert border value to multiple CSS values */
|
|
9
|
+
export function transformBorderValue(
|
|
10
|
+
value: BorderValue,
|
|
11
|
+
{
|
|
12
|
+
aliasOf,
|
|
13
|
+
partialAliasOf,
|
|
14
|
+
transformAlias = defaultAliasTransform,
|
|
15
|
+
}: {
|
|
16
|
+
aliasOf?: string;
|
|
17
|
+
partialAliasOf?: Partial<Record<keyof typeof value, string>>;
|
|
18
|
+
transformAlias: IDGenerator;
|
|
19
|
+
},
|
|
20
|
+
) {
|
|
21
|
+
if (aliasOf) {
|
|
22
|
+
return transformAlias(aliasOf);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const width = partialAliasOf?.width
|
|
26
|
+
? transformAlias(partialAliasOf.width)
|
|
27
|
+
: transformDimensionValue(value.width, { transformAlias });
|
|
28
|
+
const color = partialAliasOf?.color
|
|
29
|
+
? transformAlias(partialAliasOf.color)
|
|
30
|
+
: transformColorValue(value.color, { transformAlias });
|
|
31
|
+
const style = partialAliasOf?.style
|
|
32
|
+
? transformAlias(partialAliasOf.style)
|
|
33
|
+
: transformStrokeStyleValue(value.style, { transformAlias });
|
|
34
|
+
|
|
35
|
+
const formatBorder = (colorKey: string) =>
|
|
36
|
+
[width, style, typeof color === 'string' ? color : color[colorKey as keyof typeof color]].join(' ');
|
|
37
|
+
|
|
38
|
+
return typeof color === 'string' || displayable(color.p3)
|
|
39
|
+
? formatBorder('.')
|
|
40
|
+
: {
|
|
41
|
+
'.': formatBorder('.'),
|
|
42
|
+
srgb: formatBorder('srgb'),
|
|
43
|
+
p3: formatBorder('p3'),
|
|
44
|
+
rec2020: formatBorder('rec2020'),
|
|
45
|
+
};
|
|
46
|
+
}
|
package/src/css/color.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { clampChroma, type Color, formatCss, displayable } from 'culori';
|
|
2
|
+
import { CSS_TO_CULORI, parseColor } from '../color.js';
|
|
3
|
+
import type { ColorValue } from '../types.js';
|
|
4
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
5
|
+
|
|
6
|
+
export type WideGamutColorValue = { '.': string; srgb: string; p3: string; rec2020: string };
|
|
7
|
+
|
|
8
|
+
/** Convert color value to CSS string */
|
|
9
|
+
export function transformColorValue(
|
|
10
|
+
value: string | ColorValue,
|
|
11
|
+
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
12
|
+
): string | WideGamutColorValue {
|
|
13
|
+
if (aliasOf) {
|
|
14
|
+
return transformAlias(aliasOf);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const { colorSpace, channels, alpha } = typeof value === 'string' ? parseColor(value) : value;
|
|
18
|
+
const color = { mode: CSS_TO_CULORI[colorSpace], alpha } as Color;
|
|
19
|
+
switch (color.mode) {
|
|
20
|
+
case 'a98':
|
|
21
|
+
case 'rec2020':
|
|
22
|
+
case 'p3':
|
|
23
|
+
case 'prophoto':
|
|
24
|
+
case 'lrgb':
|
|
25
|
+
case 'rgb': {
|
|
26
|
+
color.r = channels[0];
|
|
27
|
+
color.g = channels[1];
|
|
28
|
+
color.b = channels[2];
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case 'hsl': {
|
|
32
|
+
color.h = channels[0];
|
|
33
|
+
color.s = channels[1];
|
|
34
|
+
color.l = channels[2];
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'hsv': {
|
|
38
|
+
color.h = channels[0];
|
|
39
|
+
color.s = channels[1];
|
|
40
|
+
color.v = channels[2];
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case 'hwb': {
|
|
44
|
+
color.h = channels[0];
|
|
45
|
+
color.w = channels[1];
|
|
46
|
+
color.b = channels[2];
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'lab':
|
|
50
|
+
case 'oklab': {
|
|
51
|
+
color.l = channels[0];
|
|
52
|
+
color.a = channels[1];
|
|
53
|
+
color.b = channels[2];
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case 'lch':
|
|
57
|
+
case 'oklch': {
|
|
58
|
+
color.l = channels[0];
|
|
59
|
+
color.c = channels[1];
|
|
60
|
+
color.h = channels[2];
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case 'xyz50':
|
|
64
|
+
case 'xyz65': {
|
|
65
|
+
color.x = channels[0];
|
|
66
|
+
color.y = channels[1];
|
|
67
|
+
color.z = channels[2];
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return displayable(color)
|
|
73
|
+
? formatCss(color)
|
|
74
|
+
: {
|
|
75
|
+
'.': formatCss(color),
|
|
76
|
+
srgb: (typeof value === 'object' && value.hex) || formatCss(clampChroma(color, color.mode, 'rgb')),
|
|
77
|
+
p3: formatCss(clampChroma(color, color.mode, 'p3')),
|
|
78
|
+
rec2020: formatCss(clampChroma(color, color.mode, 'rec2020')),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CubicBézierValue } from '../types.js';
|
|
2
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
3
|
+
|
|
4
|
+
/** Convert cubicBezier value to CSS */
|
|
5
|
+
export function transformCubicBezierValue(
|
|
6
|
+
value: CubicBézierValue,
|
|
7
|
+
{
|
|
8
|
+
aliasOf,
|
|
9
|
+
partialAliasOf,
|
|
10
|
+
transformAlias = defaultAliasTransform,
|
|
11
|
+
}: {
|
|
12
|
+
aliasOf?: string;
|
|
13
|
+
partialAliasOf?: [string | undefined, string | undefined, string | undefined, string | undefined];
|
|
14
|
+
transformAlias?: IDGenerator;
|
|
15
|
+
} = {},
|
|
16
|
+
): string {
|
|
17
|
+
if (aliasOf) {
|
|
18
|
+
return transformAlias(aliasOf);
|
|
19
|
+
}
|
|
20
|
+
return `cubic-bezier(${value
|
|
21
|
+
.map((v, i) => (partialAliasOf?.[i] ? transformAlias(partialAliasOf[i]!) : v))
|
|
22
|
+
.join(', ')})`;
|
|
23
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
2
|
+
|
|
3
|
+
/** Convert dimension value to CSS */
|
|
4
|
+
export function transformDimensionValue(
|
|
5
|
+
value: number | string,
|
|
6
|
+
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
7
|
+
): string {
|
|
8
|
+
if (aliasOf) {
|
|
9
|
+
return transformAlias(aliasOf);
|
|
10
|
+
}
|
|
11
|
+
if (typeof value === 'number') {
|
|
12
|
+
return value === 0 ? '0' : `${value}px`;
|
|
13
|
+
}
|
|
14
|
+
return value === '0' || Number.parseFloat(value) === 0 ? '0' : value;
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
2
|
+
|
|
3
|
+
/** Convert duration value to CSS */
|
|
4
|
+
export function transformDurationValue(
|
|
5
|
+
value: number | string,
|
|
6
|
+
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
7
|
+
): string {
|
|
8
|
+
if (aliasOf) {
|
|
9
|
+
return transformAlias(aliasOf);
|
|
10
|
+
}
|
|
11
|
+
if (typeof value === 'number' || String(Number.parseFloat(value)) === value) {
|
|
12
|
+
return `${value}ms`;
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
2
|
+
|
|
3
|
+
export const FONT_FAMILY_KEYWORDS = new Set([
|
|
4
|
+
'sans-serif',
|
|
5
|
+
'serif',
|
|
6
|
+
'monospace',
|
|
7
|
+
'system-ui',
|
|
8
|
+
'ui-monospace',
|
|
9
|
+
'-apple-system',
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
export function transformFontFamilyValue(
|
|
13
|
+
value: string | string[],
|
|
14
|
+
{
|
|
15
|
+
aliasOf,
|
|
16
|
+
partialAliasOf,
|
|
17
|
+
transformAlias = defaultAliasTransform,
|
|
18
|
+
}: { aliasOf?: string; partialAliasOf?: string[]; transformAlias?: IDGenerator } = {},
|
|
19
|
+
): string {
|
|
20
|
+
if (aliasOf) {
|
|
21
|
+
return transformAlias(aliasOf);
|
|
22
|
+
}
|
|
23
|
+
return (typeof value === 'string' ? [value] : value)
|
|
24
|
+
.map((fontName, i) =>
|
|
25
|
+
partialAliasOf?.[i]
|
|
26
|
+
? transformAlias(partialAliasOf[i]!)
|
|
27
|
+
: FONT_FAMILY_KEYWORDS.has(fontName)
|
|
28
|
+
? fontName
|
|
29
|
+
: `"${fontName}"`,
|
|
30
|
+
)
|
|
31
|
+
.join(', ');
|
|
32
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
2
|
+
|
|
3
|
+
/** Convert fontWeight value to CSS */
|
|
4
|
+
export function transformFontWeightValue(
|
|
5
|
+
value: number | string,
|
|
6
|
+
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
7
|
+
): string {
|
|
8
|
+
if (aliasOf) {
|
|
9
|
+
return transformAlias(aliasOf);
|
|
10
|
+
}
|
|
11
|
+
return String(value);
|
|
12
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { GradientStopNormalized, GradientValueNormalized } from '../types';
|
|
2
|
+
import { transformColorValue, type WideGamutColorValue } from './color.js';
|
|
3
|
+
import { type IDGenerator, defaultAliasTransform } from './lib.js';
|
|
4
|
+
|
|
5
|
+
/** Convert gradient value to CSS */
|
|
6
|
+
export function transformGradientValue(
|
|
7
|
+
value: GradientValueNormalized,
|
|
8
|
+
{
|
|
9
|
+
aliasOf,
|
|
10
|
+
partialAliasOf,
|
|
11
|
+
transformAlias = defaultAliasTransform,
|
|
12
|
+
}: {
|
|
13
|
+
aliasOf?: string;
|
|
14
|
+
partialAliasOf?: Partial<Record<keyof GradientStopNormalized, string>>[];
|
|
15
|
+
transformAlias?: IDGenerator;
|
|
16
|
+
} = {},
|
|
17
|
+
): string | WideGamutColorValue {
|
|
18
|
+
if (aliasOf) {
|
|
19
|
+
return transformAlias(aliasOf);
|
|
20
|
+
}
|
|
21
|
+
const colors = value.map(({ color }, i) =>
|
|
22
|
+
partialAliasOf?.[i]?.color ? transformAlias(partialAliasOf[i]!.color as string) : transformColorValue(color),
|
|
23
|
+
);
|
|
24
|
+
const positions = value.map(({ position }, i) =>
|
|
25
|
+
partialAliasOf?.[i]?.position ? transformAlias(String(partialAliasOf[i]!.position)) : `${100 * position}%`,
|
|
26
|
+
);
|
|
27
|
+
const isHDR = colors.some((c) => typeof c === 'object');
|
|
28
|
+
const formatStop = (index: number, colorKey = '.') =>
|
|
29
|
+
[
|
|
30
|
+
typeof colors[index] === 'string' ? colors[index] : colors[index]![colorKey as keyof (typeof colors)[number]],
|
|
31
|
+
positions[index]!,
|
|
32
|
+
].join(' ');
|
|
33
|
+
|
|
34
|
+
return !isHDR
|
|
35
|
+
? value.map((_, i) => formatStop(i, positions[i]!)).join(', ')
|
|
36
|
+
: {
|
|
37
|
+
'.': value.map((_, i) => formatStop(i, '.')).join(', '),
|
|
38
|
+
srgb: value.map((_, i) => formatStop(i, 'srgb')).join(', '),
|
|
39
|
+
p3: value.map((_, i) => formatStop(i, 'p3')).join(', '),
|
|
40
|
+
rec2020: value.map((_, i) => formatStop(i, 'rec2020')).join(', '),
|
|
41
|
+
};
|
|
42
|
+
}
|