@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.
Files changed (92) hide show
  1. package/dist/color.d.ts +1 -9
  2. package/dist/color.js.map +1 -1
  3. package/dist/css/boolean.d.ts +6 -0
  4. package/dist/css/boolean.js +12 -0
  5. package/dist/css/boolean.js.map +1 -0
  6. package/dist/css/border.d.ts +13 -0
  7. package/dist/css/border.js +30 -0
  8. package/dist/css/border.js.map +1 -0
  9. package/dist/css/color.d.ts +13 -0
  10. package/dist/css/color.js +72 -0
  11. package/dist/css/color.js.map +1 -0
  12. package/dist/css/cubic-bezier.d.ts +8 -0
  13. package/dist/css/cubic-bezier.js +11 -0
  14. package/dist/css/cubic-bezier.js.map +1 -0
  15. package/dist/css/dimension.d.ts +6 -0
  16. package/dist/css/dimension.js +12 -0
  17. package/dist/css/dimension.js.map +1 -0
  18. package/dist/css/duration.d.ts +6 -0
  19. package/dist/css/duration.js +12 -0
  20. package/dist/css/duration.js.map +1 -0
  21. package/dist/css/font-family.d.ts +7 -0
  22. package/dist/css/font-family.js +22 -0
  23. package/dist/css/font-family.js.map +1 -0
  24. package/dist/css/font-weight.d.ts +6 -0
  25. package/dist/css/font-weight.js +9 -0
  26. package/dist/css/font-weight.js.map +1 -0
  27. package/dist/css/gradient.d.ts +9 -0
  28. package/dist/css/gradient.js +24 -0
  29. package/dist/css/gradient.js.map +1 -0
  30. package/dist/css/index.d.ts +25 -162
  31. package/dist/css/index.js +93 -315
  32. package/dist/css/index.js.map +1 -1
  33. package/dist/css/lib.d.ts +24 -0
  34. package/dist/css/lib.js +36 -0
  35. package/dist/css/lib.js.map +1 -0
  36. package/dist/css/link.d.ts +6 -0
  37. package/dist/css/link.js +9 -0
  38. package/dist/css/link.js.map +1 -0
  39. package/dist/css/number.d.ts +6 -0
  40. package/dist/css/number.js +6 -0
  41. package/dist/css/number.js.map +1 -0
  42. package/dist/css/shadow.d.ts +14 -0
  43. package/dist/css/shadow.js +42 -0
  44. package/dist/css/shadow.js.map +1 -0
  45. package/dist/css/string.d.ts +6 -0
  46. package/dist/css/string.js +8 -0
  47. package/dist/css/string.js.map +1 -0
  48. package/dist/css/stroke-style.d.ts +7 -0
  49. package/dist/css/stroke-style.js +9 -0
  50. package/dist/css/stroke-style.js.map +1 -0
  51. package/dist/css/transition.d.ts +14 -0
  52. package/dist/css/transition.js +21 -0
  53. package/dist/css/transition.js.map +1 -0
  54. package/dist/css/typography.d.ts +7 -0
  55. package/dist/css/typography.js +38 -0
  56. package/dist/css/typography.js.map +1 -0
  57. package/dist/index.d.ts +2 -0
  58. package/dist/index.js +2 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/js/index.d.ts +12 -0
  61. package/dist/js/index.js +16 -0
  62. package/dist/js/index.js.map +1 -0
  63. package/dist/transform.d.ts +6 -0
  64. package/dist/transform.js +17 -0
  65. package/dist/transform.js.map +1 -0
  66. package/dist/types.d.ts +384 -0
  67. package/dist/types.js +2 -0
  68. package/dist/types.js.map +1 -0
  69. package/package.json +7 -5
  70. package/src/color.ts +1 -27
  71. package/src/css/boolean.ts +15 -0
  72. package/src/css/border.ts +46 -0
  73. package/src/css/color.ts +80 -0
  74. package/src/css/cubic-bezier.ts +23 -0
  75. package/src/css/dimension.ts +15 -0
  76. package/src/css/duration.ts +15 -0
  77. package/src/css/font-family.ts +32 -0
  78. package/src/css/font-weight.ts +12 -0
  79. package/src/css/gradient.ts +42 -0
  80. package/src/css/index.ts +105 -539
  81. package/src/css/lib.ts +54 -0
  82. package/src/css/link.ts +12 -0
  83. package/src/css/number.ts +9 -0
  84. package/src/css/shadow.ts +75 -0
  85. package/src/css/string.ts +11 -0
  86. package/src/css/stroke-style.ts +13 -0
  87. package/src/css/transition.ts +41 -0
  88. package/src/css/typography.ts +44 -0
  89. package/src/index.ts +2 -0
  90. package/src/js/index.ts +31 -0
  91. package/src/transform.ts +23 -0
  92. package/src/types.ts +524 -0
package/src/css/index.ts CHANGED
@@ -1,551 +1,117 @@
1
- import { clampChroma, type Color, formatCss, displayable } from 'culori';
2
- import { kebabCase } from 'scule';
3
- import { CSS_TO_CULORI, parseColor } from '../color.js';
4
-
5
- /** Function that generates a var(…) statement */
6
- export type IDGenerator = (id: string) => string;
7
-
8
- // note: this is the lowest-level package, so this type has to be redeclared
9
- // here rather than create a circular dep with @terrazzo/parser
10
- export type ColorValue =
11
- | string
12
- | { colorSpace: string; channels: [number, number, number]; alpha: number; hex?: string };
13
-
14
- export type WideGamutColorValue = { '.': string; srgb: string; p3: string; rec2020: string };
15
-
16
- export const defaultAliasTransform = (id: string) => `var(${makeCSSVar(id)})`;
17
-
18
- /** Convert boolean value to CSS string */
19
- export function transformBooleanValue(
20
- value: boolean,
21
- { aliasOf, transformAlias = defaultAliasTransform }: { aliasOf?: string; transformAlias?: IDGenerator } = {},
22
- ): string {
23
- if (aliasOf) {
24
- return transformAlias(aliasOf);
25
- }
26
- if (typeof value !== 'boolean') {
27
- throw new Error(`Expected boolean, received ${typeof value} "${value}"`);
28
- }
29
- return value ? '1' : '0';
30
- }
31
-
32
- export interface BorderValue {
33
- width: string;
34
- color: string | ColorValue;
35
- style: string | StrokeStyleValue;
36
- }
37
-
38
- /** Generate shorthand CSS for select token types */
39
- export function generateShorthand({ $type, localID }: { $type: string; localID: string }): string | undefined {
40
- switch ($type) {
41
- case 'transition': {
42
- return ['duration', 'delay', 'timing-function']
43
- .map((p) => makeCSSVar(`${localID}-${p}`, { wrapVar: true }))
44
- .join(' ');
45
- }
46
- // note: "typography" is not set in shorthand because it can often unset values unintentionally.
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 (aliasOf) {
65
- return transformAlias(aliasOf);
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
- const { colorSpace, channels, alpha } = typeof value === 'string' ? parseColor(value) : value;
101
- const color = { mode: CSS_TO_CULORI[colorSpace], alpha } as Color;
102
- switch (color.mode) {
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 'hsl': {
115
- color.h = channels[0];
116
- color.s = channels[1];
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 'hsv': {
121
- color.h = channels[0];
122
- color.s = channels[1];
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 'hwb': {
127
- color.h = channels[0];
128
- color.w = channels[1];
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 'lab':
133
- case 'oklab': {
134
- color.l = channels[0];
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 'lch':
140
- case 'oklch': {
141
- color.l = channels[0];
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 'xyz50':
147
- case 'xyz65': {
148
- color.x = channels[0];
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
- return displayable(color)
156
- ? formatCss(color)
157
- : {
158
- '.': formatCss(color),
159
- srgb: (typeof value === 'object' && value.hex) || formatCss(clampChroma(color, color.mode, 'rgb')),
160
- p3: formatCss(clampChroma(color, color.mode, 'p3')),
161
- rec2020: formatCss(clampChroma(color, color.mode, 'rec2020')),
162
- };
163
- }
164
-
165
- export type CubicBézierValue = [string | number, string | number, string | number, string | number];
166
-
167
- /** Convert cubicBezier value to CSS */
168
- export function transformCubicBezierValue(
169
- value: CubicBézierValue,
170
- {
171
- aliasOf,
172
- partialAliasOf,
173
- transformAlias = defaultAliasTransform,
174
- }: {
175
- aliasOf?: string;
176
- partialAliasOf?: [string | undefined, string | undefined, string | undefined, string | undefined];
177
- transformAlias?: IDGenerator;
178
- } = {},
179
- ): string {
180
- if (aliasOf) {
181
- return transformAlias(aliasOf);
182
- }
183
- return `cubic-bezier(${value
184
- .map((v, i) => (partialAliasOf?.[i] ? transformAlias(partialAliasOf[i]!) : v))
185
- .join(', ')})`;
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
  }