@primer/primitives 7.17.0-rc.8ff6ed39 → 7.17.0-rc.8fffddc7

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 (136) hide show
  1. package/README.md +1 -1
  2. package/dist/css/functional/themes/dark-colorblind.css +10 -0
  3. package/dist/css/functional/themes/dark-dimmed.css +10 -0
  4. package/dist/css/functional/themes/dark-high-contrast.css +10 -0
  5. package/dist/css/functional/themes/dark-tritanopia.css +10 -0
  6. package/dist/css/functional/themes/dark.css +10 -0
  7. package/dist/css/functional/themes/light-colorblind.css +10 -0
  8. package/dist/css/functional/themes/light-high-contrast.css +10 -0
  9. package/dist/css/functional/themes/light-tritanopia.css +10 -0
  10. package/dist/css/functional/themes/light.css +10 -0
  11. package/dist/css/functional/typography/typography.css +1 -1
  12. package/dist/docs/base/typography/typography.json +52 -4
  13. package/dist/docs/functional/themes/dark-colorblind.json +145 -0
  14. package/dist/docs/functional/themes/dark-dimmed.json +145 -0
  15. package/dist/docs/functional/themes/dark-high-contrast.json +145 -0
  16. package/dist/docs/functional/themes/dark-tritanopia.json +145 -0
  17. package/dist/docs/functional/themes/dark.json +145 -0
  18. package/dist/docs/functional/themes/light-colorblind.json +145 -0
  19. package/dist/docs/functional/themes/light-high-contrast.json +145 -0
  20. package/dist/docs/functional/themes/light-tritanopia.json +145 -0
  21. package/dist/docs/functional/themes/light.json +145 -0
  22. package/dist/docs/functional/typography/typography.json +494 -36
  23. package/dist/fallbacks/functional/typography/typography.json +1 -1
  24. package/dist/figma/figma.json +18 -1
  25. package/dist/figma/themes/dark-colorblind.json +80 -0
  26. package/dist/figma/themes/dark-dimmed.json +80 -0
  27. package/dist/figma/themes/dark-high-contrast.json +80 -0
  28. package/dist/figma/themes/dark-tritanopia.json +80 -0
  29. package/dist/figma/themes/dark.json +80 -0
  30. package/dist/figma/themes/light-colorblind.json +80 -0
  31. package/dist/figma/themes/light-high-contrast.json +80 -0
  32. package/dist/figma/themes/light-tritanopia.json +80 -0
  33. package/dist/figma/themes/light.json +80 -0
  34. package/dist/figma/typography/typography.json +370 -0
  35. package/dist/internalCss/dark-colorblind.css +10 -0
  36. package/dist/internalCss/dark-dimmed.css +10 -0
  37. package/dist/internalCss/dark-high-contrast.css +10 -0
  38. package/dist/internalCss/dark-tritanopia.css +10 -0
  39. package/dist/internalCss/dark.css +10 -0
  40. package/dist/internalCss/light-colorblind.css +10 -0
  41. package/dist/internalCss/light-high-contrast.css +10 -0
  42. package/dist/internalCss/light-tritanopia.css +10 -0
  43. package/dist/internalCss/light.css +10 -0
  44. package/dist/styleLint/base/typography/typography.json +52 -4
  45. package/dist/styleLint/functional/themes/dark-colorblind.json +145 -0
  46. package/dist/styleLint/functional/themes/dark-dimmed.json +145 -0
  47. package/dist/styleLint/functional/themes/dark-high-contrast.json +145 -0
  48. package/dist/styleLint/functional/themes/dark-tritanopia.json +145 -0
  49. package/dist/styleLint/functional/themes/dark.json +145 -0
  50. package/dist/styleLint/functional/themes/light-colorblind.json +145 -0
  51. package/dist/styleLint/functional/themes/light-high-contrast.json +145 -0
  52. package/dist/styleLint/functional/themes/light-tritanopia.json +145 -0
  53. package/dist/styleLint/functional/themes/light.json +145 -0
  54. package/dist/styleLint/functional/typography/typography.json +494 -36
  55. package/package.json +4 -11
  56. package/src/PrimerStyleDictionary.ts +12 -0
  57. package/src/filters/index.ts +1 -0
  58. package/src/filters/isNumber.ts +8 -0
  59. package/src/formats/jsonFigma.ts +1 -0
  60. package/src/platforms/figma.ts +10 -1
  61. package/src/schemas/numberToken.ts +17 -0
  62. package/src/tokens/base/typography/typography.json +28 -4
  63. package/src/tokens/functional/color/dark/display-dark.json5 +66 -0
  64. package/src/tokens/functional/color/light/display-light.json5 +66 -0
  65. package/src/tokens/functional/typography/typography.json +263 -34
  66. package/src/transformers/floatToPixel.ts +33 -0
  67. package/src/transformers/fontFamilyToCss.ts +3 -4
  68. package/src/transformers/fontFamilyToFigma.ts +47 -0
  69. package/src/transformers/index.ts +2 -0
  70. package/src/transformers/utilities/hasSpaceInString.ts +6 -0
  71. package/build.js +0 -578
  72. package/tokens/base/size/size.json +0 -57
  73. package/tokens/base/typography/typography.json +0 -20
  74. package/tokens/functional/size/border.json +0 -48
  75. package/tokens/functional/size/breakpoints.json +0 -24
  76. package/tokens/functional/size/size-coarse.json +0 -27
  77. package/tokens/functional/size/size-fine.json +0 -27
  78. package/tokens/functional/size/size.json +0 -189
  79. package/tokens/functional/size/viewport.json +0 -24
  80. package/tokens/functional/typography/typography.json +0 -213
  81. package/tokens/removed/color.json +0 -421
  82. package/tokens-v2-private/css/tokens/base/size/size.css +0 -24
  83. package/tokens-v2-private/css/tokens/base/typography/typography.css +0 -11
  84. package/tokens-v2-private/css/tokens/functional/size/border.css +0 -17
  85. package/tokens-v2-private/css/tokens/functional/size/breakpoints.css +0 -13
  86. package/tokens-v2-private/css/tokens/functional/size/size-coarse.css +0 -11
  87. package/tokens-v2-private/css/tokens/functional/size/size-fine.css +0 -11
  88. package/tokens-v2-private/css/tokens/functional/size/size.css +0 -54
  89. package/tokens-v2-private/css/tokens/functional/size/viewport.css +0 -6
  90. package/tokens-v2-private/css/tokens/functional/typography/typography.css +0 -47
  91. package/tokens-v2-private/docs/docValues.json +0 -2209
  92. package/tokens-v2-private/js/module/tokens/base/size/size.js +0 -266
  93. package/tokens-v2-private/js/module/tokens/base/typography/typography.js +0 -77
  94. package/tokens-v2-private/js/module/tokens/functional/size/border.js +0 -165
  95. package/tokens-v2-private/js/module/tokens/functional/size/breakpoints.js +0 -101
  96. package/tokens-v2-private/js/module/tokens/functional/size/size-coarse.js +0 -73
  97. package/tokens-v2-private/js/module/tokens/functional/size/size-fine.js +0 -73
  98. package/tokens-v2-private/js/module/tokens/functional/size/size.js +0 -824
  99. package/tokens-v2-private/js/module/tokens/functional/size/viewport.js +0 -101
  100. package/tokens-v2-private/js/module/tokens/functional/typography/typography.js +0 -809
  101. package/tokens-v2-private/js/tokens/base/size/size.js +0 -22
  102. package/tokens-v2-private/js/tokens/base/typography/typography.js +0 -9
  103. package/tokens-v2-private/js/tokens/functional/size/border.js +0 -15
  104. package/tokens-v2-private/js/tokens/functional/size/breakpoints.js +0 -11
  105. package/tokens-v2-private/js/tokens/functional/size/size-coarse.js +0 -8
  106. package/tokens-v2-private/js/tokens/functional/size/size-fine.js +0 -8
  107. package/tokens-v2-private/js/tokens/functional/size/size.js +0 -52
  108. package/tokens-v2-private/js/tokens/functional/size/viewport.js +0 -11
  109. package/tokens-v2-private/js/tokens/functional/typography/typography.js +0 -45
  110. package/tokens-v2-private/scss/tokens/base/size/size.scss +0 -21
  111. package/tokens-v2-private/scss/tokens/base/typography/typography.scss +0 -8
  112. package/tokens-v2-private/scss/tokens/functional/size/border.scss +0 -14
  113. package/tokens-v2-private/scss/tokens/functional/size/breakpoints.scss +0 -10
  114. package/tokens-v2-private/scss/tokens/functional/size/size-coarse.scss +0 -7
  115. package/tokens-v2-private/scss/tokens/functional/size/size-fine.scss +0 -7
  116. package/tokens-v2-private/scss/tokens/functional/size/size.scss +0 -51
  117. package/tokens-v2-private/scss/tokens/functional/size/viewport.scss +0 -10
  118. package/tokens-v2-private/scss/tokens/functional/typography/typography.scss +0 -44
  119. package/tokens-v2-private/ts/tokens/base/size/size.d.ts +0 -31
  120. package/tokens-v2-private/ts/tokens/base/size/size.js +0 -30
  121. package/tokens-v2-private/ts/tokens/base/typography/typography.d.ts +0 -20
  122. package/tokens-v2-private/ts/tokens/base/typography/typography.js +0 -19
  123. package/tokens-v2-private/ts/tokens/functional/size/border.d.ts +0 -28
  124. package/tokens-v2-private/ts/tokens/functional/size/border.js +0 -27
  125. package/tokens-v2-private/ts/tokens/functional/size/breakpoints.d.ts +0 -20
  126. package/tokens-v2-private/ts/tokens/functional/size/breakpoints.js +0 -19
  127. package/tokens-v2-private/ts/tokens/functional/size/size-coarse.d.ts +0 -29
  128. package/tokens-v2-private/ts/tokens/functional/size/size-coarse.js +0 -28
  129. package/tokens-v2-private/ts/tokens/functional/size/size-fine.d.ts +0 -29
  130. package/tokens-v2-private/ts/tokens/functional/size/size-fine.js +0 -28
  131. package/tokens-v2-private/ts/tokens/functional/size/size.d.ts +0 -103
  132. package/tokens-v2-private/ts/tokens/functional/size/size.js +0 -102
  133. package/tokens-v2-private/ts/tokens/functional/size/viewport.d.ts +0 -20
  134. package/tokens-v2-private/ts/tokens/functional/size/viewport.js +0 -19
  135. package/tokens-v2-private/ts/tokens/functional/typography/typography.d.ts +0 -131
  136. package/tokens-v2-private/ts/tokens/functional/typography/typography.js +0 -130
@@ -2,34 +2,83 @@
2
2
  "fontStack": {
3
3
  "system": {
4
4
  "$value": "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'",
5
- "$type": "fontFamily"
5
+ "$type": "fontFamily",
6
+ "$extensions": {
7
+ "org.primer.figma": {
8
+ "collection": "typography",
9
+ "scopes": ["all"]
10
+ }
11
+ }
6
12
  },
7
13
  "sansSerif": {
8
14
  "$value": "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'",
9
- "$type": "fontFamily"
15
+ "$type": "fontFamily",
16
+ "$extensions": {
17
+ "org.primer.figma": {
18
+ "collection": "typography",
19
+ "scopes": ["all"]
20
+ }
21
+ }
10
22
  },
11
23
  "monospace": {
12
24
  "$value": "ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace",
13
- "$type": "fontFamily"
25
+ "$type": "fontFamily",
26
+ "$extensions": {
27
+ "org.primer.figma": {
28
+ "collection": "typography",
29
+ "scopes": ["all"]
30
+ }
31
+ }
14
32
  }
15
33
  },
16
34
  "text": {
17
35
  "display": {
18
36
  "lineBoxHeight": {
19
- "$value": "56px",
20
- "$type": "dimension"
37
+ "$value": 1.4,
38
+ "$type": "number",
39
+ "$extensions": {
40
+ "org.primer.data": {
41
+ "fontSize": 40
42
+ },
43
+ "org.primer.figma": {
44
+ "collection": "typography",
45
+ "scopes": ["all"],
46
+ "fontSizeInPx": 40
47
+ }
48
+ }
21
49
  },
22
50
  "size": {
23
51
  "$value": "40px",
24
- "$type": "dimension"
52
+ "$type": "dimension",
53
+ "$extensions": {
54
+ "org.primer.figma": {
55
+ "collection": "typography",
56
+ "scopes": ["all"]
57
+ }
58
+ }
25
59
  },
26
60
  "lineHeight": {
27
61
  "$value": 1.4,
28
- "$type": "number"
62
+ "$type": "number",
63
+ "$extensions": {
64
+ "org.primer.data": {
65
+ "fontSize": 40
66
+ },
67
+ "org.primer.figma": {
68
+ "collection": "typography",
69
+ "scopes": ["all"]
70
+ }
71
+ }
29
72
  },
30
73
  "weight": {
31
74
  "$value": "{base.text.weight.medium}",
32
- "$type": "fontWeight"
75
+ "$type": "fontWeight",
76
+ "$extensions": {
77
+ "org.primer.figma": {
78
+ "collection": "typography",
79
+ "scopes": ["all"]
80
+ }
81
+ }
33
82
  },
34
83
  "shorthand": {
35
84
  "$value": {
@@ -46,43 +95,106 @@
46
95
  "size": {
47
96
  "large": {
48
97
  "$value": "32px",
49
- "$type": "dimension"
98
+ "$type": "dimension",
99
+ "$extensions": {
100
+ "org.primer.figma": {
101
+ "collection": "typography",
102
+ "scopes": ["all"]
103
+ }
104
+ }
50
105
  },
51
106
  "medium": {
52
107
  "$value": "20px",
53
- "$type": "dimension"
108
+ "$type": "dimension",
109
+ "$extensions": {
110
+ "org.primer.figma": {
111
+ "collection": "typography",
112
+ "scopes": ["all"]
113
+ }
114
+ }
54
115
  },
55
116
  "small": {
56
117
  "$value": "16px",
57
- "$type": "dimension"
118
+ "$type": "dimension",
119
+ "$extensions": {
120
+ "org.primer.figma": {
121
+ "collection": "typography",
122
+ "scopes": ["all"]
123
+ }
124
+ }
58
125
  }
59
126
  },
60
127
  "lineHeight": {
61
128
  "large": {
62
129
  "$value": 1.5,
63
- "$type": "number"
130
+ "$type": "number",
131
+ "$extensions": {
132
+ "org.primer.data": {
133
+ "fontSize": 32
134
+ },
135
+ "org.primer.figma": {
136
+ "collection": "typography",
137
+ "scopes": ["all"]
138
+ }
139
+ }
64
140
  },
65
141
  "medium": {
66
142
  "$value": 1.6,
67
- "$type": "number"
143
+ "$type": "number",
144
+ "$extensions": {
145
+ "org.primer.data": {
146
+ "fontSize": 20
147
+ },
148
+ "org.primer.figma": {
149
+ "collection": "typography",
150
+ "scopes": ["all"]
151
+ }
152
+ }
68
153
  },
69
154
  "small": {
70
155
  "$value": 1.5,
71
- "$type": "number"
156
+ "$type": "number",
157
+ "$extensions": {
158
+ "org.primer.data": {
159
+ "fontSize": 16
160
+ },
161
+ "org.primer.figma": {
162
+ "collection": "typography",
163
+ "scopes": ["all"]
164
+ }
165
+ }
72
166
  }
73
167
  },
74
168
  "weight": {
75
169
  "large": {
76
170
  "$value": "{base.text.weight.semibold}",
77
- "$type": "fontWeight"
171
+ "$type": "fontWeight",
172
+ "$extensions": {
173
+ "org.primer.figma": {
174
+ "collection": "typography",
175
+ "scopes": ["all"]
176
+ }
177
+ }
78
178
  },
79
179
  "medium": {
80
180
  "$value": "{base.text.weight.semibold}",
81
- "$type": "fontWeight"
181
+ "$type": "fontWeight",
182
+ "$extensions": {
183
+ "org.primer.figma": {
184
+ "collection": "typography",
185
+ "scopes": ["all"]
186
+ }
187
+ }
82
188
  },
83
189
  "small": {
84
190
  "$value": "{base.text.weight.semibold}",
85
- "$type": "fontWeight"
191
+ "$type": "fontWeight",
192
+ "$extensions": {
193
+ "org.primer.figma": {
194
+ "collection": "typography",
195
+ "scopes": ["all"]
196
+ }
197
+ }
86
198
  }
87
199
  },
88
200
  "shorthand": {
@@ -121,15 +233,33 @@
121
233
  "subtitle": {
122
234
  "size": {
123
235
  "$value": "20px",
124
- "$type": "dimension"
236
+ "$type": "dimension",
237
+ "$extensions": {
238
+ "org.primer.figma": {
239
+ "collection": "typography",
240
+ "scopes": ["all"]
241
+ }
242
+ }
125
243
  },
126
244
  "lineHeight": {
127
245
  "$value": 1.6,
128
- "$type": "number"
246
+ "$type": "number",
247
+ "$extensions": {
248
+ "org.primer.figma": {
249
+ "collection": "typography",
250
+ "scopes": ["all"]
251
+ }
252
+ }
129
253
  },
130
254
  "weight": {
131
255
  "$value": "{base.text.weight.normal}",
132
- "$type": "fontWeight"
256
+ "$type": "fontWeight",
257
+ "$extensions": {
258
+ "org.primer.figma": {
259
+ "collection": "typography",
260
+ "scopes": ["all"]
261
+ }
262
+ }
133
263
  },
134
264
  "shorthand": {
135
265
  "$value": {
@@ -146,29 +276,74 @@
146
276
  "size": {
147
277
  "large": {
148
278
  "$value": "16px",
149
- "$type": "dimension"
279
+ "$type": "dimension",
280
+ "$extensions": {
281
+ "org.primer.figma": {
282
+ "collection": "typography",
283
+ "scopes": ["all"]
284
+ }
285
+ }
150
286
  },
151
287
  "medium": {
152
288
  "$value": "14px",
153
- "$type": "dimension"
289
+ "$type": "dimension",
290
+ "$extensions": {
291
+ "org.primer.figma": {
292
+ "collection": "typography",
293
+ "scopes": ["all"]
294
+ }
295
+ }
154
296
  },
155
297
  "small": {
156
298
  "$value": "12px",
157
- "$type": "dimension"
299
+ "$type": "dimension",
300
+ "$extensions": {
301
+ "org.primer.figma": {
302
+ "collection": "typography",
303
+ "scopes": ["all"]
304
+ }
305
+ }
158
306
  }
159
307
  },
160
308
  "lineHeight": {
161
309
  "large": {
162
310
  "$value": 1.5,
163
- "$type": "number"
311
+ "$type": "number",
312
+ "$extensions": {
313
+ "org.primer.data": {
314
+ "fontSize": 16
315
+ },
316
+ "org.primer.figma": {
317
+ "collection": "typography",
318
+ "scopes": ["all"]
319
+ }
320
+ }
164
321
  },
165
322
  "medium": {
166
323
  "$value": 1.4285,
167
- "$type": "number"
324
+ "$type": "number",
325
+ "$extensions": {
326
+ "org.primer.data": {
327
+ "fontSize": 14
328
+ },
329
+ "org.primer.figma": {
330
+ "collection": "typography",
331
+ "scopes": ["all"]
332
+ }
333
+ }
168
334
  },
169
335
  "small": {
170
336
  "$value": 1.6666,
171
- "$type": "number"
337
+ "$type": "number",
338
+ "$extensions": {
339
+ "org.primer.data": {
340
+ "fontSize": 12
341
+ },
342
+ "org.primer.figma": {
343
+ "collection": "typography",
344
+ "scopes": ["all"]
345
+ }
346
+ }
172
347
  }
173
348
  },
174
349
  "weight": {
@@ -211,15 +386,36 @@
211
386
  "caption": {
212
387
  "size": {
213
388
  "$value": "12px",
214
- "$type": "dimension"
389
+ "$type": "dimension",
390
+ "$extensions": {
391
+ "org.primer.figma": {
392
+ "collection": "typography",
393
+ "scopes": ["all"]
394
+ }
395
+ }
215
396
  },
216
397
  "lineHeight": {
217
398
  "$value": 1.3333,
218
- "$type": "number"
399
+ "$type": "number",
400
+ "$extensions": {
401
+ "org.primer.data": {
402
+ "fontSize": 12
403
+ },
404
+ "org.primer.figma": {
405
+ "collection": "typography",
406
+ "scopes": ["all"]
407
+ }
408
+ }
219
409
  },
220
410
  "weight": {
221
411
  "$value": "{base.text.weight.normal}",
222
- "$type": "fontWeight"
412
+ "$type": "fontWeight",
413
+ "$extensions": {
414
+ "org.primer.figma": {
415
+ "collection": "typography",
416
+ "scopes": ["all"]
417
+ }
418
+ }
223
419
  },
224
420
  "shorthand": {
225
421
  "$value": {
@@ -235,15 +431,36 @@
235
431
  "codeBlock": {
236
432
  "size": {
237
433
  "$value": "13px",
238
- "$type": "dimension"
434
+ "$type": "dimension",
435
+ "$extensions": {
436
+ "org.primer.figma": {
437
+ "collection": "typography",
438
+ "scopes": ["all"]
439
+ }
440
+ }
239
441
  },
240
442
  "lineHeight": {
241
443
  "$value": 1.5385,
242
- "$type": "number"
444
+ "$type": "number",
445
+ "$extensions": {
446
+ "org.primer.data": {
447
+ "fontSize": 13
448
+ },
449
+ "org.primer.figma": {
450
+ "collection": "typography",
451
+ "scopes": ["all"]
452
+ }
453
+ }
243
454
  },
244
455
  "weight": {
245
456
  "$value": "{base.text.weight.normal}",
246
- "$type": "fontWeight"
457
+ "$type": "fontWeight",
458
+ "$extensions": {
459
+ "org.primer.figma": {
460
+ "collection": "typography",
461
+ "scopes": ["all"]
462
+ }
463
+ }
247
464
  },
248
465
  "shorthand": {
249
466
  "$value": {
@@ -259,11 +476,23 @@
259
476
  "codeInline": {
260
477
  "size": {
261
478
  "$value": "0.9285em",
262
- "$type": "dimension"
479
+ "$type": "dimension",
480
+ "$extensions": {
481
+ "org.primer.figma": {
482
+ "collection": "typography",
483
+ "scopes": ["all"]
484
+ }
485
+ }
263
486
  },
264
487
  "weight": {
265
488
  "$value": "{base.text.weight.normal}",
266
- "$type": "fontWeight"
489
+ "$type": "fontWeight",
490
+ "$extensions": {
491
+ "org.primer.figma": {
492
+ "collection": "typography",
493
+ "scopes": ["all"]
494
+ }
495
+ }
267
496
  },
268
497
  "shorthand": {
269
498
  "$value": {
@@ -0,0 +1,33 @@
1
+ import type StyleDictionary from 'style-dictionary'
2
+ import {isNumber} from '../filters'
3
+ /**
4
+ * takes a value and returns it if its a px string if it is a float and the token has a fontSize value in extensions['org.primer.data']
5
+ * @param value
6
+ * @returns string
7
+ */
8
+ export const convertFloatToPixel = (token: StyleDictionary.TransformedToken) => {
9
+ // short circut if value is not a number
10
+ if (
11
+ typeof token.value !== 'number' ||
12
+ !token.$extensions?.['org.primer.data']?.fontSize ||
13
+ typeof token.$extensions?.['org.primer.data']?.fontSize !== 'number'
14
+ ) {
15
+ return token.value
16
+ }
17
+ // convert value
18
+ const convertedValue = token.$extensions?.['org.primer.data']?.fontSize * token.value
19
+ // return converted value
20
+ return convertedValue === 0 ? 0 : `${Math.round(convertedValue)}px`
21
+ }
22
+ /**
23
+ * @description converts a float value to a pixel value based on the provided fontSize on the tokersn extension
24
+ * @type value transformer — [StyleDictionary.ValueTransform](https://github.com/amzn/style-dictionary/blob/main/types/Transform.d.ts)
25
+ * @matcher matches all tokens of $type `isNumber`
26
+ * @transformer returns a pixel string
27
+ */
28
+ export const floatToPixel: StyleDictionary.Transform = {
29
+ type: `value`,
30
+ transitive: true,
31
+ matcher: isNumber,
32
+ transformer: (token: StyleDictionary.TransformedToken): string => convertFloatToPixel(token),
33
+ }
@@ -1,8 +1,7 @@
1
1
  import type StyleDictionary from 'style-dictionary'
2
2
  import {isFontFamily} from '../filters'
3
3
  import {getTokenValue} from './utilities/getTokenValue'
4
-
5
- const hasSpaceInName = (string: string) => /\s/g.test(string)
4
+ import {hasSpaceInString} from './utilities/hasSpaceInString'
6
5
  /**
7
6
  * takes a value and returns it if its a string or concats strings in an array quoting strings with spaces
8
7
  * @param value
@@ -18,7 +17,7 @@ export const parseFontFamily = (value: unknown): string => {
18
17
  if (typeof string !== 'string') {
19
18
  throw new Error(`Invalid value in array ${string}, must be a string`)
20
19
  }
21
- return hasSpaceInName(string) ? `'${string}'` : string
20
+ return hasSpaceInString(string) ? `'${string}'` : string
22
21
  })
23
22
  .join(', ')
24
23
  }
@@ -28,7 +27,7 @@ export const parseFontFamily = (value: unknown): string => {
28
27
  * @description converts fontFamily tokens value to string
29
28
  * @type value transformer — [StyleDictionary.ValueTransform](https://github.com/amzn/style-dictionary/blob/main/types/Transform.d.ts)
30
29
  * @matcher matches all tokens of $type `fontFamily`
31
- * @transformer returns a number
30
+ * @transformer returns a string
32
31
  */
33
32
  export const fontFamilyToCss: StyleDictionary.Transform = {
34
33
  type: `value`,
@@ -0,0 +1,47 @@
1
+ import type StyleDictionary from 'style-dictionary'
2
+ import {isFontFamily} from '../filters'
3
+ import {hasSpaceInString} from './utilities/hasSpaceInString'
4
+ /**
5
+ * takes a value and returns it if its a string or concats strings in an array quoting strings with spaces
6
+ * @param value
7
+ * @returns string
8
+ */
9
+ export const parseFontFamily = (
10
+ token: StyleDictionary.TransformedToken,
11
+ fontFamilies: Record<string, string> = {},
12
+ ): string => {
13
+ // return value from fontFamilies
14
+ if (token.name in fontFamilies) {
15
+ return fontFamilies[token.name]
16
+ }
17
+ // return string
18
+ if (typeof token.value === 'string') {
19
+ return token.value
20
+ }
21
+ // return stringified array
22
+ if (Array.isArray(token.value)) {
23
+ return token.value
24
+ .map((string: string) => {
25
+ if (typeof string !== 'string') {
26
+ throw new Error(`Invalid value in array ${string}, must be a string`)
27
+ }
28
+ return hasSpaceInString(string) ? `'${string}'` : string
29
+ })
30
+ .join(', ')
31
+ }
32
+ // invalid value
33
+ throw new Error(`Invalid value ${token.value}, should be a string or array of strings`)
34
+ }
35
+ /**
36
+ * @description converts fontFamily tokens value to string
37
+ * @type value transformer — [StyleDictionary.ValueTransform](https://github.com/amzn/style-dictionary/blob/main/types/Transform.d.ts)
38
+ * @matcher matches all tokens of $type `fontFamily`
39
+ * @transformer returns a string
40
+ */
41
+ export const fontFamilyToFigma: StyleDictionary.Transform = {
42
+ type: `value`,
43
+ transitive: true,
44
+ matcher: isFontFamily,
45
+ transformer: (token: StyleDictionary.TransformedToken, platform: StyleDictionary.Platform): string =>
46
+ parseFontFamily(token, platform.options?.fontFamilies),
47
+ }
@@ -4,12 +4,14 @@ export {colorToHexAlpha} from './colorToHexAlpha'
4
4
  export {colorToHexMix} from './colorToHexMix'
5
5
  export {colorToRgbAlpha} from './colorToRgbAlpha'
6
6
  export {colorToRgbaFloat} from './colorToRgbaFloat'
7
+ export {floatToPixel} from './floatToPixel'
7
8
  export {dimensionToRem} from './dimensionToRem'
8
9
  export {dimensionToRemPxArray} from './dimensionToRemPxArray'
9
10
  export {dimensionToPixelUnitless} from './dimensionToPixelUnitless'
10
11
  export {durationToCss} from './durationToCss'
11
12
  export {figmaAttributes} from './figmaAttributes'
12
13
  export {fontFamilyToCss} from './fontFamilyToCss'
14
+ export {fontFamilyToFigma} from './fontFamilyToFigma'
13
15
  export {fontWeightToNumber} from './fontWeightToNumber'
14
16
  export {jsonDeprecated} from './jsonDeprecated'
15
17
  export {namePathToCamelCase} from './namePathToCamelCase'
@@ -0,0 +1,6 @@
1
+ export const hasSpaceInString = (string: string): boolean => {
2
+ if (typeof string !== 'string') {
3
+ throw new TypeError(`Invalid input. Input must be a string, ${typeof string} provided`)
4
+ }
5
+ return /\s/g.test(string)
6
+ }