@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/css/index.ts
CHANGED
|
@@ -1,551 +1,117 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
export
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// @see https://developer.mozilla.org/en-US/docs/Web/CSS/font
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** Convert border value to multiple CSS values */
|
|
52
|
-
export function transformBorderValue(
|
|
53
|
-
value: BorderValue,
|
|
54
|
-
{
|
|
55
|
-
aliasOf,
|
|
56
|
-
partialAliasOf,
|
|
57
|
-
transformAlias = defaultAliasTransform,
|
|
58
|
-
}: {
|
|
59
|
-
aliasOf?: string;
|
|
60
|
-
partialAliasOf?: Partial<Record<keyof typeof value, string>>;
|
|
61
|
-
transformAlias: IDGenerator;
|
|
62
|
-
},
|
|
1
|
+
import type { TokenNormalized } from '../types.js';
|
|
2
|
+
import { transformBooleanValue } from './boolean.js';
|
|
3
|
+
import type { IDGenerator } from './lib.js';
|
|
4
|
+
import { transformBorderValue } from './border.js';
|
|
5
|
+
import { transformColorValue } from './color.js';
|
|
6
|
+
import { transformCubicBezierValue } from './cubic-bezier.js';
|
|
7
|
+
import { transformDimensionValue } from './dimension.js';
|
|
8
|
+
import { transformDurationValue } from './duration.js';
|
|
9
|
+
import { transformFontFamilyValue } from './font-family.js';
|
|
10
|
+
import { transformFontWeightValue } from './font-weight.js';
|
|
11
|
+
import { transformGradientValue } from './gradient.js';
|
|
12
|
+
import { transformNumberValue } from './number.js';
|
|
13
|
+
import { transformLinkValue } from './link.js';
|
|
14
|
+
import { transformShadowValue } from './shadow.js';
|
|
15
|
+
import { transformStringValue } from './string.js';
|
|
16
|
+
import { transformTypographyValue } from './typography.js';
|
|
17
|
+
import { transformTransitionValue } from './transition.js';
|
|
18
|
+
import { transformStrokeStyleValue } from './stroke-style.js';
|
|
19
|
+
|
|
20
|
+
export * from './boolean.js';
|
|
21
|
+
export * from './border.js';
|
|
22
|
+
export * from './color.js';
|
|
23
|
+
export * from './cubic-bezier.js';
|
|
24
|
+
export * from './dimension.js';
|
|
25
|
+
export * from './duration.js';
|
|
26
|
+
export * from './font-family.js';
|
|
27
|
+
export * from './font-weight.js';
|
|
28
|
+
export * from './gradient.js';
|
|
29
|
+
export * from './lib.js';
|
|
30
|
+
export * from './link.js';
|
|
31
|
+
export * from './number.js';
|
|
32
|
+
export * from './shadow.js';
|
|
33
|
+
export * from './string.js';
|
|
34
|
+
export * from './stroke-style.js';
|
|
35
|
+
export * from './transition.js';
|
|
36
|
+
export * from './typography.js';
|
|
37
|
+
|
|
38
|
+
export interface TransformCSSValueOptions {
|
|
39
|
+
mode: string;
|
|
40
|
+
transformAlias: IDGenerator;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Main CSS Transform */
|
|
44
|
+
export function transformCSSValue<T extends TokenNormalized>(
|
|
45
|
+
token: T,
|
|
46
|
+
{ mode, transformAlias }: TransformCSSValueOptions,
|
|
63
47
|
) {
|
|
64
|
-
if (
|
|
65
|
-
return
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const width = partialAliasOf?.width
|
|
69
|
-
? transformAlias(partialAliasOf.width)
|
|
70
|
-
: transformDimensionValue(value.width, { transformAlias });
|
|
71
|
-
const color = partialAliasOf?.color
|
|
72
|
-
? transformAlias(partialAliasOf.color)
|
|
73
|
-
: transformColorValue(value.color, { transformAlias });
|
|
74
|
-
const style = partialAliasOf?.style
|
|
75
|
-
? transformAlias(partialAliasOf.style)
|
|
76
|
-
: transformStrokeStyleValue(value.style, { transformAlias });
|
|
77
|
-
|
|
78
|
-
const formatBorder = (colorKey: string) =>
|
|
79
|
-
[width, style, typeof color === 'string' ? color : color[colorKey as keyof typeof color]].join(' ');
|
|
80
|
-
|
|
81
|
-
return typeof color === 'string' || displayable(color.p3)
|
|
82
|
-
? formatBorder('.')
|
|
83
|
-
: {
|
|
84
|
-
'.': formatBorder('.'),
|
|
85
|
-
srgb: formatBorder('srgb'),
|
|
86
|
-
p3: formatBorder('p3'),
|
|
87
|
-
rec2020: formatBorder('rec2020'),
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/** Convert color value to CSS string */
|
|
92
|
-
export function transformColorValue(
|
|
93
|
-
value: string | ColorValue,
|
|
94
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
95
|
-
): string | WideGamutColorValue {
|
|
96
|
-
if (aliasOf) {
|
|
97
|
-
return transformAlias(aliasOf);
|
|
48
|
+
if (!token.mode[mode]) {
|
|
49
|
+
return;
|
|
98
50
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
case 'a98':
|
|
104
|
-
case 'rec2020':
|
|
105
|
-
case 'p3':
|
|
106
|
-
case 'prophoto':
|
|
107
|
-
case 'lrgb':
|
|
108
|
-
case 'rgb': {
|
|
109
|
-
color.r = channels[0];
|
|
110
|
-
color.g = channels[1];
|
|
111
|
-
color.b = channels[2];
|
|
112
|
-
break;
|
|
51
|
+
switch (token.$type) {
|
|
52
|
+
case 'boolean': {
|
|
53
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
54
|
+
return transformBooleanValue($value, { aliasOf, transformAlias });
|
|
113
55
|
}
|
|
114
|
-
case '
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
color.l = channels[2];
|
|
118
|
-
break;
|
|
56
|
+
case 'border': {
|
|
57
|
+
const { $value, aliasOf, partialAliasOf } = token.mode[mode]!;
|
|
58
|
+
return transformBorderValue($value, { aliasOf, partialAliasOf, transformAlias });
|
|
119
59
|
}
|
|
120
|
-
case '
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
color.v = channels[2];
|
|
124
|
-
break;
|
|
60
|
+
case 'color': {
|
|
61
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
62
|
+
return transformColorValue($value, { aliasOf, transformAlias });
|
|
125
63
|
}
|
|
126
|
-
case '
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
color.b = channels[2];
|
|
130
|
-
break;
|
|
64
|
+
case 'cubicBezier': {
|
|
65
|
+
const { $value, aliasOf, partialAliasOf } = token.mode[mode]!;
|
|
66
|
+
return transformCubicBezierValue($value, { aliasOf, partialAliasOf, transformAlias });
|
|
131
67
|
}
|
|
132
|
-
case '
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
color.a = channels[1];
|
|
136
|
-
color.b = channels[2];
|
|
137
|
-
break;
|
|
68
|
+
case 'dimension': {
|
|
69
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
70
|
+
return transformDimensionValue($value, { aliasOf, transformAlias });
|
|
138
71
|
}
|
|
139
|
-
case '
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
color.c = channels[1];
|
|
143
|
-
color.h = channels[2];
|
|
144
|
-
break;
|
|
72
|
+
case 'duration': {
|
|
73
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
74
|
+
return transformDurationValue($value, { aliasOf, transformAlias });
|
|
145
75
|
}
|
|
146
|
-
case '
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
color.y = channels[1];
|
|
150
|
-
color.z = channels[2];
|
|
151
|
-
break;
|
|
76
|
+
case 'fontFamily': {
|
|
77
|
+
const { $value, aliasOf, partialAliasOf } = token.mode[mode]!;
|
|
78
|
+
return transformFontFamilyValue($value, { aliasOf, partialAliasOf, transformAlias });
|
|
152
79
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
: {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/** Build object of alias values */
|
|
189
|
-
export function transformCompositeAlias<T extends {}>(
|
|
190
|
-
value: T,
|
|
191
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf: string; transformAlias?: IDGenerator },
|
|
192
|
-
): Record<string, string> {
|
|
193
|
-
const output: Record<string, string> = {};
|
|
194
|
-
for (const key in value) {
|
|
195
|
-
output[kebabCase(key)] = transformAlias(`${aliasOf}-${key}`);
|
|
196
|
-
}
|
|
197
|
-
return output as Record<keyof T, string>;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export type DimensionValue = string;
|
|
201
|
-
|
|
202
|
-
/** Convert dimension value to CSS */
|
|
203
|
-
export function transformDimensionValue(
|
|
204
|
-
value: number | string,
|
|
205
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
206
|
-
): string {
|
|
207
|
-
if (aliasOf) {
|
|
208
|
-
return transformAlias(aliasOf);
|
|
209
|
-
}
|
|
210
|
-
if (typeof value === 'number') {
|
|
211
|
-
return value === 0 ? '0' : `${value}px`;
|
|
212
|
-
}
|
|
213
|
-
return value;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
export type DurationValue = string;
|
|
217
|
-
|
|
218
|
-
/** Convert duration value to CSS */
|
|
219
|
-
export function transformDurationValue(
|
|
220
|
-
value: number | string,
|
|
221
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
222
|
-
): string {
|
|
223
|
-
if (aliasOf) {
|
|
224
|
-
return transformAlias(aliasOf);
|
|
225
|
-
}
|
|
226
|
-
if (typeof value === 'number' || String(Number.parseFloat(value)) === value) {
|
|
227
|
-
return `${value}ms`;
|
|
228
|
-
}
|
|
229
|
-
return value;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
export const FONT_FAMILY_KEYWORDS = new Set([
|
|
233
|
-
'sans-serif',
|
|
234
|
-
'serif',
|
|
235
|
-
'monospace',
|
|
236
|
-
'system-ui',
|
|
237
|
-
'ui-monospace',
|
|
238
|
-
'-apple-system',
|
|
239
|
-
]);
|
|
240
|
-
|
|
241
|
-
export function transformFontFamilyValue(
|
|
242
|
-
value: string | string[],
|
|
243
|
-
{
|
|
244
|
-
aliasOf,
|
|
245
|
-
partialAliasOf,
|
|
246
|
-
transformAlias = defaultAliasTransform,
|
|
247
|
-
}: { aliasOf?: string; partialAliasOf?: string[]; transformAlias?: IDGenerator } = {},
|
|
248
|
-
): string {
|
|
249
|
-
if (aliasOf) {
|
|
250
|
-
return transformAlias(aliasOf);
|
|
251
|
-
}
|
|
252
|
-
return (typeof value === 'string' ? [value] : value)
|
|
253
|
-
.map((fontName, i) =>
|
|
254
|
-
partialAliasOf?.[i]
|
|
255
|
-
? transformAlias(partialAliasOf[i]!)
|
|
256
|
-
: FONT_FAMILY_KEYWORDS.has(fontName)
|
|
257
|
-
? fontName
|
|
258
|
-
: `"${fontName}"`,
|
|
259
|
-
)
|
|
260
|
-
.join(', ');
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/** Convert fontWeight value to CSS */
|
|
264
|
-
export function transformFontWeightValue(
|
|
265
|
-
value: number | string,
|
|
266
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
267
|
-
): string {
|
|
268
|
-
if (aliasOf) {
|
|
269
|
-
return transformAlias(aliasOf);
|
|
270
|
-
}
|
|
271
|
-
return String(value);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
export interface GradientStop {
|
|
275
|
-
color: ColorValue;
|
|
276
|
-
position: number;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/** Convert gradient value to CSS */
|
|
280
|
-
export function transformGradientValue(
|
|
281
|
-
value: GradientStop[],
|
|
282
|
-
{
|
|
283
|
-
aliasOf,
|
|
284
|
-
partialAliasOf,
|
|
285
|
-
transformAlias = defaultAliasTransform,
|
|
286
|
-
}: {
|
|
287
|
-
aliasOf?: string;
|
|
288
|
-
partialAliasOf?: Partial<Record<keyof GradientStop, string>>[];
|
|
289
|
-
transformAlias?: IDGenerator;
|
|
290
|
-
} = {},
|
|
291
|
-
): string | WideGamutColorValue {
|
|
292
|
-
if (aliasOf) {
|
|
293
|
-
return transformAlias(aliasOf);
|
|
294
|
-
}
|
|
295
|
-
const colors = value.map(({ color }, i) =>
|
|
296
|
-
partialAliasOf?.[i]?.color ? transformAlias(partialAliasOf[i]!.color as string) : transformColorValue(color),
|
|
297
|
-
);
|
|
298
|
-
const positions = value.map(({ position }, i) =>
|
|
299
|
-
partialAliasOf?.[i]?.position ? transformAlias(String(partialAliasOf[i]!.position)) : `${100 * position}%`,
|
|
300
|
-
);
|
|
301
|
-
const isHDR = colors.some((c) => typeof c === 'object');
|
|
302
|
-
const formatStop = (index: number, colorKey = '.') =>
|
|
303
|
-
[
|
|
304
|
-
typeof colors[index] === 'string' ? colors[index] : colors[index]![colorKey as keyof (typeof colors)[number]],
|
|
305
|
-
positions[index]!,
|
|
306
|
-
].join(' ');
|
|
307
|
-
|
|
308
|
-
return !isHDR
|
|
309
|
-
? value.map((_, i) => formatStop(i, positions[i]!)).join(', ')
|
|
310
|
-
: {
|
|
311
|
-
'.': value.map((_, i) => formatStop(i, '.')).join(', '),
|
|
312
|
-
srgb: value.map((_, i) => formatStop(i, 'srgb')).join(', '),
|
|
313
|
-
p3: value.map((_, i) => formatStop(i, 'p3')).join(', '),
|
|
314
|
-
rec2020: value.map((_, i) => formatStop(i, 'rec2020')).join(', '),
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
export interface ShadowLayer {
|
|
319
|
-
color: ColorValue;
|
|
320
|
-
offsetX: string;
|
|
321
|
-
offsetY: string;
|
|
322
|
-
blur: string;
|
|
323
|
-
spread: string;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/** Convert link value to CSS */
|
|
327
|
-
export function transformLinkValue(
|
|
328
|
-
value: string,
|
|
329
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
330
|
-
): string {
|
|
331
|
-
if (aliasOf) {
|
|
332
|
-
return transformAlias(aliasOf);
|
|
333
|
-
}
|
|
334
|
-
return `url("${value}")`;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/** Convert number value to CSS */
|
|
338
|
-
export function transformNumberValue(
|
|
339
|
-
value: number,
|
|
340
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
341
|
-
): string {
|
|
342
|
-
return aliasOf ? transformAlias(aliasOf) : String(value);
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
/** Convert shadow subvalue to CSS */
|
|
346
|
-
export function transformShadowLayer(
|
|
347
|
-
value: ShadowLayer,
|
|
348
|
-
{
|
|
349
|
-
color,
|
|
350
|
-
partialAliasOf,
|
|
351
|
-
transformAlias = defaultAliasTransform,
|
|
352
|
-
}: {
|
|
353
|
-
color: string;
|
|
354
|
-
partialAliasOf?: Partial<Record<keyof ShadowLayer, string>>;
|
|
355
|
-
transformAlias?: IDGenerator;
|
|
356
|
-
},
|
|
357
|
-
): string | Record<string, string> {
|
|
358
|
-
const offsetX = partialAliasOf?.offsetX
|
|
359
|
-
? transformAlias(partialAliasOf.offsetX)
|
|
360
|
-
: transformDimensionValue(value.offsetX, { transformAlias });
|
|
361
|
-
const offsetY = partialAliasOf?.offsetY
|
|
362
|
-
? transformAlias(partialAliasOf.offsetY)
|
|
363
|
-
: transformDimensionValue(value.offsetY, { transformAlias });
|
|
364
|
-
const blur = partialAliasOf?.blur
|
|
365
|
-
? transformAlias(partialAliasOf.blur)
|
|
366
|
-
: transformDimensionValue(value.blur, { transformAlias });
|
|
367
|
-
const spread = partialAliasOf?.spread
|
|
368
|
-
? transformAlias(partialAliasOf.spread)
|
|
369
|
-
: transformDimensionValue(value.spread, { transformAlias });
|
|
370
|
-
|
|
371
|
-
return [offsetX, offsetY, blur, spread, color].join(' ');
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/** Convert shadow value to CSS */
|
|
375
|
-
export function transformShadowValue(
|
|
376
|
-
value: ShadowLayer[],
|
|
377
|
-
{
|
|
378
|
-
aliasOf,
|
|
379
|
-
partialAliasOf,
|
|
380
|
-
transformAlias = defaultAliasTransform,
|
|
381
|
-
}: {
|
|
382
|
-
aliasOf?: string;
|
|
383
|
-
partialAliasOf?: Partial<Record<keyof ShadowLayer, string>>[];
|
|
384
|
-
transformAlias?: IDGenerator;
|
|
385
|
-
} = {},
|
|
386
|
-
): string | Record<string, string> {
|
|
387
|
-
if (aliasOf) {
|
|
388
|
-
return transformAlias(aliasOf);
|
|
389
|
-
}
|
|
390
|
-
const colors = value.map(({ color }, i) =>
|
|
391
|
-
partialAliasOf?.[i]?.color
|
|
392
|
-
? transformAlias(partialAliasOf[i]!.color!)
|
|
393
|
-
: transformColorValue(color, { transformAlias }),
|
|
394
|
-
);
|
|
395
|
-
const isHDR = colors.some((c) => typeof c === 'object');
|
|
396
|
-
|
|
397
|
-
const formatShadow = (colorKey: string) =>
|
|
398
|
-
value
|
|
399
|
-
.map((v, i) =>
|
|
400
|
-
transformShadowLayer(v, {
|
|
401
|
-
color:
|
|
402
|
-
typeof colors[i] === 'string'
|
|
403
|
-
? (colors[i] as string)
|
|
404
|
-
: colors[i]![colorKey as keyof (typeof colors)[number]]!,
|
|
405
|
-
partialAliasOf: partialAliasOf?.[i],
|
|
406
|
-
transformAlias,
|
|
407
|
-
}),
|
|
408
|
-
)
|
|
409
|
-
.join(', ');
|
|
410
|
-
|
|
411
|
-
return !isHDR
|
|
412
|
-
? formatShadow('.')
|
|
413
|
-
: { '.': formatShadow('.'), srgb: formatShadow('srgb'), p3: formatShadow('p3'), rec2020: formatShadow('rec2020') };
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
/** Convert string value to CSS */
|
|
417
|
-
export function transformStringValue(
|
|
418
|
-
value: string | number | boolean,
|
|
419
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
420
|
-
): string {
|
|
421
|
-
// this seems like a useless function—because it is—but this is a placeholder
|
|
422
|
-
// that can handle unexpected values in the future should any arise
|
|
423
|
-
return aliasOf ? transformAlias(aliasOf) : String(value);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
export type StrokeStyleValue =
|
|
427
|
-
| 'dotted'
|
|
428
|
-
| 'dashed'
|
|
429
|
-
| 'solid'
|
|
430
|
-
| 'double'
|
|
431
|
-
| 'groove'
|
|
432
|
-
| 'ridge'
|
|
433
|
-
| 'inset'
|
|
434
|
-
| 'outset'
|
|
435
|
-
| { dashArray: DimensionValue[]; lineCap: string };
|
|
436
|
-
|
|
437
|
-
/** Convert strokeStyle value to CSS */
|
|
438
|
-
export function transformStrokeStyleValue(
|
|
439
|
-
value: string | StrokeStyleValue,
|
|
440
|
-
{ aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
|
|
441
|
-
): string {
|
|
442
|
-
if (aliasOf) {
|
|
443
|
-
return transformAlias(aliasOf);
|
|
444
|
-
}
|
|
445
|
-
return typeof value === 'string' ? value : 'dashed'; // CSS doesn’t have `dash-array`; it’s just "dashed"
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
export interface TransitionValue {
|
|
449
|
-
duration: string;
|
|
450
|
-
delay: string;
|
|
451
|
-
timingFunction: CubicBézierValue;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
/** Convert transition value to multiple CSS values */
|
|
455
|
-
export function transformTransitionValue(
|
|
456
|
-
value: TransitionValue,
|
|
457
|
-
{
|
|
458
|
-
aliasOf,
|
|
459
|
-
partialAliasOf,
|
|
460
|
-
transformAlias = defaultAliasTransform,
|
|
461
|
-
}: {
|
|
462
|
-
aliasOf?: string;
|
|
463
|
-
partialAliasOf?: Partial<Record<keyof typeof value, string>>;
|
|
464
|
-
transformAlias?: IDGenerator;
|
|
465
|
-
} = {},
|
|
466
|
-
): {
|
|
467
|
-
duration: ReturnType<typeof transformDurationValue>;
|
|
468
|
-
delay: ReturnType<typeof transformDurationValue>;
|
|
469
|
-
'timing-function': ReturnType<typeof transformCubicBezierValue>;
|
|
470
|
-
} {
|
|
471
|
-
if (aliasOf) {
|
|
472
|
-
return transformCompositeAlias(value, { aliasOf, transformAlias }) as {
|
|
473
|
-
duration: ReturnType<typeof transformDurationValue>;
|
|
474
|
-
delay: ReturnType<typeof transformDurationValue>;
|
|
475
|
-
'timing-function': ReturnType<typeof transformCubicBezierValue>;
|
|
476
|
-
};
|
|
477
|
-
}
|
|
478
|
-
return {
|
|
479
|
-
duration: partialAliasOf?.duration
|
|
480
|
-
? transformAlias(partialAliasOf.duration)
|
|
481
|
-
: transformDurationValue(value.duration, { transformAlias }),
|
|
482
|
-
delay: partialAliasOf?.delay
|
|
483
|
-
? transformAlias(partialAliasOf.delay)
|
|
484
|
-
: transformDurationValue(value.delay, { transformAlias }),
|
|
485
|
-
'timing-function': partialAliasOf?.timingFunction
|
|
486
|
-
? transformAlias(partialAliasOf.timingFunction)
|
|
487
|
-
: transformCubicBezierValue(value.timingFunction, { transformAlias }),
|
|
488
|
-
};
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
/** Convert typography value to multiple CSS values */
|
|
492
|
-
export function transformTypographyValue(
|
|
493
|
-
value: Record<string, string | string[]>,
|
|
494
|
-
{
|
|
495
|
-
aliasOf,
|
|
496
|
-
partialAliasOf,
|
|
497
|
-
transformAlias = defaultAliasTransform,
|
|
498
|
-
}: { aliasOf?: string; partialAliasOf?: Record<keyof typeof value, string>; transformAlias?: IDGenerator } = {},
|
|
499
|
-
): Record<string, string> {
|
|
500
|
-
const output: Record<string, string> = {};
|
|
501
|
-
if (aliasOf) {
|
|
502
|
-
return transformCompositeAlias(value, { aliasOf, transformAlias });
|
|
503
|
-
}
|
|
504
|
-
for (const [property, subvalue] of Object.entries(value)) {
|
|
505
|
-
let transformedValue: string;
|
|
506
|
-
if (partialAliasOf?.[property]) {
|
|
507
|
-
transformedValue = transformAlias(partialAliasOf[property]!);
|
|
508
|
-
} else {
|
|
509
|
-
switch (property) {
|
|
510
|
-
case 'fontFamily': {
|
|
511
|
-
transformedValue = transformFontFamilyValue(subvalue as string[], { transformAlias });
|
|
512
|
-
break;
|
|
513
|
-
}
|
|
514
|
-
case 'fontSize':
|
|
515
|
-
case 'fontWeight': {
|
|
516
|
-
transformedValue = transformFontWeightValue(subvalue as string, { transformAlias });
|
|
517
|
-
break;
|
|
518
|
-
}
|
|
519
|
-
default: {
|
|
520
|
-
transformedValue = transformStringValue(subvalue as string, { transformAlias });
|
|
521
|
-
break;
|
|
522
|
-
}
|
|
523
|
-
}
|
|
80
|
+
case 'fontWeight': {
|
|
81
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
82
|
+
return transformFontWeightValue($value, { aliasOf, transformAlias });
|
|
83
|
+
}
|
|
84
|
+
case 'gradient': {
|
|
85
|
+
const { $value, aliasOf, partialAliasOf } = token.mode[mode]!;
|
|
86
|
+
return transformGradientValue($value, { aliasOf, partialAliasOf, transformAlias });
|
|
87
|
+
}
|
|
88
|
+
case 'link': {
|
|
89
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
90
|
+
return transformLinkValue($value, { aliasOf, transformAlias });
|
|
91
|
+
}
|
|
92
|
+
case 'number': {
|
|
93
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
94
|
+
return transformNumberValue($value, { aliasOf, transformAlias });
|
|
95
|
+
}
|
|
96
|
+
case 'shadow': {
|
|
97
|
+
const { $value, aliasOf, partialAliasOf } = token.mode[mode]!;
|
|
98
|
+
return transformShadowValue($value, { aliasOf, partialAliasOf, transformAlias });
|
|
99
|
+
}
|
|
100
|
+
case 'string': {
|
|
101
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
102
|
+
return transformStringValue($value, { aliasOf, transformAlias });
|
|
103
|
+
}
|
|
104
|
+
case 'strokeStyle': {
|
|
105
|
+
const { $value, aliasOf } = token.mode[mode]!;
|
|
106
|
+
return transformStrokeStyleValue($value, { aliasOf, transformAlias });
|
|
107
|
+
}
|
|
108
|
+
case 'transition': {
|
|
109
|
+
const { $value, aliasOf, partialAliasOf } = token.mode[mode]!;
|
|
110
|
+
return transformTransitionValue($value, { aliasOf, partialAliasOf, transformAlias });
|
|
111
|
+
}
|
|
112
|
+
case 'typography': {
|
|
113
|
+
const { $value, aliasOf, partialAliasOf } = token.mode[mode]!;
|
|
114
|
+
return transformTypographyValue($value, { aliasOf, partialAliasOf, transformAlias });
|
|
524
115
|
}
|
|
525
|
-
output[kebabCase(property)] = transformedValue;
|
|
526
|
-
}
|
|
527
|
-
return output;
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
const CSS_VAR_RE =
|
|
531
|
-
/(?:(\p{Uppercase_Letter}?\p{Lowercase_Letter}+|\p{Uppercase_Letter}+|\p{Number}+|[\u{80}-\u{10FFFF}]+|_)|.)/u;
|
|
532
|
-
|
|
533
|
-
export interface MakeCSSVarOptions {
|
|
534
|
-
/** Prefix with string */
|
|
535
|
-
prefix?: string;
|
|
536
|
-
/** Wrap with `var(…)` (default: false) */
|
|
537
|
-
wrapVar?: boolean;
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
/**
|
|
541
|
-
* Generate a valid CSS variable from any string
|
|
542
|
-
* Code by @dfrankland
|
|
543
|
-
*/
|
|
544
|
-
export function makeCSSVar(name: string, { prefix, wrapVar = false }: MakeCSSVarOptions = {}): string {
|
|
545
|
-
let property = name.split(CSS_VAR_RE).filter(Boolean).join('-');
|
|
546
|
-
if (prefix && !property.startsWith(`${prefix}-`)) {
|
|
547
|
-
property = `${prefix}-${property}`;
|
|
548
116
|
}
|
|
549
|
-
const finalProperty = `--${property}`.toLocaleLowerCase();
|
|
550
|
-
return wrapVar ? `var(${finalProperty})` : finalProperty;
|
|
551
117
|
}
|