@digdir/designsystemet 0.1.0-next.22 → 0.1.0-next.23

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 (31) hide show
  1. package/dist/src/colors/colorUtils.js +10 -10
  2. package/dist/src/init/createTokensPackage.js +27 -4
  3. package/dist/src/init/generateMetadataJson.js +6 -4
  4. package/dist/src/init/generateThemesJson.js +56 -5
  5. package/dist/src/init/nextStepsMarkdown.js +2 -2
  6. package/dist/src/init/template/default-files/design-tokens/primitives/globals.json +32 -68
  7. package/dist/src/init/template/default-files/design-tokens/primitives/size/default.json +175 -0
  8. package/dist/src/init/template/default-files/design-tokens/semantic/color.json +280 -270
  9. package/dist/src/init/template/default-files/design-tokens/semantic/style.json +307 -286
  10. package/dist/src/init/template/template-files/design-tokens/primitives/modes/colors/contrast/theme-template.json +314 -0
  11. package/dist/src/init/template/template-files/design-tokens/primitives/modes/colors/dark/global.json +376 -0
  12. package/dist/src/init/template/template-files/design-tokens/primitives/modes/colors/dark/theme-template.json +314 -0
  13. package/dist/src/init/template/template-files/design-tokens/primitives/modes/colors/light/global.json +376 -0
  14. package/dist/src/init/template/template-files/design-tokens/primitives/modes/colors/light/theme-template.json +314 -0
  15. package/dist/src/init/template/template-files/design-tokens/primitives/modes/typography/primary/theme-template.json +30 -0
  16. package/dist/src/init/template/template-files/design-tokens/primitives/modes/typography/secondary/theme-template.json +30 -0
  17. package/dist/src/init/template/template-files/design-tokens/themes/theme-template.json +170 -150
  18. package/dist/src/init/template/template-files/package.json +1 -1
  19. package/dist/src/tokens/formats/css.js +6 -8
  20. package/dist/types/src/init/createTokensPackage.d.ts.map +1 -1
  21. package/dist/types/src/init/generateMetadataJson.d.ts.map +1 -1
  22. package/dist/types/src/init/generateThemesJson.d.ts.map +1 -1
  23. package/dist/types/src/tokens/formats/css.d.ts.map +1 -1
  24. package/package.json +1 -1
  25. package/dist/src/init/template/default-files/design-tokens/primitives/typography/default.json +0 -86
  26. package/dist/src/init/template/template-files/design-tokens/primitives/colors/contrast/theme-template.json +0 -314
  27. package/dist/src/init/template/template-files/design-tokens/primitives/colors/dark/global.json +0 -376
  28. package/dist/src/init/template/template-files/design-tokens/primitives/colors/dark/theme-template.json +0 -314
  29. package/dist/src/init/template/template-files/design-tokens/primitives/colors/light/global.json +0 -376
  30. package/dist/src/init/template/template-files/design-tokens/primitives/colors/light/theme-template.json +0 -314
  31. /package/dist/src/init/template/template-files/design-tokens/primitives/{colors → modes/colors}/contrast/global.json +0 -0
@@ -20,7 +20,7 @@ const hexToCssHsl = (hex, valuesOnly = false) => {
20
20
  let h = 0;
21
21
  let s = 0;
22
22
  let l = (max + min) / 2;
23
- if (max == min) {
23
+ if (max === min) {
24
24
  h = s = 0;
25
25
  } else {
26
26
  const d = max - min;
@@ -48,11 +48,11 @@ const hexToHSL = (H) => {
48
48
  let r = 0;
49
49
  let g = 0;
50
50
  let b = 0;
51
- if (H.length == 4) {
51
+ if (H.length === 4) {
52
52
  r = parseInt("0x" + H[1] + H[1]);
53
53
  g = parseInt("0x" + H[2] + H[2]);
54
54
  b = parseInt("0x" + H[3] + H[3]);
55
- } else if (H.length == 7) {
55
+ } else if (H.length === 7) {
56
56
  r = parseInt("0x" + H[1] + H[2]);
57
57
  g = parseInt("0x" + H[3] + H[4]);
58
58
  b = parseInt("0x" + H[5] + H[6]);
@@ -66,14 +66,14 @@ const hexToHSL = (H) => {
66
66
  const cmin = Math.min(r, g, b);
67
67
  const cmax = Math.max(r, g, b);
68
68
  const delta = cmax - cmin;
69
- if (delta == 0) h = 0;
70
- else if (cmax == r) h = (g - b) / delta % 6;
71
- else if (cmax == g) h = (b - r) / delta + 2;
69
+ if (delta === 0) h = 0;
70
+ else if (cmax === r) h = (g - b) / delta % 6;
71
+ else if (cmax === g) h = (b - r) / delta + 2;
72
72
  else h = (r - g) / delta + 4;
73
73
  h = Math.round(h * 60);
74
74
  if (h < 0) h += 360;
75
75
  l = (cmax + cmin) / 2;
76
- s = delta == 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
76
+ s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
77
77
  s = +(s * 100).toFixed(1);
78
78
  l = +(l * 100).toFixed(1);
79
79
  return [h, s, l];
@@ -124,9 +124,9 @@ const HSLToHex = (h, s, l) => {
124
124
  r = parseInt(Math.round((r + m) * 255).toString(16), 16);
125
125
  g = parseInt(Math.round((g + m) * 255).toString(16), 16);
126
126
  b = parseInt(Math.round((b + m) * 255).toString(16), 16);
127
- if (r.toString().length == 1) r = parseInt("0" + r.toString(), 10);
128
- if (g.toString().length == 1) g = parseInt("0" + g.toString(), 10);
129
- if (b.toString().length == 1) b = parseInt("0" + b.toString(), 10);
127
+ if (r.toString().length === 1) r = parseInt("0" + r.toString(), 10);
128
+ if (g.toString().length === 1) g = parseInt("0" + g.toString(), 10);
129
+ if (b.toString().length === 1) b = parseInt("0" + b.toString(), 10);
130
130
  return "#" + r + g + b;
131
131
  };
132
132
  const hexToRgb = (hex) => {
@@ -176,20 +176,43 @@ Will now create the following:
176
176
  await fs.mkdir(path.join(TOKENS_TARGET_DIR, "themes"));
177
177
  } catch {
178
178
  }
179
+ try {
180
+ await fs.mkdir(path.join(TOKENS_TARGET_DIR, "themes"));
181
+ } catch {
182
+ }
183
+ try {
184
+ await fs.mkdir(path.join(TOKENS_TARGET_DIR, "primitives/modes/typography/primary"), { recursive: true });
185
+ await fs.mkdir(path.join(TOKENS_TARGET_DIR, "primitives/modes/typography/secondary"), { recursive: true });
186
+ } catch {
187
+ }
179
188
  for (const theme of themes.map(normalizeTokenSetName)) {
180
189
  for (const mode of modes.map(normalizeTokenSetName)) {
181
190
  await fs.cp(
182
- path.join(TOKEN_TEMPLATE_FILES_PATH, `primitives/colors/${mode}/global.json`),
183
- path.join(TOKENS_TARGET_DIR, `primitives/colors/${mode}/global.json`),
191
+ path.join(TOKEN_TEMPLATE_FILES_PATH, `primitives/modes/colors/${mode}/global.json`),
192
+ path.join(TOKENS_TARGET_DIR, `primitives/modes/colors/${mode}/global.json`),
184
193
  { recursive: true }
185
194
  );
186
195
  const template2 = await fs.readFile(
187
- path.join(TOKEN_TEMPLATE_FILES_PATH, `primitives/colors/${mode}/theme-template.json`)
196
+ path.join(TOKEN_TEMPLATE_FILES_PATH, `primitives/modes/colors/${mode}/theme-template.json`)
188
197
  );
189
198
  await fs.writeFile(
190
- path.join(TOKENS_TARGET_DIR, `primitives/colors/${mode}/${theme}.json`),
199
+ path.join(TOKENS_TARGET_DIR, `primitives/modes/colors/${mode}/${theme}.json`),
191
200
  template2.toString("utf-8").replaceAll("<theme>", theme)
192
201
  );
202
+ const templatePrimaryTypo = await fs.readFile(
203
+ path.join(TOKEN_TEMPLATE_FILES_PATH, `primitives/modes/typography/primary/theme-template.json`)
204
+ );
205
+ await fs.writeFile(
206
+ path.join(TOKENS_TARGET_DIR, `primitives/modes/typography/primary/${theme}.json`),
207
+ templatePrimaryTypo.toString("utf-8").replaceAll("<theme>", theme)
208
+ );
209
+ const templateSecondaryTypo = await fs.readFile(
210
+ path.join(TOKEN_TEMPLATE_FILES_PATH, `primitives/modes/typography/secondary/theme-template.json`)
211
+ );
212
+ await fs.writeFile(
213
+ path.join(TOKENS_TARGET_DIR, `primitives/modes/typography/secondary/${theme}.json`),
214
+ templateSecondaryTypo.toString("utf-8").replaceAll("<theme>", theme)
215
+ );
193
216
  }
194
217
  const template = await fs.readFile(path.join(TOKEN_TEMPLATE_FILES_PATH, `themes/theme-template.json`));
195
218
  await fs.writeFile(
@@ -2,11 +2,13 @@ import { normalizeTokenSetName } from "./utils.js";
2
2
  function generateMetadataJson(modes, themes) {
3
3
  return {
4
4
  tokenSetOrder: [
5
- "primitives/globals",
6
- "primitives/typography/default",
5
+ "primitives/modes/globals",
6
+ "primitives/modes/typography/default",
7
7
  ...modes.flatMap((mode) => [
8
- `primitives/colors/${normalizeTokenSetName(mode)}/global`,
9
- ...themes.map((theme) => `primitives/colors/${normalizeTokenSetName(mode)}/${normalizeTokenSetName(theme)}`)
8
+ `primitives/modes/colors/${normalizeTokenSetName(mode)}/global`,
9
+ ...themes.map(
10
+ (theme) => `primitives/modes/colors/${normalizeTokenSetName(mode)}/${normalizeTokenSetName(theme)}`
11
+ )
10
12
  ]),
11
13
  ...themes.map((theme) => `themes/${normalizeTokenSetName(theme)}`),
12
14
  "semantic/color",
@@ -2,7 +2,33 @@ import { randomUUID } from "node:crypto";
2
2
  import { TokenSetStatus } from "@tokens-studio/types";
3
3
  import { normalizeTokenSetName } from "./utils.js";
4
4
  function generateThemesJson(modes, themes) {
5
- return [...generateModesGroup(modes, themes), ...generateThemesGroup(themes), generateSemanticGroup()];
5
+ return [
6
+ ...generateSizeGroup(),
7
+ ...generateThemesGroup(themes),
8
+ ...generateTypographyGroup(themes),
9
+ ...generateModesGroup(modes, themes),
10
+ generateSemanticGroup()
11
+ ];
12
+ }
13
+ function generateSizeGroup() {
14
+ return [
15
+ {
16
+ id: randomUUID(),
17
+ name: "default",
18
+ selectedTokenSets: {
19
+ "primitives/size/default": TokenSetStatus.ENABLED
20
+ },
21
+ group: "Size"
22
+ },
23
+ {
24
+ id: randomUUID(),
25
+ name: "compact",
26
+ selectedTokenSets: {
27
+ "primitives/size/compact": TokenSetStatus.ENABLED
28
+ },
29
+ group: "Size"
30
+ }
31
+ ];
6
32
  }
7
33
  function generateModesGroup(modes, themes) {
8
34
  return modes.map(
@@ -10,10 +36,10 @@ function generateModesGroup(modes, themes) {
10
36
  id: randomUUID(),
11
37
  name: mode,
12
38
  selectedTokenSets: Object.fromEntries([
13
- [`primitives/colors/${normalizeTokenSetName(mode)}/global`, TokenSetStatus.ENABLED],
39
+ [`primitives/modes/colors/${normalizeTokenSetName(mode)}/global`, TokenSetStatus.ENABLED],
14
40
  ...themes.map(
15
41
  (theme) => [
16
- `primitives/colors/${normalizeTokenSetName(mode)}/${normalizeTokenSetName(theme)}`,
42
+ `primitives/modes/colors/${normalizeTokenSetName(mode)}/${normalizeTokenSetName(theme)}`,
17
43
  TokenSetStatus.ENABLED
18
44
  ]
19
45
  )
@@ -41,12 +67,37 @@ function generateSemanticGroup() {
41
67
  selectedTokenSets: {
42
68
  "semantic/style": TokenSetStatus.ENABLED,
43
69
  "semantic/color": TokenSetStatus.ENABLED,
44
- "primitives/globals": TokenSetStatus.SOURCE,
45
- "primitives/typography/default": TokenSetStatus.SOURCE
70
+ "primitives/globals": TokenSetStatus.SOURCE
46
71
  },
47
72
  group: "Semantic"
48
73
  };
49
74
  }
75
+ function generateTypographyGroup(themes) {
76
+ return [
77
+ {
78
+ id: randomUUID(),
79
+ name: "primary",
80
+ selectedTokenSets: Object.fromEntries(
81
+ themes.map((theme) => [
82
+ `primitives/modes/typography/primary/${normalizeTokenSetName(theme)}`,
83
+ TokenSetStatus.ENABLED
84
+ ])
85
+ ),
86
+ group: "Typography"
87
+ },
88
+ {
89
+ id: randomUUID(),
90
+ name: "secondary",
91
+ selectedTokenSets: Object.fromEntries(
92
+ themes.map((theme) => [
93
+ `primitives/modes/typography/secondary/${normalizeTokenSetName(theme)}`,
94
+ TokenSetStatus.ENABLED
95
+ ])
96
+ ),
97
+ group: "Typography"
98
+ }
99
+ ];
100
+ }
50
101
  export {
51
102
  generateThemesJson as default
52
103
  };
@@ -23,8 +23,8 @@ function nextStepsMarkdown(themes, modes, tokensTargetDir, packageName) {
23
23
  1. Go to https://theme.designsystemet.no and set up a color theme
24
24
  2. Press "Kopier tema"
25
25
  3. Under "Json til Figma", copy the contents under ${modes.join(" / ")} to
26
- the corresponding file under \`${tokensTargetDir}\`:
27
- ${themeModeCombinations.map(([theme, mode]) => ` **${theme}, ${mode}**: \`primitives/colors/${normalizeTokenSetName(mode)}/${normalizeTokenSetName(theme)}.json\` `).join("\n")}
26
+ the corresponding file under \`${tokensTargetDir}\`:
27
+ ${themeModeCombinations.map(([theme, mode]) => ` **${theme}, ${mode}**: \`primitives/modes/colors/${normalizeTokenSetName(mode)}/${normalizeTokenSetName(theme)}.json\` `).join("\n")}
28
28
  This can also be done in Tokens Studio for Figma.
29
29
  4. **IMPORTANT!** In the JSON data you copied, replace \`theme\` on line 2
30
30
  with the correct theme identifier, depending on the theme you're customizing.
@@ -1,21 +1,20 @@
1
1
  {
2
2
  "border-width": {
3
3
  "1": {
4
- "type": "borderWidth",
5
- "value": "1px"
4
+ "$type": "borderWidth",
5
+ "$value": "1px"
6
6
  },
7
7
  "2": {
8
- "type": "borderWidth",
9
- "value": "2px"
8
+ "$type": "borderWidth",
9
+ "$value": "2px"
10
10
  }
11
11
  },
12
12
  "shadow": {
13
13
  "100": {
14
- "type": "boxShadow",
15
- "value": [
14
+ "$type": "boxShadow",
15
+ "$value": [
16
16
  {
17
17
  "color": "rgba(0,0,0,0.16)",
18
- "type": "dropShadow",
19
18
  "x": "0",
20
19
  "y": "0",
21
20
  "blur": "1",
@@ -26,17 +25,15 @@
26
25
  "y": "1",
27
26
  "blur": "2",
28
27
  "spread": "0",
29
- "color": "rgba(0,0,0,0.12)",
30
- "type": "dropShadow"
28
+ "color": "rgba(0,0,0,0.12)"
31
29
  }
32
30
  ]
33
31
  },
34
32
  "200": {
35
- "type": "boxShadow",
36
- "value": [
33
+ "$type": "boxShadow",
34
+ "$value": [
37
35
  {
38
36
  "color": "rgba(0,0,0,0.15)",
39
- "type": "dropShadow",
40
37
  "x": "0",
41
38
  "y": "0",
42
39
  "blur": "1",
@@ -44,7 +41,6 @@
44
41
  },
45
42
  {
46
43
  "color": "rgba(0,0,0,0.12)",
47
- "type": "dropShadow",
48
44
  "x": "0",
49
45
  "y": "1",
50
46
  "blur": "2",
@@ -55,17 +51,15 @@
55
51
  "y": "2",
56
52
  "blur": "4",
57
53
  "spread": "0",
58
- "color": "rgba(0,0,0,0.1)",
59
- "type": "dropShadow"
54
+ "color": "rgba(0,0,0,0.1)"
60
55
  }
61
56
  ]
62
57
  },
63
58
  "300": {
64
- "type": "boxShadow",
65
- "value": [
59
+ "$type": "boxShadow",
60
+ "$value": [
66
61
  {
67
62
  "color": "rgba(0,0,0,0.14)",
68
- "type": "dropShadow",
69
63
  "x": "0",
70
64
  "y": "0",
71
65
  "blur": "1",
@@ -73,7 +67,6 @@
73
67
  },
74
68
  {
75
69
  "color": "rgba(0,0,0,0.12)",
76
- "type": "dropShadow",
77
70
  "x": "0",
78
71
  "y": "2",
79
72
  "blur": "4",
@@ -84,17 +77,15 @@
84
77
  "y": "4",
85
78
  "blur": "8",
86
79
  "spread": "0",
87
- "color": "rgba(0,0,0,0.12)",
88
- "type": "dropShadow"
80
+ "color": "rgba(0,0,0,0.12)"
89
81
  }
90
82
  ]
91
83
  },
92
84
  "400": {
93
- "type": "boxShadow",
94
- "value": [
85
+ "$type": "boxShadow",
86
+ "$value": [
95
87
  {
96
88
  "color": "rgba(0,0,0,0.13)",
97
- "type": "dropShadow",
98
89
  "x": "0",
99
90
  "y": "0",
100
91
  "blur": "1",
@@ -102,7 +93,6 @@
102
93
  },
103
94
  {
104
95
  "color": "rgba(0,0,0,0.13)",
105
- "type": "dropShadow",
106
96
  "x": "0",
107
97
  "y": "3",
108
98
  "blur": "5",
@@ -113,17 +103,15 @@
113
103
  "y": "6",
114
104
  "blur": "12",
115
105
  "spread": "0",
116
- "color": "rgba(0,0,0,0.14)",
117
- "type": "dropShadow"
106
+ "color": "rgba(0,0,0,0.14)"
118
107
  }
119
108
  ]
120
109
  },
121
110
  "500": {
122
- "type": "boxShadow",
123
- "value": [
111
+ "$type": "boxShadow",
112
+ "$value": [
124
113
  {
125
114
  "color": "rgba(0,0,0,0.12)",
126
- "type": "dropShadow",
127
115
  "x": "0",
128
116
  "y": "0",
129
117
  "blur": "1",
@@ -131,7 +119,6 @@
131
119
  },
132
120
  {
133
121
  "color": "rgba(0,0,0,0.16)",
134
- "type": "dropShadow",
135
122
  "x": "0",
136
123
  "y": "4",
137
124
  "blur": "8",
@@ -142,56 +129,33 @@
142
129
  "y": "12",
143
130
  "blur": "24",
144
131
  "spread": "0",
145
- "color": "rgba(0,0,0,0.16)",
146
- "type": "dropShadow"
132
+ "color": "rgba(0,0,0,0.16)"
147
133
  }
148
134
  ]
149
135
  }
150
136
  },
151
137
  "border-radius": {
152
- "2": {
153
- "type": "borderRadius",
154
- "value": "2"
155
- },
156
- "4": {
157
- "type": "borderRadius",
158
- "value": "4"
159
- },
160
- "8": {
161
- "type": "borderRadius",
162
- "value": "8"
163
- },
164
- "12": {
165
- "type": "borderRadius",
166
- "value": "12"
167
- },
168
- "16": {
169
- "type": "borderRadius",
170
- "value": "16"
171
- },
172
- "24": {
173
- "type": "borderRadius",
174
- "value": "24"
175
- },
176
- "32": {
177
- "type": "borderRadius",
178
- "value": "32"
179
- },
180
- "9999": {
181
- "type": "borderRadius",
182
- "value": "9999"
138
+ "base": {
139
+ "$type": "borderRadius",
140
+ "$value": "4"
183
141
  }
184
142
  },
185
143
  "opacity": {
186
144
  "30": {
187
- "type": "opacity",
188
- "value": "30%"
145
+ "$type": "opacity",
146
+ "$value": "30%"
189
147
  }
190
148
  },
191
149
  "sizing": {
192
150
  "base": {
193
- "type": "sizing",
194
- "value": "4"
151
+ "$type": "sizing",
152
+ "$value": "4"
153
+ }
154
+ },
155
+ "spacing": {
156
+ "base": {
157
+ "$type": "spacing",
158
+ "$value": "4"
195
159
  }
196
160
  }
197
161
  }
@@ -0,0 +1,175 @@
1
+ {
2
+ "line-height": {
3
+ "sm": {
4
+ "$extensions": {
5
+ "studio.tokens": {
6
+ "modify": {}
7
+ }
8
+ },
9
+ "$type": "lineHeights",
10
+ "$value": "130%"
11
+ },
12
+ "md": {
13
+ "$extensions": {
14
+ "studio.tokens": {
15
+ "modify": {}
16
+ }
17
+ },
18
+ "$type": "lineHeights",
19
+ "$value": "150%"
20
+ },
21
+ "lg": {
22
+ "$extensions": {
23
+ "studio.tokens": {
24
+ "modify": {}
25
+ }
26
+ },
27
+ "$type": "lineHeights",
28
+ "$value": "170%"
29
+ }
30
+ },
31
+ "font-size": {
32
+ "1": {
33
+ "$extensions": {
34
+ "studio.tokens": {
35
+ "modify": {}
36
+ }
37
+ },
38
+ "$type": "fontSizes",
39
+ "$value": "12"
40
+ },
41
+ "2": {
42
+ "$extensions": {
43
+ "studio.tokens": {
44
+ "modify": {}
45
+ }
46
+ },
47
+ "$type": "fontSizes",
48
+ "$value": "13"
49
+ },
50
+ "3": {
51
+ "$extensions": {
52
+ "studio.tokens": {
53
+ "modify": {}
54
+ }
55
+ },
56
+ "$type": "fontSizes",
57
+ "$value": "14"
58
+ },
59
+ "4": {
60
+ "$extensions": {
61
+ "studio.tokens": {
62
+ "modify": {}
63
+ }
64
+ },
65
+ "$type": "fontSizes",
66
+ "$value": "16"
67
+ },
68
+ "5": {
69
+ "$extensions": {
70
+ "studio.tokens": {
71
+ "modify": {}
72
+ }
73
+ },
74
+ "$type": "fontSizes",
75
+ "$value": "18"
76
+ },
77
+ "6": {
78
+ "$extensions": {
79
+ "studio.tokens": {
80
+ "modify": {}
81
+ }
82
+ },
83
+ "$type": "fontSizes",
84
+ "$value": "21"
85
+ },
86
+ "7": {
87
+ "$extensions": {
88
+ "studio.tokens": {
89
+ "modify": {}
90
+ }
91
+ },
92
+ "$type": "fontSizes",
93
+ "$value": "24"
94
+ },
95
+ "8": {
96
+ "$extensions": {
97
+ "studio.tokens": {
98
+ "modify": {}
99
+ }
100
+ },
101
+ "$type": "fontSizes",
102
+ "$value": "30"
103
+ },
104
+ "9": {
105
+ "$extensions": {
106
+ "studio.tokens": {
107
+ "modify": {}
108
+ }
109
+ },
110
+ "$type": "fontSizes",
111
+ "$value": "36"
112
+ },
113
+ "10": {
114
+ "$extensions": {
115
+ "studio.tokens": {
116
+ "modify": {}
117
+ }
118
+ },
119
+ "$type": "fontSizes",
120
+ "$value": "48"
121
+ },
122
+ "11": {
123
+ "$extensions": {
124
+ "studio.tokens": {
125
+ "modify": {}
126
+ }
127
+ },
128
+ "$type": "fontSizes",
129
+ "$value": "60"
130
+ }
131
+ },
132
+ "letter-spacing": {
133
+ "1": {
134
+ "$type": "letterSpacing",
135
+ "$value": "-1%"
136
+ },
137
+ "2": {
138
+ "$type": "letterSpacing",
139
+ "$value": "-0.5%"
140
+ },
141
+ "3": {
142
+ "$type": "letterSpacing",
143
+ "$value": "-0.25%"
144
+ },
145
+ "4": {
146
+ "$type": "letterSpacing",
147
+ "$value": "-0.15%"
148
+ },
149
+ "5": {
150
+ "$type": "letterSpacing",
151
+ "$value": "0%"
152
+ },
153
+ "6": {
154
+ "$type": "letterSpacing",
155
+ "$value": "0.15%"
156
+ },
157
+ "7": {
158
+ "$type": "letterSpacing",
159
+ "$value": "0.25%"
160
+ },
161
+ "8": {
162
+ "$type": "letterSpacing",
163
+ "$value": "0.5%"
164
+ },
165
+ "9": {
166
+ "$extensions": {
167
+ "studio.tokens": {
168
+ "modify": {}
169
+ }
170
+ },
171
+ "$type": "letterSpacing",
172
+ "$value": "1.5%"
173
+ }
174
+ }
175
+ }