open-ds 0.0.0-stage → 0.1.1

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 (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -2
  3. package/assets/schemes/accessible-first.json +3093 -0
  4. package/assets/schemes/brand-expressive.json +3124 -0
  5. package/assets/schemes/content-first.json +3110 -0
  6. package/assets/schemes/dense-data.json +3489 -0
  7. package/assets/schemes/grammar.json +3903 -0
  8. package/assets/schemes/multi-brand.json +4359 -0
  9. package/assets/skills/open-ds/SKILL.md +50 -0
  10. package/assets/skills/open-ds-build/SKILL.md +19 -0
  11. package/assets/skills/open-ds-change/SKILL.md +19 -0
  12. package/assets/skills/open-ds-choose/SKILL.md +18 -0
  13. package/assets/skills/open-ds-review/SKILL.md +22 -0
  14. package/assets/skills/open-ds-write/SKILL.md +13 -0
  15. package/assets/stories/accordion.stories.tsx +46 -0
  16. package/assets/stories/alert-dialog.stories.tsx +65 -0
  17. package/assets/stories/alert.stories.tsx +44 -0
  18. package/assets/stories/aspect-ratio.stories.tsx +37 -0
  19. package/assets/stories/avatar.stories.tsx +42 -0
  20. package/assets/stories/badge.stories.tsx +39 -0
  21. package/assets/stories/breadcrumb.stories.tsx +54 -0
  22. package/assets/stories/button.stories.tsx +46 -0
  23. package/assets/stories/calendar.stories.tsx +30 -0
  24. package/assets/stories/card.stories.tsx +50 -0
  25. package/assets/stories/carousel.stories.tsx +64 -0
  26. package/assets/stories/chart.stories.tsx +61 -0
  27. package/assets/stories/checkbox.stories.tsx +29 -0
  28. package/assets/stories/collapsible.stories.tsx +39 -0
  29. package/assets/stories/combobox.stories.tsx +57 -0
  30. package/assets/stories/command.stories.tsx +60 -0
  31. package/assets/stories/context-menu.stories.tsx +55 -0
  32. package/assets/stories/data-table.stories.tsx +93 -0
  33. package/assets/stories/date-picker.stories.tsx +27 -0
  34. package/assets/stories/dialog.stories.tsx +70 -0
  35. package/assets/stories/drawer.stories.tsx +62 -0
  36. package/assets/stories/dropdown-menu.stories.tsx +65 -0
  37. package/assets/stories/empty.stories.tsx +39 -0
  38. package/assets/stories/field.stories.tsx +42 -0
  39. package/assets/stories/form.stories.tsx +56 -0
  40. package/assets/stories/input-group.stories.tsx +41 -0
  41. package/assets/stories/input-otp.stories.tsx +48 -0
  42. package/assets/stories/input.stories.tsx +32 -0
  43. package/assets/stories/kbd.stories.tsx +30 -0
  44. package/assets/stories/label.stories.tsx +26 -0
  45. package/assets/stories/native-select.stories.tsx +39 -0
  46. package/assets/stories/navigation-menu.stories.tsx +41 -0
  47. package/assets/stories/pagination.stories.tsx +61 -0
  48. package/assets/stories/popover.stories.tsx +37 -0
  49. package/assets/stories/progress.stories.tsx +30 -0
  50. package/assets/stories/radio-group.stories.tsx +45 -0
  51. package/assets/stories/resizable.stories.tsx +54 -0
  52. package/assets/stories/scroll-area.stories.tsx +47 -0
  53. package/assets/stories/select.stories.tsx +57 -0
  54. package/assets/stories/separator.stories.tsx +28 -0
  55. package/assets/stories/sheet.stories.tsx +46 -0
  56. package/assets/stories/sidebar.stories.tsx +62 -0
  57. package/assets/stories/skeleton.stories.tsx +27 -0
  58. package/assets/stories/slider.stories.tsx +44 -0
  59. package/assets/stories/spinner.stories.tsx +25 -0
  60. package/assets/stories/switch.stories.tsx +29 -0
  61. package/assets/stories/table.stories.tsx +97 -0
  62. package/assets/stories/tabs.stories.tsx +55 -0
  63. package/assets/stories/textarea.stories.tsx +28 -0
  64. package/assets/stories/toast.stories.tsx +30 -0
  65. package/assets/stories/toggle-group.stories.tsx +41 -0
  66. package/assets/stories/toggle.stories.tsx +20 -0
  67. package/assets/stories/tooltip.stories.tsx +49 -0
  68. package/assets/tokens/accessible-first/content.json +32 -0
  69. package/assets/tokens/accessible-first/dark.tokens.json +581 -0
  70. package/assets/tokens/accessible-first/light.tokens.json +581 -0
  71. package/assets/tokens/accessible-first/shadcn.css +21 -0
  72. package/assets/tokens/accessible-first/theme.css +101 -0
  73. package/assets/tokens/accessible-first/tokens.css +331 -0
  74. package/assets/tokens/accessible-first/tokens.json +1616 -0
  75. package/assets/tokens/accessible-first/tokens.scoped.css +333 -0
  76. package/assets/tokens/brand-expressive/content.json +32 -0
  77. package/assets/tokens/brand-expressive/dark.tokens.json +585 -0
  78. package/assets/tokens/brand-expressive/light.tokens.json +585 -0
  79. package/assets/tokens/brand-expressive/shadcn.css +21 -0
  80. package/assets/tokens/brand-expressive/theme.css +101 -0
  81. package/assets/tokens/brand-expressive/tokens.css +331 -0
  82. package/assets/tokens/brand-expressive/tokens.json +1651 -0
  83. package/assets/tokens/brand-expressive/tokens.scoped.css +333 -0
  84. package/assets/tokens/content-first/content.json +32 -0
  85. package/assets/tokens/content-first/dark.tokens.json +582 -0
  86. package/assets/tokens/content-first/light.tokens.json +582 -0
  87. package/assets/tokens/content-first/shadcn.css +21 -0
  88. package/assets/tokens/content-first/theme.css +101 -0
  89. package/assets/tokens/content-first/tokens.css +331 -0
  90. package/assets/tokens/content-first/tokens.json +1631 -0
  91. package/assets/tokens/content-first/tokens.scoped.css +333 -0
  92. package/assets/tokens/dense-data/content.json +32 -0
  93. package/assets/tokens/dense-data/dark.tokens.json +580 -0
  94. package/assets/tokens/dense-data/light.tokens.json +580 -0
  95. package/assets/tokens/dense-data/shadcn.css +21 -0
  96. package/assets/tokens/dense-data/theme.css +101 -0
  97. package/assets/tokens/dense-data/tokens.css +331 -0
  98. package/assets/tokens/dense-data/tokens.json +1623 -0
  99. package/assets/tokens/dense-data/tokens.scoped.css +333 -0
  100. package/assets/tokens/index.json +143 -0
  101. package/assets/tokens/multi-brand/aster-dark.tokens.json +625 -0
  102. package/assets/tokens/multi-brand/aster-light.tokens.json +625 -0
  103. package/assets/tokens/multi-brand/birch-dark.tokens.json +625 -0
  104. package/assets/tokens/multi-brand/birch-light.tokens.json +625 -0
  105. package/assets/tokens/multi-brand/content.json +32 -0
  106. package/assets/tokens/multi-brand/coral-dark.tokens.json +625 -0
  107. package/assets/tokens/multi-brand/coral-light.tokens.json +625 -0
  108. package/assets/tokens/multi-brand/shadcn.css +21 -0
  109. package/assets/tokens/multi-brand/theme.css +101 -0
  110. package/assets/tokens/multi-brand/tokens.css +1002 -0
  111. package/assets/tokens/multi-brand/tokens.json +1754 -0
  112. package/assets/tokens/multi-brand/tokens.scoped.css +1022 -0
  113. package/assets/tokens/shadcn-map.json +34 -0
  114. package/assets/ui/components/accordion.tsx +60 -0
  115. package/assets/ui/components/alert-dialog.tsx +171 -0
  116. package/assets/ui/components/alert.tsx +56 -0
  117. package/assets/ui/components/aspect-ratio.tsx +17 -0
  118. package/assets/ui/components/avatar.tsx +96 -0
  119. package/assets/ui/components/badge.tsx +36 -0
  120. package/assets/ui/components/breadcrumb.tsx +99 -0
  121. package/assets/ui/components/button.tsx +53 -0
  122. package/assets/ui/components/calendar.tsx +169 -0
  123. package/assets/ui/components/card.tsx +72 -0
  124. package/assets/ui/components/carousel.tsx +224 -0
  125. package/assets/ui/components/chart.tsx +315 -0
  126. package/assets/ui/components/checkbox.tsx +29 -0
  127. package/assets/ui/components/collapsible.tsx +25 -0
  128. package/assets/ui/components/combobox.tsx +275 -0
  129. package/assets/ui/components/command.tsx +145 -0
  130. package/assets/ui/components/context-menu.tsx +218 -0
  131. package/assets/ui/components/data-table.tsx +307 -0
  132. package/assets/ui/components/date-picker.tsx +79 -0
  133. package/assets/ui/components/dialog.tsx +68 -0
  134. package/assets/ui/components/drawer.tsx +115 -0
  135. package/assets/ui/components/dropdown-menu.tsx +58 -0
  136. package/assets/ui/components/empty.tsx +92 -0
  137. package/assets/ui/components/field.tsx +234 -0
  138. package/assets/ui/components/form.tsx +146 -0
  139. package/assets/ui/components/input-group.tsx +154 -0
  140. package/assets/ui/components/input-otp.tsx +75 -0
  141. package/assets/ui/components/input.tsx +25 -0
  142. package/assets/ui/components/kbd.tsx +30 -0
  143. package/assets/ui/components/label.tsx +22 -0
  144. package/assets/ui/components/native-select.tsx +59 -0
  145. package/assets/ui/components/navigation-menu.tsx +149 -0
  146. package/assets/ui/components/pagination.tsx +108 -0
  147. package/assets/ui/components/popover.tsx +61 -0
  148. package/assets/ui/components/progress.tsx +31 -0
  149. package/assets/ui/components/radio-group.tsx +40 -0
  150. package/assets/ui/components/resizable.tsx +54 -0
  151. package/assets/ui/components/scroll-area.tsx +55 -0
  152. package/assets/ui/components/select.tsx +81 -0
  153. package/assets/ui/components/separator.tsx +35 -0
  154. package/assets/ui/components/sheet.tsx +114 -0
  155. package/assets/ui/components/sidebar.tsx +685 -0
  156. package/assets/ui/components/skeleton.tsx +15 -0
  157. package/assets/ui/components/slider.tsx +70 -0
  158. package/assets/ui/components/spinner.tsx +16 -0
  159. package/assets/ui/components/switch.tsx +32 -0
  160. package/assets/ui/components/table.tsx +78 -0
  161. package/assets/ui/components/tabs.tsx +49 -0
  162. package/assets/ui/components/textarea.tsx +25 -0
  163. package/assets/ui/components/toast.tsx +54 -0
  164. package/assets/ui/components/toggle-group.tsx +88 -0
  165. package/assets/ui/components/toggle.tsx +48 -0
  166. package/assets/ui/components/tooltip.tsx +34 -0
  167. package/assets/ui/lib/use-mobile.ts +20 -0
  168. package/assets/ui/lib/utils.ts +7 -0
  169. package/assets/ui/styles.css +27 -0
  170. package/bin/open-ds.js +6 -0
  171. package/package.json +56 -4
  172. package/src/agents.mjs +150 -0
  173. package/src/cli.mjs +445 -0
  174. package/src/components.mjs +69 -0
  175. package/src/context.mjs +143 -0
  176. package/src/create.mjs +377 -0
  177. package/src/docs.mjs +570 -0
  178. package/src/guidance.mjs +63 -0
  179. package/src/index.mjs +20 -0
  180. package/src/mcp.mjs +660 -0
  181. package/src/readmes.mjs +106 -0
  182. package/src/schemes.mjs +188 -0
  183. package/src/tokens.mjs +127 -0
  184. package/templates/project/.github/workflows/ci.yml +15 -0
  185. package/templates/project/.storybook/component-docs.mdx +26 -0
  186. package/templates/project/.storybook/main.ts +17 -0
  187. package/templates/project/.storybook/manager-head.html +3 -0
  188. package/templates/project/.storybook/manager.ts +37 -0
  189. package/templates/project/.storybook/preview-head.html +3 -0
  190. package/templates/project/.storybook/preview.tsx +82 -0
  191. package/templates/project/docs/docusaurus.config.ts +64 -0
  192. package/templates/project/docs/sidebars.ts +8 -0
  193. package/templates/project/docs/src/css/custom.css +275 -0
  194. package/templates/project/gitignore +6 -0
  195. package/templates/project/src/styles/index.css +16 -0
  196. package/templates/project/src/vite-env.d.ts +7 -0
  197. package/templates/project/stories/docs-blocks.tsx +190 -0
  198. package/templates/project/stories/samples.tsx +102 -0
  199. package/templates/project/stories/usage.tsx +31 -0
  200. package/templates/project/tokens/build.mjs +468 -0
  201. package/templates/project/tsconfig.json +15 -0
@@ -0,0 +1,4359 @@
1
+ {
2
+ "$schema": "../schema/scheme.schema.json",
3
+ "id": "multi-brand",
4
+ "name": "Multi-brand",
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "summary": "One shared system with three brands as themes. Components never change; brand primitives do.",
8
+ "description": "Multi-brand is an Open DS scheme: a full set of answers to the Open DS grammar, with the reasons behind each, usage rules, voice and tone, and the tokens that follow. One shared system with three brands as themes. Components never change; brand primitives do.",
9
+ "ai": {
10
+ "use_when": "Companies with several brands or white-label products on one component library.",
11
+ "avoid_when": "A single product with one brand: the brand layer is cost with no user.",
12
+ "example_products": [
13
+ "Brand family of apps",
14
+ "White-label platform",
15
+ "Agency client portfolio"
16
+ ]
17
+ },
18
+ "scenarios": [
19
+ {
20
+ "text": "A customer signs up for a plan on the Birch site, then manages it in the shared account area.",
21
+ "follows": [
22
+ "scenarios.q1",
23
+ "scenarios.q2",
24
+ "business.q2"
25
+ ]
26
+ },
27
+ {
28
+ "text": "A product team launches a fourth brand by adding brand primitives, without touching components.",
29
+ "follows": [
30
+ "business.q2",
31
+ "team.q2"
32
+ ]
33
+ }
34
+ ],
35
+ "voice": {
36
+ "summary": {
37
+ "text": "A plain shared voice. Each brand adds its own tone on top, never its own structure.",
38
+ "follows": [
39
+ "voice.definition",
40
+ "voice.count"
41
+ ]
42
+ },
43
+ "principles": [
44
+ {
45
+ "text": "Shared structure: object, state, next step.",
46
+ "follows": [
47
+ "voice.definition"
48
+ ]
49
+ },
50
+ {
51
+ "text": "Brand tone lives in headlines and marketing copy, not in errors.",
52
+ "follows": [
53
+ "voice.lands",
54
+ "voice.count"
55
+ ]
56
+ },
57
+ {
58
+ "text": "Errors and confirmations read the same in every brand.",
59
+ "follows": [
60
+ "voice.definition"
61
+ ]
62
+ }
63
+ ],
64
+ "words": {
65
+ "use": [
66
+ "Get started",
67
+ "Plan",
68
+ "Order"
69
+ ],
70
+ "avoid": [
71
+ "Brand-specific words in errors",
72
+ "Jargon"
73
+ ],
74
+ "follows": [
75
+ "voice.definition"
76
+ ]
77
+ },
78
+ "brands": {
79
+ "aster": {
80
+ "text": "Calm and precise.",
81
+ "follows": [
82
+ "voice.count",
83
+ "theming.definition"
84
+ ]
85
+ },
86
+ "birch": {
87
+ "text": "Friendly and helpful.",
88
+ "follows": [
89
+ "voice.count",
90
+ "theming.definition"
91
+ ]
92
+ },
93
+ "coral": {
94
+ "text": "Upbeat and energetic.",
95
+ "follows": [
96
+ "voice.count",
97
+ "theming.definition"
98
+ ]
99
+ }
100
+ }
101
+ },
102
+ "inventory": {
103
+ "description": "The components this system carries, picked from the grammar catalogue by the components answers. Anything not listed is out.",
104
+ "follows": [
105
+ "components.roles",
106
+ "components.count",
107
+ "components.definition"
108
+ ],
109
+ "in": [
110
+ {
111
+ "id": "button",
112
+ "why": "Every action."
113
+ },
114
+ {
115
+ "id": "toggle-group",
116
+ "why": "Monthly or yearly prices."
117
+ },
118
+ {
119
+ "id": "input",
120
+ "why": "Sign-up and account fields."
121
+ },
122
+ {
123
+ "id": "input-otp",
124
+ "why": "The code that verifies an email or phone."
125
+ },
126
+ {
127
+ "id": "select",
128
+ "why": "Country and plan options."
129
+ },
130
+ {
131
+ "id": "checkbox",
132
+ "why": "Terms and preferences."
133
+ },
134
+ {
135
+ "id": "radio-group",
136
+ "why": "Picks a plan."
137
+ },
138
+ {
139
+ "id": "switch",
140
+ "why": "Account settings."
141
+ },
142
+ {
143
+ "id": "label",
144
+ "why": "Names every control."
145
+ },
146
+ {
147
+ "id": "field",
148
+ "why": "Lays out every form the same way in every brand."
149
+ },
150
+ {
151
+ "id": "textarea",
152
+ "why": "Messages to support."
153
+ },
154
+ {
155
+ "id": "form",
156
+ "why": "Validation shared by every product team."
157
+ },
158
+ {
159
+ "id": "badge",
160
+ "why": "Plan and status labels."
161
+ },
162
+ {
163
+ "id": "avatar",
164
+ "why": "The customer in the account menu."
165
+ },
166
+ {
167
+ "id": "navigation-menu",
168
+ "why": "Brand site navigation."
169
+ },
170
+ {
171
+ "id": "breadcrumb",
172
+ "why": "Where a page sits in the account area."
173
+ },
174
+ {
175
+ "id": "tabs",
176
+ "why": "Sections of the account."
177
+ },
178
+ {
179
+ "id": "dropdown-menu",
180
+ "why": "The account menu."
181
+ },
182
+ {
183
+ "id": "sidebar",
184
+ "why": "Account area navigation."
185
+ },
186
+ {
187
+ "id": "alert",
188
+ "why": "Billing problems."
189
+ },
190
+ {
191
+ "id": "toast",
192
+ "why": "Confirms a saved change."
193
+ },
194
+ {
195
+ "id": "skeleton",
196
+ "why": "Plans and orders while they load."
197
+ },
198
+ {
199
+ "id": "spinner",
200
+ "why": "A payment in progress."
201
+ },
202
+ {
203
+ "id": "empty",
204
+ "why": "No orders yet."
205
+ },
206
+ {
207
+ "id": "dialog",
208
+ "why": "Change a plan."
209
+ },
210
+ {
211
+ "id": "alert-dialog",
212
+ "why": "Cancel a plan."
213
+ },
214
+ {
215
+ "id": "sheet",
216
+ "why": "The menu on a phone."
217
+ },
218
+ {
219
+ "id": "popover",
220
+ "why": "Plan details and fee explanations, opened by tap on any device."
221
+ },
222
+ {
223
+ "id": "card",
224
+ "why": "Plans and products."
225
+ },
226
+ {
227
+ "id": "separator",
228
+ "why": "Groups of settings."
229
+ },
230
+ {
231
+ "id": "accordion",
232
+ "why": "Frequent questions."
233
+ }
234
+ ],
235
+ "out": [
236
+ {
237
+ "id": "chart",
238
+ "why": "Customers manage plans; they do not analyse data."
239
+ },
240
+ {
241
+ "id": "command",
242
+ "why": "Customers browse; keyboard command menus suit experts."
243
+ },
244
+ {
245
+ "id": "tooltip",
246
+ "why": "Customers use any device, and on touch screens hover hints never show; a popover explains a fee instead."
247
+ }
248
+ ]
249
+ },
250
+ "samples": {
251
+ "description": "Sample content for showing this system: written from its use scenarios, in its voice, with every status mapped to a meaning. Storybook, the site and the docs read it; it is never shared between schemes.",
252
+ "follows": [
253
+ "scenarios.q1",
254
+ "scenarios.q2",
255
+ "content.q1",
256
+ "voice.definition"
257
+ ],
258
+ "screen": "Your plan",
259
+ "actions": {
260
+ "primary": "Get started",
261
+ "secondary": "Compare plans"
262
+ },
263
+ "statuses": [
264
+ {
265
+ "label": "Trial",
266
+ "meaning": "neutral",
267
+ "why": "The plan works; billing has not started."
268
+ },
269
+ {
270
+ "label": "Active",
271
+ "meaning": "success",
272
+ "why": "The plan is paid and running."
273
+ },
274
+ {
275
+ "label": "Renews in 3 days",
276
+ "meaning": "info",
277
+ "why": "A payment is coming: news, nothing has gone wrong."
278
+ },
279
+ {
280
+ "label": "Card declined",
281
+ "meaning": "danger",
282
+ "why": "The payment failed, so the plan will stop."
283
+ }
284
+ ],
285
+ "metrics": [
286
+ {
287
+ "label": "Plan",
288
+ "value": "Standard"
289
+ },
290
+ {
291
+ "label": "Next payment",
292
+ "value": "12.00"
293
+ },
294
+ {
295
+ "label": "Orders this year",
296
+ "value": "9"
297
+ },
298
+ {
299
+ "label": "Member since",
300
+ "value": "2024"
301
+ }
302
+ ],
303
+ "field": {
304
+ "label": "Card number",
305
+ "placeholder": "1234 5678 9012 3456",
306
+ "hint": "We never store the full number.",
307
+ "error": "Your card was declined. Try another card or contact your bank.",
308
+ "invalid": "1234"
309
+ },
310
+ "checkbox": [
311
+ "Email me about my orders",
312
+ "Send me offers",
313
+ "Remember this device"
314
+ ],
315
+ "select": {
316
+ "label": "Plan",
317
+ "options": [
318
+ "Basic",
319
+ "Standard",
320
+ "Plus"
321
+ ],
322
+ "value": "Standard"
323
+ },
324
+ "switches": [
325
+ "Renew automatically",
326
+ "Paperless invoices"
327
+ ],
328
+ "messages": {
329
+ "success": "Your plan is active.",
330
+ "error": {
331
+ "title": "Your card was declined.",
332
+ "description": "Try another card or contact your bank."
333
+ },
334
+ "neutral": "No orders yet. Your first order will appear here."
335
+ },
336
+ "confirm": {
337
+ "trigger": "Cancel plan",
338
+ "title": "Cancel your plan?",
339
+ "body": "It stays active until the end of the month.",
340
+ "confirm": "Cancel plan",
341
+ "cancel": "Keep my plan"
342
+ },
343
+ "card": {
344
+ "title": "Standard plan",
345
+ "description": "12.00 a month · renews on the 14th",
346
+ "status": "Active",
347
+ "primary": "Change plan",
348
+ "secondary": "View invoices"
349
+ },
350
+ "tabs": [
351
+ {
352
+ "label": "Plan",
353
+ "content": "Standard, renews on the 14th."
354
+ },
355
+ {
356
+ "label": "Orders",
357
+ "content": "9 orders this year."
358
+ },
359
+ {
360
+ "label": "Payment",
361
+ "content": "Card ending 4242."
362
+ }
363
+ ],
364
+ "menu": {
365
+ "trigger": "Plan actions",
366
+ "items": [
367
+ "Change plan",
368
+ "Download invoice"
369
+ ],
370
+ "destructive": "Cancel plan"
371
+ }
372
+ },
373
+ "themes": [
374
+ {
375
+ "id": "aster-light",
376
+ "brand": "aster",
377
+ "mode": "light"
378
+ },
379
+ {
380
+ "id": "aster-dark",
381
+ "brand": "aster",
382
+ "mode": "dark"
383
+ },
384
+ {
385
+ "id": "birch-light",
386
+ "brand": "birch",
387
+ "mode": "light"
388
+ },
389
+ {
390
+ "id": "birch-dark",
391
+ "brand": "birch",
392
+ "mode": "dark"
393
+ },
394
+ {
395
+ "id": "coral-light",
396
+ "brand": "coral",
397
+ "mode": "light"
398
+ },
399
+ {
400
+ "id": "coral-dark",
401
+ "brand": "coral",
402
+ "mode": "dark"
403
+ }
404
+ ],
405
+ "answers": [
406
+ {
407
+ "question": "business.q1",
408
+ "option": "convert",
409
+ "why": "A company sells several products under several brands.",
410
+ "because": []
411
+ },
412
+ {
413
+ "question": "business.q2",
414
+ "option": "many",
415
+ "why": "Three brands share one system today, more tomorrow.",
416
+ "because": [
417
+ "business.q1"
418
+ ]
419
+ },
420
+ {
421
+ "question": "people.q1",
422
+ "option": "customers",
423
+ "why": "Customers who chose one of our brands.",
424
+ "because": [
425
+ "business.q1"
426
+ ]
427
+ },
428
+ {
429
+ "question": "people.q2",
430
+ "option": "aa",
431
+ "why": "AA in every brand.",
432
+ "because": [
433
+ "people.q1"
434
+ ]
435
+ },
436
+ {
437
+ "question": "content.q1",
438
+ "option": "forms",
439
+ "why": "Product pages, sign-up and account forms.",
440
+ "because": [
441
+ "business.q1"
442
+ ]
443
+ },
444
+ {
445
+ "question": "content.q2",
446
+ "option": "moderate",
447
+ "why": "A moderate amount per screen.",
448
+ "because": [
449
+ "content.q1"
450
+ ]
451
+ },
452
+ {
453
+ "question": "tasks.q1",
454
+ "option": "complete",
455
+ "why": "Customers sign up and buy.",
456
+ "because": [
457
+ "business.q1"
458
+ ]
459
+ },
460
+ {
461
+ "question": "tasks.q2",
462
+ "option": "sometimes",
463
+ "why": "Customers return now and then.",
464
+ "because": [
465
+ "people.q1"
466
+ ]
467
+ },
468
+ {
469
+ "question": "human.q1",
470
+ "option": "effort",
471
+ "why": "Low effort, whichever brand they see.",
472
+ "because": [
473
+ "people.q1"
474
+ ]
475
+ },
476
+ {
477
+ "question": "human.q2",
478
+ "option": "fresh",
479
+ "why": "Customers see it fresh each time.",
480
+ "because": [
481
+ "tasks.q2"
482
+ ]
483
+ },
484
+ {
485
+ "question": "outcomes.q1",
486
+ "option": "completion",
487
+ "why": "Finished sign-ups and orders.",
488
+ "because": [
489
+ "tasks.q1"
490
+ ]
491
+ },
492
+ {
493
+ "question": "outcomes.q2",
494
+ "option": "off-brand",
495
+ "why": "A page that looks like the wrong brand loses trust.",
496
+ "because": [
497
+ "business.q2"
498
+ ]
499
+ },
500
+ {
501
+ "question": "brand.q1",
502
+ "option": "neutral",
503
+ "why": "A neutral base each brand can colour.",
504
+ "because": [
505
+ "business.q2"
506
+ ]
507
+ },
508
+ {
509
+ "question": "brand.q2",
510
+ "option": "present",
511
+ "why": "Each brand is clearly present.",
512
+ "because": [
513
+ "business.q2"
514
+ ]
515
+ },
516
+ {
517
+ "question": "scenarios.q1",
518
+ "option": "anywhere",
519
+ "why": "Customers sign up on phones and manage plans on laptops.",
520
+ "because": [
521
+ "people.q1"
522
+ ]
523
+ },
524
+ {
525
+ "question": "scenarios.q2",
526
+ "option": "short",
527
+ "why": "Most visits are a few minutes: sign up, check, change.",
528
+ "because": [
529
+ "tasks.q1"
530
+ ]
531
+ },
532
+ {
533
+ "question": "team.q1",
534
+ "option": "platform",
535
+ "why": "A platform team serves three product teams.",
536
+ "because": [
537
+ "business.q2"
538
+ ]
539
+ },
540
+ {
541
+ "question": "team.q2",
542
+ "option": "monthly",
543
+ "why": "Brands ship every month.",
544
+ "because": [
545
+ "business.q2"
546
+ ]
547
+ },
548
+ {
549
+ "question": "typography.roles",
550
+ "option": "core",
551
+ "why": "One set of roles across brands.",
552
+ "because": [
553
+ "business.q2"
554
+ ]
555
+ },
556
+ {
557
+ "question": "typography.count",
558
+ "option": "some",
559
+ "why": "One size per kind of text suits every brand font.",
560
+ "because": [
561
+ "business.q2"
562
+ ]
563
+ },
564
+ {
565
+ "question": "typography.definition",
566
+ "option": "ratio-proportional",
567
+ "why": "Ratios work with every brand font.",
568
+ "because": [
569
+ "business.q2"
570
+ ]
571
+ },
572
+ {
573
+ "question": "typography.values",
574
+ "option": "regular",
575
+ "why": "Regular body size suits all brands.",
576
+ "because": [
577
+ "brand.q1"
578
+ ]
579
+ },
580
+ {
581
+ "question": "typography.lands",
582
+ "option": "forms",
583
+ "why": "Sign-up and account forms carry most text.",
584
+ "because": [
585
+ "tasks.q1"
586
+ ]
587
+ },
588
+ {
589
+ "question": "color.roles",
590
+ "option": "core-brand",
591
+ "why": "Each brand brings its own accent ramp.",
592
+ "because": [
593
+ "business.q2"
594
+ ]
595
+ },
596
+ {
597
+ "question": "color.count",
598
+ "option": "three",
599
+ "why": "Primary, secondary and ghost in every brand.",
600
+ "because": [
601
+ "tasks.q1"
602
+ ]
603
+ },
604
+ {
605
+ "question": "color.definition",
606
+ "option": "ramp-per-brand",
607
+ "why": "Shared neutrals; each brand sets its own ramp.",
608
+ "because": [
609
+ "business.q2"
610
+ ]
611
+ },
612
+ {
613
+ "question": "color.values",
614
+ "option": "balanced",
615
+ "why": "Balanced, so any brand hue works.",
616
+ "because": [
617
+ "brand.q1"
618
+ ]
619
+ },
620
+ {
621
+ "question": "color.lands",
622
+ "option": "brand-moments",
623
+ "why": "Brand color shows on actions and headlines.",
624
+ "because": [
625
+ "brand.q2"
626
+ ]
627
+ },
628
+ {
629
+ "question": "spacing.roles",
630
+ "option": "gap-inset-row",
631
+ "why": "Account tables need a row height.",
632
+ "because": [
633
+ "content.q1"
634
+ ]
635
+ },
636
+ {
637
+ "question": "spacing.count",
638
+ "option": "one",
639
+ "why": "One density across brands.",
640
+ "because": [
641
+ "business.q2"
642
+ ]
643
+ },
644
+ {
645
+ "question": "spacing.definition",
646
+ "option": "fine",
647
+ "why": "A fine base unit fits every brand.",
648
+ "because": [
649
+ "business.q2"
650
+ ]
651
+ },
652
+ {
653
+ "question": "spacing.values",
654
+ "option": "comfortable",
655
+ "why": "Comfortable spacing in every brand.",
656
+ "because": [
657
+ "content.q2"
658
+ ]
659
+ },
660
+ {
661
+ "question": "spacing.lands",
662
+ "option": "fields",
663
+ "why": "Space matters most between form fields.",
664
+ "because": [
665
+ "tasks.q1"
666
+ ]
667
+ },
668
+ {
669
+ "question": "shape.roles",
670
+ "option": "control-badge-container",
671
+ "why": "Each brand sets three corners.",
672
+ "because": [
673
+ "business.q2"
674
+ ]
675
+ },
676
+ {
677
+ "question": "shape.count",
678
+ "option": "three",
679
+ "why": "Control, badge and container.",
680
+ "because": [
681
+ "shape.roles"
682
+ ]
683
+ },
684
+ {
685
+ "question": "shape.definition",
686
+ "option": "per-brand",
687
+ "why": "Each brand sets its own corners.",
688
+ "because": [
689
+ "business.q2"
690
+ ]
691
+ },
692
+ {
693
+ "question": "shape.values",
694
+ "option": "rounded",
695
+ "why": "Rounded by default; each brand sets its own corner.",
696
+ "because": [
697
+ "business.q2"
698
+ ]
699
+ },
700
+ {
701
+ "question": "shape.lands",
702
+ "option": "buttons-badges",
703
+ "why": "Corners are the most visible brand difference.",
704
+ "because": [
705
+ "brand.q2"
706
+ ]
707
+ },
708
+ {
709
+ "question": "elevation.roles",
710
+ "option": "cards-too",
711
+ "why": "Cards lift slightly to group offers.",
712
+ "because": [
713
+ "elevation.definition"
714
+ ]
715
+ },
716
+ {
717
+ "question": "elevation.count",
718
+ "option": "two",
719
+ "why": "One shadow for cards, one for overlays.",
720
+ "because": [
721
+ "elevation.roles"
722
+ ]
723
+ },
724
+ {
725
+ "question": "elevation.definition",
726
+ "option": "cards",
727
+ "why": "Cards group plans and offers.",
728
+ "because": [
729
+ "content.q1"
730
+ ]
731
+ },
732
+ {
733
+ "question": "elevation.values",
734
+ "option": "soft",
735
+ "why": "Soft shadows fit every brand.",
736
+ "because": [
737
+ "brand.q1"
738
+ ]
739
+ },
740
+ {
741
+ "question": "elevation.lands",
742
+ "option": "cards-menus",
743
+ "why": "Cards, menus and dialogs rise.",
744
+ "because": [
745
+ "elevation.roles"
746
+ ]
747
+ },
748
+ {
749
+ "question": "motion.roles",
750
+ "option": "feedback-guidance",
751
+ "why": "Feedback and guidance through sign-up.",
752
+ "because": [
753
+ "tasks.q1"
754
+ ]
755
+ },
756
+ {
757
+ "question": "motion.count",
758
+ "option": "two",
759
+ "why": "One speed for feedback, one for panels.",
760
+ "because": [
761
+ "motion.roles"
762
+ ]
763
+ },
764
+ {
765
+ "question": "motion.definition",
766
+ "option": "standard",
767
+ "why": "A standard ease-out across brands.",
768
+ "because": [
769
+ "business.q2"
770
+ ]
771
+ },
772
+ {
773
+ "question": "motion.values",
774
+ "option": "moderate",
775
+ "why": "Moderate speed across brands.",
776
+ "because": [
777
+ "brand.q1"
778
+ ]
779
+ },
780
+ {
781
+ "question": "motion.lands",
782
+ "option": "state-panels",
783
+ "why": "State changes and panels move.",
784
+ "because": [
785
+ "motion.roles"
786
+ ]
787
+ },
788
+ {
789
+ "question": "iconography.roles",
790
+ "option": "actions-status-nav",
791
+ "why": "Icons for actions, status and navigation.",
792
+ "because": [
793
+ "people.q1"
794
+ ]
795
+ },
796
+ {
797
+ "question": "iconography.count",
798
+ "option": "one",
799
+ "why": "One size next to text.",
800
+ "because": [
801
+ "iconography.values"
802
+ ]
803
+ },
804
+ {
805
+ "question": "iconography.definition",
806
+ "option": "outline",
807
+ "why": "One outline set for every brand.",
808
+ "because": [
809
+ "business.q2"
810
+ ]
811
+ },
812
+ {
813
+ "question": "iconography.values",
814
+ "option": "match-text",
815
+ "why": "Icons match the text.",
816
+ "because": [
817
+ "business.q2"
818
+ ]
819
+ },
820
+ {
821
+ "question": "iconography.lands",
822
+ "option": "navigation",
823
+ "why": "Icons help most in navigation.",
824
+ "because": [
825
+ "people.q1"
826
+ ]
827
+ },
828
+ {
829
+ "question": "theming.roles",
830
+ "option": "mode-brand",
831
+ "why": "Brand and mode both change.",
832
+ "because": [
833
+ "business.q2"
834
+ ]
835
+ },
836
+ {
837
+ "question": "theming.count",
838
+ "option": "several",
839
+ "why": "Three brands in light and dark: six themes.",
840
+ "because": [
841
+ "business.q2",
842
+ "theming.values"
843
+ ]
844
+ },
845
+ {
846
+ "question": "theming.definition",
847
+ "option": "brand-modes",
848
+ "why": "Brands are theme modes over shared semantics.",
849
+ "because": [
850
+ "business.q2"
851
+ ]
852
+ },
853
+ {
854
+ "question": "theming.values",
855
+ "option": "light-dark",
856
+ "why": "Light and dark ship for every brand.",
857
+ "because": [
858
+ "business.q2"
859
+ ]
860
+ },
861
+ {
862
+ "question": "theming.lands",
863
+ "option": "colors-type-shape",
864
+ "why": "A brand switch changes colors, fonts and corners.",
865
+ "because": [
866
+ "theming.roles"
867
+ ]
868
+ },
869
+ {
870
+ "question": "accessibility.roles",
871
+ "option": "plus-pressed",
872
+ "why": "Pressed for touch.",
873
+ "because": [
874
+ "accessibility.values"
875
+ ]
876
+ },
877
+ {
878
+ "question": "accessibility.count",
879
+ "option": "color-word",
880
+ "why": "Brand colors vary, so meaning needs a word.",
881
+ "because": [
882
+ "business.q2"
883
+ ]
884
+ },
885
+ {
886
+ "question": "accessibility.definition",
887
+ "option": "aa",
888
+ "why": "AA in every brand and mode.",
889
+ "because": [
890
+ "people.q2"
891
+ ]
892
+ },
893
+ {
894
+ "question": "accessibility.values",
895
+ "option": "touch",
896
+ "why": "Customers sign up on phones.",
897
+ "because": [
898
+ "scenarios.q1"
899
+ ]
900
+ },
901
+ {
902
+ "question": "accessibility.lands",
903
+ "option": "brand-color",
904
+ "why": "Brand colors must pass in every mode.",
905
+ "because": [
906
+ "business.q2"
907
+ ]
908
+ },
909
+ {
910
+ "question": "naming.roles",
911
+ "option": "tokens-keys",
912
+ "why": "Components get their own keys, shared by every brand.",
913
+ "because": [
914
+ "business.q2"
915
+ ]
916
+ },
917
+ {
918
+ "question": "naming.count",
919
+ "option": "three",
920
+ "why": "Primitives, semantics and component keys.",
921
+ "because": [
922
+ "team.q2"
923
+ ]
924
+ },
925
+ {
926
+ "question": "naming.definition",
927
+ "option": "by-role",
928
+ "why": "Role names stay the same in every brand.",
929
+ "because": [
930
+ "business.q2"
931
+ ]
932
+ },
933
+ {
934
+ "question": "naming.values",
935
+ "option": "kebab-paths",
936
+ "why": "Lowercase paths read the same everywhere.",
937
+ "because": [
938
+ "team.q1"
939
+ ]
940
+ },
941
+ {
942
+ "question": "naming.lands",
943
+ "option": "keys",
944
+ "why": "Components never change; brand primitives do.",
945
+ "because": [
946
+ "business.q2"
947
+ ]
948
+ },
949
+ {
950
+ "question": "voice.roles",
951
+ "option": "ui-marketing",
952
+ "why": "Each brand has headlines on top of shared UI copy.",
953
+ "because": [
954
+ "business.q2"
955
+ ]
956
+ },
957
+ {
958
+ "question": "voice.count",
959
+ "option": "per-brand",
960
+ "why": "A shared core, with a tone per brand.",
961
+ "because": [
962
+ "business.q2"
963
+ ]
964
+ },
965
+ {
966
+ "question": "voice.definition",
967
+ "option": "shared-core",
968
+ "why": "Errors and confirmations are shared; brand tone sits on top.",
969
+ "because": [
970
+ "business.q2",
971
+ "team.q1"
972
+ ]
973
+ },
974
+ {
975
+ "question": "voice.values",
976
+ "option": "plain",
977
+ "why": "The shared core is plain and direct.",
978
+ "because": [
979
+ "brand.q1"
980
+ ]
981
+ },
982
+ {
983
+ "question": "voice.lands",
984
+ "option": "headlines",
985
+ "why": "Brand tone shows in headlines and buttons.",
986
+ "because": [
987
+ "brand.q2"
988
+ ]
989
+ },
990
+ {
991
+ "question": "components.roles",
992
+ "option": "core-content",
993
+ "why": "Product teams build sign-up and account forms, plus product pages with questions and faces.",
994
+ "because": [
995
+ "content.q1",
996
+ "team.q1"
997
+ ]
998
+ },
999
+ {
1000
+ "question": "components.count",
1001
+ "option": "some",
1002
+ "why": "Three product teams find their next parts ready, kept by one platform team.",
1003
+ "because": [
1004
+ "team.q1",
1005
+ "team.q2"
1006
+ ]
1007
+ },
1008
+ {
1009
+ "question": "components.definition",
1010
+ "option": "family",
1011
+ "why": "Product teams find a whole family ready instead of asking one by one.",
1012
+ "because": [
1013
+ "team.q1",
1014
+ "team.q2"
1015
+ ]
1016
+ },
1017
+ {
1018
+ "question": "components.values",
1019
+ "option": "some",
1020
+ "why": "Variants for emphasis and size let each brand feel present without new components.",
1021
+ "because": [
1022
+ "brand.q2",
1023
+ "outcomes.q2"
1024
+ ]
1025
+ },
1026
+ {
1027
+ "question": "components.lands",
1028
+ "option": "sign-up-account",
1029
+ "why": "Most components sit in sign-up and account pages.",
1030
+ "because": [
1031
+ "content.q1",
1032
+ "tasks.q1"
1033
+ ]
1034
+ }
1035
+ ],
1036
+ "usage": [
1037
+ {
1038
+ "situation": "page-title",
1039
+ "use": "type.title in the brand font",
1040
+ "not": "A brand-specific style",
1041
+ "why": "Roles stay shared; only the brand font changes.",
1042
+ "because": [
1043
+ "typography.roles",
1044
+ "theming.definition"
1045
+ ]
1046
+ },
1047
+ {
1048
+ "situation": "number-in-table",
1049
+ "use": "type.body",
1050
+ "not": "A mono font",
1051
+ "why": "Numbers read like text in every brand.",
1052
+ "because": [
1053
+ "content.q1"
1054
+ ]
1055
+ },
1056
+ {
1057
+ "situation": "paragraph",
1058
+ "use": "type.body",
1059
+ "not": "type.caption",
1060
+ "why": "Regular body size suits every brand.",
1061
+ "because": [
1062
+ "typography.values"
1063
+ ]
1064
+ },
1065
+ {
1066
+ "situation": "field-label",
1067
+ "use": "type.label",
1068
+ "not": "type.caption",
1069
+ "why": "Labels stay readable in every brand.",
1070
+ "because": [
1071
+ "people.q2"
1072
+ ]
1073
+ },
1074
+ {
1075
+ "situation": "selected-row",
1076
+ "use": "color.surface.selected (from the brand)",
1077
+ "not": "A fixed blue",
1078
+ "why": "Selection follows the brand color.",
1079
+ "because": [
1080
+ "theming.definition"
1081
+ ]
1082
+ },
1083
+ {
1084
+ "situation": "error-message",
1085
+ "use": "color.status.danger and a sentence",
1086
+ "not": "The brand color",
1087
+ "why": "Status colors are shared, never branded.",
1088
+ "because": [
1089
+ "accessibility.count",
1090
+ "outcomes.q2"
1091
+ ]
1092
+ },
1093
+ {
1094
+ "situation": "link",
1095
+ "use": "color.text.link (from the brand)",
1096
+ "not": "A fixed blue",
1097
+ "why": "Links follow the brand.",
1098
+ "because": [
1099
+ "theming.definition"
1100
+ ]
1101
+ },
1102
+ {
1103
+ "situation": "status-label",
1104
+ "use": "Badge with a word",
1105
+ "not": "A brand color as status",
1106
+ "why": "Brand hues vary, so meaning needs a word.",
1107
+ "because": [
1108
+ "accessibility.count"
1109
+ ]
1110
+ },
1111
+ {
1112
+ "situation": "related-items",
1113
+ "use": "space.gap.default",
1114
+ "not": "Brand-specific spacing",
1115
+ "why": "Spacing is shared across brands.",
1116
+ "because": [
1117
+ "spacing.count"
1118
+ ]
1119
+ },
1120
+ {
1121
+ "situation": "between-sections",
1122
+ "use": "space.gap.section and cards",
1123
+ "not": "Lines",
1124
+ "why": "Cards group offers in every brand.",
1125
+ "because": [
1126
+ "elevation.definition"
1127
+ ]
1128
+ },
1129
+ {
1130
+ "situation": "table-row",
1131
+ "use": "size.row (comfortable)",
1132
+ "not": "A compact row",
1133
+ "why": "Comfortable rows in every brand.",
1134
+ "because": [
1135
+ "spacing.values"
1136
+ ]
1137
+ },
1138
+ {
1139
+ "situation": "control-corner",
1140
+ "use": "radius.control (set by the brand)",
1141
+ "not": "A hard-coded radius",
1142
+ "why": "Each brand sets its own corner through the theme.",
1143
+ "because": [
1144
+ "shape.values",
1145
+ "theming.definition"
1146
+ ]
1147
+ },
1148
+ {
1149
+ "situation": "status-shape",
1150
+ "use": "radius.badge (set by the brand)",
1151
+ "not": "A hard-coded shape",
1152
+ "why": "The brand sets the badge shape.",
1153
+ "because": [
1154
+ "theming.definition"
1155
+ ]
1156
+ },
1157
+ {
1158
+ "situation": "card",
1159
+ "use": "elevation.card",
1160
+ "not": "A border only",
1161
+ "why": "Cards lift slightly to group offers.",
1162
+ "because": [
1163
+ "elevation.roles"
1164
+ ]
1165
+ },
1166
+ {
1167
+ "situation": "menu-or-dialog",
1168
+ "use": "elevation.overlay and a dimmed page",
1169
+ "not": "No shadow",
1170
+ "why": "Same overlay in every brand.",
1171
+ "because": [
1172
+ "elevation.lands"
1173
+ ]
1174
+ },
1175
+ {
1176
+ "situation": "hover-feedback",
1177
+ "use": "motion.duration.feedback (moderate)",
1178
+ "not": "Brand-specific motion",
1179
+ "why": "Motion is shared across brands.",
1180
+ "because": [
1181
+ "motion.values"
1182
+ ]
1183
+ },
1184
+ {
1185
+ "situation": "reduced-motion",
1186
+ "use": "Reduced motion",
1187
+ "not": "Full motion",
1188
+ "why": "Motion is reduced, not removed.",
1189
+ "because": [
1190
+ "motion.roles"
1191
+ ]
1192
+ },
1193
+ {
1194
+ "situation": "icon-alone",
1195
+ "use": "Icon button with a tooltip, rarely",
1196
+ "not": "A bare icon",
1197
+ "why": "Customers need a hint.",
1198
+ "because": [
1199
+ "iconography.roles"
1200
+ ]
1201
+ },
1202
+ {
1203
+ "situation": "dark-mode",
1204
+ "use": "The dark mode of the active brand",
1205
+ "not": "One dark theme for all brands",
1206
+ "why": "Every brand ships light and dark.",
1207
+ "because": [
1208
+ "theming.values",
1209
+ "theming.definition"
1210
+ ]
1211
+ },
1212
+ {
1213
+ "situation": "keyboard-focus",
1214
+ "use": "button/focus-ring (from the brand)",
1215
+ "not": "Removing the outline",
1216
+ "why": "Focus follows the brand but always shows.",
1217
+ "because": [
1218
+ "people.q2"
1219
+ ]
1220
+ },
1221
+ {
1222
+ "situation": "smallest-target",
1223
+ "use": "size.control.default (touch)",
1224
+ "not": "A compact control",
1225
+ "why": "Customers are often on phones.",
1226
+ "because": [
1227
+ "accessibility.values"
1228
+ ]
1229
+ },
1230
+ {
1231
+ "situation": "commit-action",
1232
+ "use": "Button primary, one per view",
1233
+ "not": "Two primaries",
1234
+ "why": "One clear action per view.",
1235
+ "because": [
1236
+ "outcomes.q1"
1237
+ ]
1238
+ },
1239
+ {
1240
+ "situation": "alternative-action",
1241
+ "use": "Button secondary",
1242
+ "not": "A second primary",
1243
+ "why": "The alternative steps back.",
1244
+ "because": [
1245
+ "color.count"
1246
+ ]
1247
+ },
1248
+ {
1249
+ "situation": "destructive-action",
1250
+ "use": "Button secondary, then confirm",
1251
+ "not": "Button primary",
1252
+ "why": "Confirm before destroying data.",
1253
+ "because": [
1254
+ "outcomes.q2"
1255
+ ]
1256
+ },
1257
+ {
1258
+ "situation": "row-action",
1259
+ "use": "Button ghost with a word",
1260
+ "not": "An icon alone",
1261
+ "why": "A word says what will happen.",
1262
+ "because": [
1263
+ "human.q2"
1264
+ ]
1265
+ },
1266
+ {
1267
+ "situation": "missing-token",
1268
+ "use": "The closest semantic token, then ask for a new one",
1269
+ "not": "A raw value or a brand primitive in the component",
1270
+ "why": "A raw value shows the same in every brand, so it breaks the theme.",
1271
+ "because": [
1272
+ "naming.lands",
1273
+ "theming.definition"
1274
+ ]
1275
+ },
1276
+ {
1277
+ "situation": "button-label",
1278
+ "use": "A shared verb; the brand may choose the headline verb",
1279
+ "not": "Brand slang on account actions",
1280
+ "why": "Shared labels keep the account area the same in every brand.",
1281
+ "because": [
1282
+ "voice.definition"
1283
+ ],
1284
+ "example": "Get started"
1285
+ },
1286
+ {
1287
+ "situation": "error-words",
1288
+ "use": "Shared across brands: plain and specific",
1289
+ "not": "Brand tone in errors",
1290
+ "why": "Errors read the same in every brand, so support can help anyone.",
1291
+ "because": [
1292
+ "voice.definition",
1293
+ "voice.values"
1294
+ ],
1295
+ "example": "Your card was declined. Try another card or contact your bank."
1296
+ },
1297
+ {
1298
+ "situation": "success-words",
1299
+ "use": "Brand tone allowed: Aster calm, Birch friendly, Coral upbeat",
1300
+ "not": "The same flat line in every brand",
1301
+ "why": "Success is a safe moment for brand tone.",
1302
+ "because": [
1303
+ "voice.count"
1304
+ ],
1305
+ "example": "Aster: Your plan is active. · Birch: You're all set! · Coral: Let's go, your plan is live."
1306
+ },
1307
+ {
1308
+ "situation": "empty-words",
1309
+ "use": "Shared structure, brand words",
1310
+ "not": "A different structure per brand",
1311
+ "why": "The structure is the shared core; words carry the brand.",
1312
+ "because": [
1313
+ "voice.definition"
1314
+ ],
1315
+ "example": "No orders yet. Your first order will appear here."
1316
+ },
1317
+ {
1318
+ "situation": "confirm-words",
1319
+ "use": "Shared across brands: plain and specific",
1320
+ "not": "Brand tone when something is lost",
1321
+ "why": "Loss is never the moment for personality.",
1322
+ "because": [
1323
+ "voice.definition"
1324
+ ],
1325
+ "example": "Cancel your plan? It stays active until the end of the month."
1326
+ },
1327
+ {
1328
+ "situation": "first-visit",
1329
+ "use": "Brand tone in the first headline only",
1330
+ "not": "Brand tone in every line",
1331
+ "why": "One headline carries the brand; the rest stays shared.",
1332
+ "because": [
1333
+ "voice.lands"
1334
+ ],
1335
+ "example": "Birch: Hi! Let's set up your plan."
1336
+ },
1337
+ {
1338
+ "situation": "missing-component",
1339
+ "use": "a component from the inventory with brand tokens",
1340
+ "not": "a component made for one brand",
1341
+ "why": "Brands change primitives, never components; one brand-only part breaks the shared library.",
1342
+ "because": [
1343
+ "brand.q1",
1344
+ "outcomes.q2"
1345
+ ]
1346
+ }
1347
+ ],
1348
+ "tokens": {
1349
+ "primitive": {
1350
+ "color": {
1351
+ "$description": "Colour options: raw hue ramps. Each hue has a light ramp and a dark ramp (the same steps tuned for dark backgrounds). Steps only: each theme decides its own base (@). Themes pick from these; components never read them.",
1352
+ "slate": {
1353
+ "$type": "color",
1354
+ "$description": "The slate hue: a light ramp, a dark ramp and its base value.",
1355
+ "light": {
1356
+ "0": {
1357
+ "$value": "#FFFFFF"
1358
+ },
1359
+ "50": {
1360
+ "$value": "#F8FAFC"
1361
+ },
1362
+ "100": {
1363
+ "$value": "#F1F5F9"
1364
+ },
1365
+ "200": {
1366
+ "$value": "#E2E8F0"
1367
+ },
1368
+ "300": {
1369
+ "$value": "#CBD5E1"
1370
+ },
1371
+ "400": {
1372
+ "$value": "#96A3B5",
1373
+ "$description": "Derived: the OKLab midpoint of 300 and 500. Added so muted text can pass 4.5:1 and stay quieter than secondary."
1374
+ },
1375
+ "500": {
1376
+ "$value": "#64748B"
1377
+ },
1378
+ "600": {
1379
+ "$value": "#4B5A6F",
1380
+ "$description": "Derived: the OKLab midpoint of 500 and 700. Added so muted text can pass 4.5:1 and stay quieter than secondary."
1381
+ },
1382
+ "700": {
1383
+ "$value": "#334155"
1384
+ },
1385
+ "800": {
1386
+ "$value": "#1E293B"
1387
+ },
1388
+ "900": {
1389
+ "$value": "#0F172A"
1390
+ },
1391
+ "950": {
1392
+ "$value": "#020617"
1393
+ }
1394
+ },
1395
+ "dark": {
1396
+ "0": {
1397
+ "$value": "#020617"
1398
+ },
1399
+ "50": {
1400
+ "$value": "#0F172A"
1401
+ },
1402
+ "100": {
1403
+ "$value": "#1E293B"
1404
+ },
1405
+ "200": {
1406
+ "$value": "#334155"
1407
+ },
1408
+ "300": {
1409
+ "$value": "#64748B"
1410
+ },
1411
+ "400": {
1412
+ "$value": "#96A3B5",
1413
+ "$description": "Derived: the OKLab midpoint of 300 and 500. Added so muted text can pass 4.5:1 and stay quieter than secondary."
1414
+ },
1415
+ "500": {
1416
+ "$value": "#CBD5E1"
1417
+ },
1418
+ "600": {
1419
+ "$value": "#D6DEE8",
1420
+ "$description": "Derived: the OKLab midpoint of 500 and 700. Added so muted text can pass 4.5:1 and stay quieter than secondary."
1421
+ },
1422
+ "700": {
1423
+ "$value": "#E2E8F0"
1424
+ },
1425
+ "800": {
1426
+ "$value": "#F1F5F9"
1427
+ },
1428
+ "900": {
1429
+ "$value": "#F8FAFC"
1430
+ },
1431
+ "950": {
1432
+ "$value": "#FFFFFF"
1433
+ }
1434
+ }
1435
+ },
1436
+ "teal": {
1437
+ "$type": "color",
1438
+ "$description": "The teal hue: a light ramp, a dark ramp and its base value.",
1439
+ "light": {
1440
+ "100": {
1441
+ "$value": "#E0F2F1"
1442
+ },
1443
+ "300": {
1444
+ "$value": "#7FCFC6"
1445
+ },
1446
+ "500": {
1447
+ "$value": "#14918A"
1448
+ },
1449
+ "600": {
1450
+ "$value": "#0F766E"
1451
+ },
1452
+ "700": {
1453
+ "$value": "#0B5B55"
1454
+ },
1455
+ "800": {
1456
+ "$value": "#08423E"
1457
+ }
1458
+ },
1459
+ "dark": {
1460
+ "100": {
1461
+ "$value": "#08423E"
1462
+ },
1463
+ "300": {
1464
+ "$value": "#0B5B55"
1465
+ },
1466
+ "500": {
1467
+ "$value": "#0F766E"
1468
+ },
1469
+ "600": {
1470
+ "$value": "#14918A"
1471
+ },
1472
+ "700": {
1473
+ "$value": "#7FCFC6"
1474
+ },
1475
+ "800": {
1476
+ "$value": "#E0F2F1"
1477
+ }
1478
+ }
1479
+ },
1480
+ "purple": {
1481
+ "$type": "color",
1482
+ "$description": "The purple hue: a light ramp, a dark ramp and its base value.",
1483
+ "light": {
1484
+ "100": {
1485
+ "$value": "#EDE7FE"
1486
+ },
1487
+ "300": {
1488
+ "$value": "#B79DF7"
1489
+ },
1490
+ "500": {
1491
+ "$value": "#7C4DEB"
1492
+ },
1493
+ "600": {
1494
+ "$value": "#6D28D9"
1495
+ },
1496
+ "700": {
1497
+ "$value": "#5520AA"
1498
+ },
1499
+ "800": {
1500
+ "$value": "#3E177D"
1501
+ }
1502
+ },
1503
+ "dark": {
1504
+ "100": {
1505
+ "$value": "#3E177D"
1506
+ },
1507
+ "300": {
1508
+ "$value": "#5520AA"
1509
+ },
1510
+ "500": {
1511
+ "$value": "#6D28D9"
1512
+ },
1513
+ "600": {
1514
+ "$value": "#7C4DEB"
1515
+ },
1516
+ "700": {
1517
+ "$value": "#B79DF7"
1518
+ },
1519
+ "800": {
1520
+ "$value": "#EDE7FE"
1521
+ }
1522
+ }
1523
+ },
1524
+ "orange": {
1525
+ "$type": "color",
1526
+ "$description": "The orange hue: a light ramp, a dark ramp and its base value.",
1527
+ "light": {
1528
+ "100": {
1529
+ "$value": "#FFEDE5"
1530
+ },
1531
+ "300": {
1532
+ "$value": "#F7A67F"
1533
+ },
1534
+ "500": {
1535
+ "$value": "#E2571D"
1536
+ },
1537
+ "600": {
1538
+ "$value": "#C2410C"
1539
+ },
1540
+ "700": {
1541
+ "$value": "#9A330A"
1542
+ },
1543
+ "800": {
1544
+ "$value": "#732607"
1545
+ }
1546
+ },
1547
+ "dark": {
1548
+ "100": {
1549
+ "$value": "#732607"
1550
+ },
1551
+ "300": {
1552
+ "$value": "#9A330A"
1553
+ },
1554
+ "500": {
1555
+ "$value": "#C2410C"
1556
+ },
1557
+ "600": {
1558
+ "$value": "#E2571D"
1559
+ },
1560
+ "700": {
1561
+ "$value": "#F7A67F"
1562
+ },
1563
+ "800": {
1564
+ "$value": "#FFEDE5"
1565
+ }
1566
+ }
1567
+ },
1568
+ "green": {
1569
+ "$type": "color",
1570
+ "$description": "The green hue: a light ramp, a dark ramp and its base value.",
1571
+ "light": {
1572
+ "100": {
1573
+ "$value": "#E3F4EA"
1574
+ },
1575
+ "300": {
1576
+ "$value": "#5CC283"
1577
+ },
1578
+ "700": {
1579
+ "$value": "#1F7A3A"
1580
+ },
1581
+ "900": {
1582
+ "$value": "#123322"
1583
+ }
1584
+ },
1585
+ "dark": {
1586
+ "100": {
1587
+ "$value": "#123322"
1588
+ },
1589
+ "300": {
1590
+ "$value": "#1F7A3A"
1591
+ },
1592
+ "700": {
1593
+ "$value": "#5CC283"
1594
+ },
1595
+ "900": {
1596
+ "$value": "#E3F4EA"
1597
+ }
1598
+ }
1599
+ },
1600
+ "amber": {
1601
+ "$type": "color",
1602
+ "$description": "The amber hue: a light ramp, a dark ramp and its base value.",
1603
+ "light": {
1604
+ "100": {
1605
+ "$value": "#FFF3D6"
1606
+ },
1607
+ "300": {
1608
+ "$value": "#F2B84B"
1609
+ },
1610
+ "700": {
1611
+ "$value": "#8A5600"
1612
+ },
1613
+ "900": {
1614
+ "$value": "#3A2A05"
1615
+ }
1616
+ },
1617
+ "dark": {
1618
+ "100": {
1619
+ "$value": "#3A2A05"
1620
+ },
1621
+ "300": {
1622
+ "$value": "#8A5600"
1623
+ },
1624
+ "700": {
1625
+ "$value": "#F2B84B"
1626
+ },
1627
+ "900": {
1628
+ "$value": "#FFF3D6"
1629
+ }
1630
+ }
1631
+ },
1632
+ "red": {
1633
+ "$type": "color",
1634
+ "$description": "The red hue: a light ramp, a dark ramp and its base value.",
1635
+ "light": {
1636
+ "100": {
1637
+ "$value": "#FDE7E7"
1638
+ },
1639
+ "300": {
1640
+ "$value": "#F28B8B"
1641
+ },
1642
+ "700": {
1643
+ "$value": "#C42B2B"
1644
+ },
1645
+ "900": {
1646
+ "$value": "#3D1414"
1647
+ }
1648
+ },
1649
+ "dark": {
1650
+ "100": {
1651
+ "$value": "#3D1414"
1652
+ },
1653
+ "300": {
1654
+ "$value": "#C42B2B"
1655
+ },
1656
+ "700": {
1657
+ "$value": "#F28B8B"
1658
+ },
1659
+ "900": {
1660
+ "$value": "#FDE7E7"
1661
+ }
1662
+ }
1663
+ },
1664
+ "black": {
1665
+ "$type": "color",
1666
+ "$description": "See-through black for scrims behind dialogs, light and dark.",
1667
+ "light": {
1668
+ "scrim": {
1669
+ "$value": "#0000008C"
1670
+ }
1671
+ },
1672
+ "dark": {
1673
+ "scrim": {
1674
+ "$value": "#000000B3"
1675
+ }
1676
+ }
1677
+ },
1678
+ "blue": {
1679
+ "$type": "color",
1680
+ "$description": "Blue ramp for the info status and categories. Same values as the accessible-first blue ramp: borrowed, not invented.",
1681
+ "light": {
1682
+ "100": {
1683
+ "$value": "#E1ECFF"
1684
+ },
1685
+ "300": {
1686
+ "$value": "#8AB4F8"
1687
+ },
1688
+ "500": {
1689
+ "$value": "#1A5DD0"
1690
+ },
1691
+ "600": {
1692
+ "$value": "#0B4FC0"
1693
+ },
1694
+ "700": {
1695
+ "$value": "#083C93"
1696
+ },
1697
+ "800": {
1698
+ "$value": "#062C6E"
1699
+ }
1700
+ },
1701
+ "dark": {
1702
+ "100": {
1703
+ "$value": "#062C6E"
1704
+ },
1705
+ "300": {
1706
+ "$value": "#083C93"
1707
+ },
1708
+ "500": {
1709
+ "$value": "#0B4FC0"
1710
+ },
1711
+ "600": {
1712
+ "$value": "#1A5DD0"
1713
+ },
1714
+ "700": {
1715
+ "$value": "#8AB4F8"
1716
+ },
1717
+ "800": {
1718
+ "$value": "#E1ECFF"
1719
+ }
1720
+ }
1721
+ }
1722
+ },
1723
+ "space": {
1724
+ "8": {
1725
+ "$type": "dimension",
1726
+ "$value": "0.5rem"
1727
+ },
1728
+ "12": {
1729
+ "$type": "dimension",
1730
+ "$value": "0.75rem"
1731
+ },
1732
+ "16": {
1733
+ "$type": "dimension",
1734
+ "$value": "1rem"
1735
+ },
1736
+ "24": {
1737
+ "$type": "dimension",
1738
+ "$value": "1.5rem"
1739
+ },
1740
+ "48": {
1741
+ "$type": "dimension",
1742
+ "$value": "3rem"
1743
+ },
1744
+ "$description": "Space options. Names give the size in pixels at the default text size; values are rem."
1745
+ },
1746
+ "size": {
1747
+ "16": {
1748
+ "$type": "dimension",
1749
+ "$value": "1rem"
1750
+ },
1751
+ "20": {
1752
+ "$type": "dimension",
1753
+ "$value": "1.25rem"
1754
+ },
1755
+ "24": {
1756
+ "$type": "dimension",
1757
+ "$value": "1.5rem"
1758
+ },
1759
+ "36": {
1760
+ "$type": "dimension",
1761
+ "$value": "2.25rem"
1762
+ },
1763
+ "44": {
1764
+ "$type": "dimension",
1765
+ "$value": "2.75rem"
1766
+ },
1767
+ "48": {
1768
+ "$type": "dimension",
1769
+ "$value": "3rem"
1770
+ },
1771
+ "$description": "Size options for controls, rows and icons."
1772
+ },
1773
+ "radius": {
1774
+ "0": {
1775
+ "$type": "dimension",
1776
+ "$value": "0rem"
1777
+ },
1778
+ "4": {
1779
+ "$type": "dimension",
1780
+ "$value": "0.25rem"
1781
+ },
1782
+ "8": {
1783
+ "$type": "dimension",
1784
+ "$value": "0.5rem"
1785
+ },
1786
+ "12": {
1787
+ "$type": "dimension",
1788
+ "$value": "0.75rem"
1789
+ },
1790
+ "16": {
1791
+ "$type": "dimension",
1792
+ "$value": "1rem"
1793
+ },
1794
+ "20": {
1795
+ "$type": "dimension",
1796
+ "$value": "1.25rem"
1797
+ },
1798
+ "999": {
1799
+ "$type": "dimension",
1800
+ "$value": "9999px"
1801
+ },
1802
+ "$description": "Corner options.",
1803
+ "full": {
1804
+ "$type": "dimension",
1805
+ "$value": "9999px",
1806
+ "$description": "Fully round."
1807
+ }
1808
+ },
1809
+ "border-width": {
1810
+ "1": {
1811
+ "$type": "dimension",
1812
+ "$value": "1px"
1813
+ },
1814
+ "2": {
1815
+ "$type": "dimension",
1816
+ "$value": "2px"
1817
+ },
1818
+ "$description": "Border width options."
1819
+ },
1820
+ "font": {
1821
+ "size": {
1822
+ "13": {
1823
+ "$type": "dimension",
1824
+ "$value": "0.8125rem"
1825
+ },
1826
+ "14": {
1827
+ "$type": "dimension",
1828
+ "$value": "0.875rem"
1829
+ },
1830
+ "16": {
1831
+ "$type": "dimension",
1832
+ "$value": "1rem"
1833
+ },
1834
+ "20": {
1835
+ "$type": "dimension",
1836
+ "$value": "1.25rem"
1837
+ },
1838
+ "24": {
1839
+ "$type": "dimension",
1840
+ "$value": "1.5rem"
1841
+ },
1842
+ "32": {
1843
+ "$type": "dimension",
1844
+ "$value": "2rem"
1845
+ },
1846
+ "$description": "Type size options. Names are pixels at the default text size; values are rem, so text grows with the user's setting."
1847
+ },
1848
+ "weight": {
1849
+ "400": {
1850
+ "$type": "fontWeight",
1851
+ "$value": 400
1852
+ },
1853
+ "600": {
1854
+ "$type": "fontWeight",
1855
+ "$value": 600
1856
+ },
1857
+ "700": {
1858
+ "$type": "fontWeight",
1859
+ "$value": 700
1860
+ }
1861
+ },
1862
+ "line-height": {
1863
+ "1_2": {
1864
+ "$type": "number",
1865
+ "$value": 1.2,
1866
+ "$description": "A ratio of the text size."
1867
+ },
1868
+ "1_25": {
1869
+ "$type": "number",
1870
+ "$value": 1.25,
1871
+ "$description": "A ratio of the text size."
1872
+ },
1873
+ "1_3": {
1874
+ "$type": "number",
1875
+ "$value": 1.3,
1876
+ "$description": "A ratio of the text size."
1877
+ },
1878
+ "1_4": {
1879
+ "$type": "number",
1880
+ "$value": 1.4,
1881
+ "$description": "A ratio of the text size."
1882
+ },
1883
+ "1_5": {
1884
+ "$type": "number",
1885
+ "$value": 1.5,
1886
+ "$description": "A ratio of the text size."
1887
+ }
1888
+ },
1889
+ "family": {
1890
+ "$description": "Font family options. Each brand's theme picks its display, body, interface and data fonts from these.",
1891
+ "inter": {
1892
+ "$type": "fontFamily",
1893
+ "$value": "Inter, system-ui, sans-serif"
1894
+ },
1895
+ "ibm-plex-mono": {
1896
+ "$type": "fontFamily",
1897
+ "$value": "\"IBM Plex Mono\", ui-monospace, monospace"
1898
+ },
1899
+ "plus-jakarta-sans": {
1900
+ "$type": "fontFamily",
1901
+ "$value": "\"Plus Jakarta Sans\", system-ui, sans-serif"
1902
+ },
1903
+ "poppins": {
1904
+ "$type": "fontFamily",
1905
+ "$value": "Poppins, system-ui, sans-serif"
1906
+ }
1907
+ }
1908
+ },
1909
+ "duration": {
1910
+ "fast": {
1911
+ "$type": "duration",
1912
+ "$value": "120ms",
1913
+ "$description": "Fast: the usual convention for feedback, about 120ms."
1914
+ },
1915
+ "moderate": {
1916
+ "$type": "duration",
1917
+ "$value": "200ms",
1918
+ "$description": "Moderate: a calm, easy-to-follow speed, about 200ms."
1919
+ },
1920
+ "relaxed": {
1921
+ "$type": "duration",
1922
+ "$value": "320ms",
1923
+ "$description": "Relaxed: a slower, springy speed for expressive motion, about 320ms."
1924
+ }
1925
+ },
1926
+ "easing": {
1927
+ "standard": {
1928
+ "$type": "cubicBezier",
1929
+ "$value": [
1930
+ 0.2,
1931
+ 0,
1932
+ 0,
1933
+ 1
1934
+ ],
1935
+ "$description": "The easing for feedback transitions."
1936
+ }
1937
+ },
1938
+ "opacity": {
1939
+ "40": {
1940
+ "$type": "number",
1941
+ "$value": 0.4,
1942
+ "$description": "An opacity option."
1943
+ }
1944
+ },
1945
+ "shadow": {
1946
+ "$description": "Raw shadows. Elevation semantics point at these.",
1947
+ "card": {
1948
+ "$type": "shadow",
1949
+ "$value": {
1950
+ "color": "#0F172A14",
1951
+ "offsetX": "0px",
1952
+ "offsetY": "2px",
1953
+ "blur": "8px",
1954
+ "spread": "0px"
1955
+ },
1956
+ "$description": "Raw shadow for card in light mode."
1957
+ },
1958
+ "overlay": {
1959
+ "$type": "shadow",
1960
+ "$value": {
1961
+ "color": "#0F172A29",
1962
+ "offsetX": "0px",
1963
+ "offsetY": "12px",
1964
+ "blur": "32px",
1965
+ "spread": "0px"
1966
+ },
1967
+ "$description": "Raw shadow for overlay in light mode."
1968
+ },
1969
+ "card-dark": {
1970
+ "$type": "shadow",
1971
+ "$value": {
1972
+ "color": "#00000066",
1973
+ "offsetX": "0px",
1974
+ "offsetY": "2px",
1975
+ "blur": "8px",
1976
+ "spread": "0px"
1977
+ },
1978
+ "$description": "Raw shadow for card in dark mode."
1979
+ },
1980
+ "overlay-dark": {
1981
+ "$type": "shadow",
1982
+ "$value": {
1983
+ "color": "#00000080",
1984
+ "offsetX": "0px",
1985
+ "offsetY": "12px",
1986
+ "blur": "32px",
1987
+ "spread": "0px"
1988
+ },
1989
+ "$description": "Raw shadow for overlay in dark mode."
1990
+ }
1991
+ }
1992
+ },
1993
+ "brands": {
1994
+ "aster": {
1995
+ "label": "Aster",
1996
+ "description": "Calm and precise: teal, Inter, small corners.",
1997
+ "theme": {
1998
+ "$description": "The Aster theme: what each brand-dependent semantic key picks, in light and dark, plus mode-free picks (fonts, corners) in base. Info uses blue, kept apart from the brand colour so it never reads as an action. Categories 1 to 5 are teal, purple, orange, blue, green: distinct hues for tags and chart series, with no meaning. Disabled uses the neutral slate.",
1999
+ "base": {
2000
+ "radius": {
2001
+ "control": {
2002
+ "$type": "dimension",
2003
+ "$value": "{radius.4}"
2004
+ },
2005
+ "badge": {
2006
+ "$type": "dimension",
2007
+ "$value": "{radius.4}"
2008
+ },
2009
+ "container": {
2010
+ "$type": "dimension",
2011
+ "$value": "{radius.8}"
2012
+ }
2013
+ },
2014
+ "type": {
2015
+ "display": {
2016
+ "font-family": {
2017
+ "$type": "fontFamily",
2018
+ "$value": "{font.family.inter}"
2019
+ }
2020
+ },
2021
+ "title": {
2022
+ "font-family": {
2023
+ "$type": "fontFamily",
2024
+ "$value": "{font.family.inter}"
2025
+ }
2026
+ },
2027
+ "heading": {
2028
+ "font-family": {
2029
+ "$type": "fontFamily",
2030
+ "$value": "{font.family.inter}"
2031
+ }
2032
+ },
2033
+ "body": {
2034
+ "font-family": {
2035
+ "$type": "fontFamily",
2036
+ "$value": "{font.family.inter}"
2037
+ }
2038
+ },
2039
+ "label": {
2040
+ "font-family": {
2041
+ "$type": "fontFamily",
2042
+ "$value": "{font.family.inter}"
2043
+ }
2044
+ },
2045
+ "caption": {
2046
+ "font-family": {
2047
+ "$type": "fontFamily",
2048
+ "$value": "{font.family.inter}"
2049
+ }
2050
+ },
2051
+ "data": {
2052
+ "font-family": {
2053
+ "$type": "fontFamily",
2054
+ "$value": "{font.family.inter}"
2055
+ }
2056
+ }
2057
+ }
2058
+ },
2059
+ "light": {
2060
+ "color": {
2061
+ "surface": {
2062
+ "canvas": {
2063
+ "$type": "color",
2064
+ "$value": "{color.slate.light.50}"
2065
+ },
2066
+ "default": {
2067
+ "$type": "color",
2068
+ "$value": "{color.slate.light.0}"
2069
+ },
2070
+ "raised": {
2071
+ "$type": "color",
2072
+ "$value": "{color.slate.light.0}"
2073
+ },
2074
+ "sunken": {
2075
+ "$type": "color",
2076
+ "$value": "{color.slate.light.100}"
2077
+ },
2078
+ "selected": {
2079
+ "$type": "color",
2080
+ "$value": "{color.teal.light.100}"
2081
+ },
2082
+ "inverse": {
2083
+ "$type": "color",
2084
+ "$value": "{color.slate.light.900}"
2085
+ },
2086
+ "scrim": {
2087
+ "$type": "color",
2088
+ "$value": "{color.black.light.scrim}"
2089
+ }
2090
+ },
2091
+ "text": {
2092
+ "primary": {
2093
+ "$type": "color",
2094
+ "$value": "{color.slate.light.900}"
2095
+ },
2096
+ "secondary": {
2097
+ "$type": "color",
2098
+ "$value": "{color.slate.light.700}"
2099
+ },
2100
+ "muted": {
2101
+ "$type": "color",
2102
+ "$value": "{color.slate.light.600}"
2103
+ },
2104
+ "inverse": {
2105
+ "$type": "color",
2106
+ "$value": "{color.slate.light.0}"
2107
+ },
2108
+ "on-action": {
2109
+ "$type": "color",
2110
+ "$value": "{color.slate.light.0}"
2111
+ },
2112
+ "link": {
2113
+ "$type": "color",
2114
+ "$value": "{color.teal.light.700}"
2115
+ }
2116
+ },
2117
+ "border": {
2118
+ "default": {
2119
+ "$type": "color",
2120
+ "$value": "{color.slate.light.200}"
2121
+ },
2122
+ "strong": {
2123
+ "$type": "color",
2124
+ "$value": "{color.slate.light.500}"
2125
+ },
2126
+ "focus": {
2127
+ "$type": "color",
2128
+ "$value": "{color.teal.light.600}"
2129
+ }
2130
+ },
2131
+ "action": {
2132
+ "primary": {
2133
+ "@": {
2134
+ "$type": "color",
2135
+ "$value": "{color.teal.light.600}"
2136
+ },
2137
+ "hover": {
2138
+ "$type": "color",
2139
+ "$value": "{color.teal.light.700}"
2140
+ }
2141
+ },
2142
+ "secondary": {
2143
+ "@": {
2144
+ "$type": "color",
2145
+ "$value": "{color.slate.light.0}"
2146
+ },
2147
+ "hover": {
2148
+ "$type": "color",
2149
+ "$value": "{color.slate.light.100}"
2150
+ }
2151
+ }
2152
+ },
2153
+ "status": {
2154
+ "info": {
2155
+ "@": {
2156
+ "$type": "color",
2157
+ "$value": "{color.blue.light.700}"
2158
+ },
2159
+ "subtle": {
2160
+ "$type": "color",
2161
+ "$value": "{color.blue.light.100}"
2162
+ }
2163
+ },
2164
+ "success": {
2165
+ "@": {
2166
+ "$type": "color",
2167
+ "$value": "{color.green.light.700}"
2168
+ },
2169
+ "subtle": {
2170
+ "$type": "color",
2171
+ "$value": "{color.green.light.100}"
2172
+ }
2173
+ },
2174
+ "warning": {
2175
+ "@": {
2176
+ "$type": "color",
2177
+ "$value": "{color.amber.light.700}"
2178
+ },
2179
+ "subtle": {
2180
+ "$type": "color",
2181
+ "$value": "{color.amber.light.100}"
2182
+ }
2183
+ },
2184
+ "danger": {
2185
+ "@": {
2186
+ "$type": "color",
2187
+ "$value": "{color.red.light.700}"
2188
+ },
2189
+ "subtle": {
2190
+ "$type": "color",
2191
+ "$value": "{color.red.light.100}"
2192
+ }
2193
+ }
2194
+ },
2195
+ "category": {
2196
+ "1": {
2197
+ "@": {
2198
+ "$type": "color",
2199
+ "$value": "{color.teal.light.600}"
2200
+ },
2201
+ "subtle": {
2202
+ "$type": "color",
2203
+ "$value": "{color.teal.light.100}"
2204
+ }
2205
+ },
2206
+ "2": {
2207
+ "@": {
2208
+ "$type": "color",
2209
+ "$value": "{color.purple.light.600}"
2210
+ },
2211
+ "subtle": {
2212
+ "$type": "color",
2213
+ "$value": "{color.purple.light.100}"
2214
+ }
2215
+ },
2216
+ "3": {
2217
+ "@": {
2218
+ "$type": "color",
2219
+ "$value": "{color.orange.light.600}"
2220
+ },
2221
+ "subtle": {
2222
+ "$type": "color",
2223
+ "$value": "{color.orange.light.100}"
2224
+ }
2225
+ },
2226
+ "4": {
2227
+ "@": {
2228
+ "$type": "color",
2229
+ "$value": "{color.blue.light.600}"
2230
+ },
2231
+ "subtle": {
2232
+ "$type": "color",
2233
+ "$value": "{color.blue.light.100}"
2234
+ }
2235
+ },
2236
+ "5": {
2237
+ "@": {
2238
+ "$type": "color",
2239
+ "$value": "{color.green.light.700}"
2240
+ },
2241
+ "subtle": {
2242
+ "$type": "color",
2243
+ "$value": "{color.green.light.100}"
2244
+ }
2245
+ }
2246
+ },
2247
+ "disabled": {
2248
+ "text": {
2249
+ "$type": "color",
2250
+ "$value": "{color.slate.light.500}"
2251
+ },
2252
+ "surface": {
2253
+ "$type": "color",
2254
+ "$value": "{color.slate.light.100}"
2255
+ },
2256
+ "border": {
2257
+ "$type": "color",
2258
+ "$value": "{color.slate.light.200}"
2259
+ }
2260
+ }
2261
+ },
2262
+ "elevation": {
2263
+ "card": {
2264
+ "$type": "shadow",
2265
+ "$value": "{shadow.card}"
2266
+ },
2267
+ "overlay": {
2268
+ "$type": "shadow",
2269
+ "$value": "{shadow.overlay}"
2270
+ }
2271
+ }
2272
+ },
2273
+ "dark": {
2274
+ "color": {
2275
+ "surface": {
2276
+ "canvas": {
2277
+ "$type": "color",
2278
+ "$value": "{color.slate.dark.0}"
2279
+ },
2280
+ "default": {
2281
+ "$type": "color",
2282
+ "$value": "{color.slate.dark.50}"
2283
+ },
2284
+ "raised": {
2285
+ "$type": "color",
2286
+ "$value": "{color.slate.dark.100}"
2287
+ },
2288
+ "sunken": {
2289
+ "$type": "color",
2290
+ "$value": "{color.slate.dark.100}"
2291
+ },
2292
+ "selected": {
2293
+ "$type": "color",
2294
+ "$value": "{color.teal.dark.100}"
2295
+ },
2296
+ "inverse": {
2297
+ "$type": "color",
2298
+ "$value": "{color.slate.dark.900}"
2299
+ },
2300
+ "scrim": {
2301
+ "$type": "color",
2302
+ "$value": "{color.black.dark.scrim}"
2303
+ }
2304
+ },
2305
+ "text": {
2306
+ "primary": {
2307
+ "$type": "color",
2308
+ "$value": "{color.slate.dark.900}"
2309
+ },
2310
+ "secondary": {
2311
+ "$type": "color",
2312
+ "$value": "{color.slate.dark.500}"
2313
+ },
2314
+ "muted": {
2315
+ "$type": "color",
2316
+ "$value": "{color.slate.dark.400}"
2317
+ },
2318
+ "inverse": {
2319
+ "$type": "color",
2320
+ "$value": "{color.slate.dark.50}"
2321
+ },
2322
+ "on-action": {
2323
+ "$type": "color",
2324
+ "$value": "{color.slate.dark.0}"
2325
+ },
2326
+ "link": {
2327
+ "$type": "color",
2328
+ "$value": "{color.teal.dark.700}"
2329
+ }
2330
+ },
2331
+ "border": {
2332
+ "default": {
2333
+ "$type": "color",
2334
+ "$value": "{color.slate.dark.100}"
2335
+ },
2336
+ "strong": {
2337
+ "$type": "color",
2338
+ "$value": "{color.slate.dark.300}"
2339
+ },
2340
+ "focus": {
2341
+ "$type": "color",
2342
+ "$value": "{color.teal.dark.700}"
2343
+ }
2344
+ },
2345
+ "action": {
2346
+ "primary": {
2347
+ "@": {
2348
+ "$type": "color",
2349
+ "$value": "{color.teal.dark.700}"
2350
+ },
2351
+ "hover": {
2352
+ "$type": "color",
2353
+ "$value": "{color.teal.dark.800}"
2354
+ }
2355
+ },
2356
+ "secondary": {
2357
+ "@": {
2358
+ "$type": "color",
2359
+ "$value": "{color.slate.dark.50}"
2360
+ },
2361
+ "hover": {
2362
+ "$type": "color",
2363
+ "$value": "{color.slate.dark.100}"
2364
+ }
2365
+ }
2366
+ },
2367
+ "status": {
2368
+ "info": {
2369
+ "@": {
2370
+ "$type": "color",
2371
+ "$value": "{color.blue.dark.700}"
2372
+ },
2373
+ "subtle": {
2374
+ "$type": "color",
2375
+ "$value": "{color.blue.dark.100}"
2376
+ }
2377
+ },
2378
+ "success": {
2379
+ "@": {
2380
+ "$type": "color",
2381
+ "$value": "{color.green.dark.700}"
2382
+ },
2383
+ "subtle": {
2384
+ "$type": "color",
2385
+ "$value": "{color.green.dark.100}"
2386
+ }
2387
+ },
2388
+ "warning": {
2389
+ "@": {
2390
+ "$type": "color",
2391
+ "$value": "{color.amber.dark.700}"
2392
+ },
2393
+ "subtle": {
2394
+ "$type": "color",
2395
+ "$value": "{color.amber.dark.100}"
2396
+ }
2397
+ },
2398
+ "danger": {
2399
+ "@": {
2400
+ "$type": "color",
2401
+ "$value": "{color.red.dark.700}"
2402
+ },
2403
+ "subtle": {
2404
+ "$type": "color",
2405
+ "$value": "{color.red.dark.100}"
2406
+ }
2407
+ }
2408
+ },
2409
+ "category": {
2410
+ "1": {
2411
+ "@": {
2412
+ "$type": "color",
2413
+ "$value": "{color.teal.dark.700}"
2414
+ },
2415
+ "subtle": {
2416
+ "$type": "color",
2417
+ "$value": "{color.teal.dark.100}"
2418
+ }
2419
+ },
2420
+ "2": {
2421
+ "@": {
2422
+ "$type": "color",
2423
+ "$value": "{color.purple.dark.700}"
2424
+ },
2425
+ "subtle": {
2426
+ "$type": "color",
2427
+ "$value": "{color.purple.dark.100}"
2428
+ }
2429
+ },
2430
+ "3": {
2431
+ "@": {
2432
+ "$type": "color",
2433
+ "$value": "{color.orange.dark.700}"
2434
+ },
2435
+ "subtle": {
2436
+ "$type": "color",
2437
+ "$value": "{color.orange.dark.100}"
2438
+ }
2439
+ },
2440
+ "4": {
2441
+ "@": {
2442
+ "$type": "color",
2443
+ "$value": "{color.blue.dark.700}"
2444
+ },
2445
+ "subtle": {
2446
+ "$type": "color",
2447
+ "$value": "{color.blue.dark.100}"
2448
+ }
2449
+ },
2450
+ "5": {
2451
+ "@": {
2452
+ "$type": "color",
2453
+ "$value": "{color.green.dark.700}"
2454
+ },
2455
+ "subtle": {
2456
+ "$type": "color",
2457
+ "$value": "{color.green.dark.100}"
2458
+ }
2459
+ }
2460
+ },
2461
+ "disabled": {
2462
+ "text": {
2463
+ "$type": "color",
2464
+ "$value": "{color.slate.dark.500}"
2465
+ },
2466
+ "surface": {
2467
+ "$type": "color",
2468
+ "$value": "{color.slate.dark.100}"
2469
+ },
2470
+ "border": {
2471
+ "$type": "color",
2472
+ "$value": "{color.slate.dark.200}"
2473
+ }
2474
+ }
2475
+ },
2476
+ "elevation": {
2477
+ "card": {
2478
+ "$type": "shadow",
2479
+ "$value": "{shadow.card-dark}"
2480
+ },
2481
+ "overlay": {
2482
+ "$type": "shadow",
2483
+ "$value": "{shadow.overlay-dark}"
2484
+ }
2485
+ }
2486
+ }
2487
+ }
2488
+ },
2489
+ "birch": {
2490
+ "label": "Birch",
2491
+ "description": "Friendly and helpful: violet, Plus Jakarta Sans, soft corners.",
2492
+ "theme": {
2493
+ "$description": "The Birch theme: what each brand-dependent semantic key picks, in light and dark, plus mode-free picks (fonts, corners) in base. Info uses blue, kept apart from the brand colour so it never reads as an action. Categories 1 to 5 are teal, purple, orange, blue, green: distinct hues for tags and chart series, with no meaning. Disabled uses the neutral slate.",
2494
+ "base": {
2495
+ "radius": {
2496
+ "control": {
2497
+ "$type": "dimension",
2498
+ "$value": "{radius.12}"
2499
+ },
2500
+ "badge": {
2501
+ "$type": "dimension",
2502
+ "$value": "{radius.999}"
2503
+ },
2504
+ "container": {
2505
+ "$type": "dimension",
2506
+ "$value": "{radius.16}"
2507
+ }
2508
+ },
2509
+ "type": {
2510
+ "display": {
2511
+ "font-family": {
2512
+ "$type": "fontFamily",
2513
+ "$value": "{font.family.plus-jakarta-sans}"
2514
+ }
2515
+ },
2516
+ "title": {
2517
+ "font-family": {
2518
+ "$type": "fontFamily",
2519
+ "$value": "{font.family.plus-jakarta-sans}"
2520
+ }
2521
+ },
2522
+ "heading": {
2523
+ "font-family": {
2524
+ "$type": "fontFamily",
2525
+ "$value": "{font.family.plus-jakarta-sans}"
2526
+ }
2527
+ },
2528
+ "body": {
2529
+ "font-family": {
2530
+ "$type": "fontFamily",
2531
+ "$value": "{font.family.plus-jakarta-sans}"
2532
+ }
2533
+ },
2534
+ "label": {
2535
+ "font-family": {
2536
+ "$type": "fontFamily",
2537
+ "$value": "{font.family.plus-jakarta-sans}"
2538
+ }
2539
+ },
2540
+ "caption": {
2541
+ "font-family": {
2542
+ "$type": "fontFamily",
2543
+ "$value": "{font.family.plus-jakarta-sans}"
2544
+ }
2545
+ },
2546
+ "data": {
2547
+ "font-family": {
2548
+ "$type": "fontFamily",
2549
+ "$value": "{font.family.plus-jakarta-sans}"
2550
+ }
2551
+ }
2552
+ }
2553
+ },
2554
+ "light": {
2555
+ "color": {
2556
+ "surface": {
2557
+ "canvas": {
2558
+ "$type": "color",
2559
+ "$value": "{color.slate.light.50}"
2560
+ },
2561
+ "default": {
2562
+ "$type": "color",
2563
+ "$value": "{color.slate.light.0}"
2564
+ },
2565
+ "raised": {
2566
+ "$type": "color",
2567
+ "$value": "{color.slate.light.0}"
2568
+ },
2569
+ "sunken": {
2570
+ "$type": "color",
2571
+ "$value": "{color.slate.light.100}"
2572
+ },
2573
+ "selected": {
2574
+ "$type": "color",
2575
+ "$value": "{color.purple.light.100}"
2576
+ },
2577
+ "inverse": {
2578
+ "$type": "color",
2579
+ "$value": "{color.slate.light.900}"
2580
+ },
2581
+ "scrim": {
2582
+ "$type": "color",
2583
+ "$value": "{color.black.light.scrim}"
2584
+ }
2585
+ },
2586
+ "text": {
2587
+ "primary": {
2588
+ "$type": "color",
2589
+ "$value": "{color.slate.light.900}"
2590
+ },
2591
+ "secondary": {
2592
+ "$type": "color",
2593
+ "$value": "{color.slate.light.700}"
2594
+ },
2595
+ "muted": {
2596
+ "$type": "color",
2597
+ "$value": "{color.slate.light.600}"
2598
+ },
2599
+ "inverse": {
2600
+ "$type": "color",
2601
+ "$value": "{color.slate.light.0}"
2602
+ },
2603
+ "on-action": {
2604
+ "$type": "color",
2605
+ "$value": "{color.slate.light.0}"
2606
+ },
2607
+ "link": {
2608
+ "$type": "color",
2609
+ "$value": "{color.purple.light.700}"
2610
+ }
2611
+ },
2612
+ "border": {
2613
+ "default": {
2614
+ "$type": "color",
2615
+ "$value": "{color.slate.light.200}"
2616
+ },
2617
+ "strong": {
2618
+ "$type": "color",
2619
+ "$value": "{color.slate.light.500}"
2620
+ },
2621
+ "focus": {
2622
+ "$type": "color",
2623
+ "$value": "{color.purple.light.600}"
2624
+ }
2625
+ },
2626
+ "action": {
2627
+ "primary": {
2628
+ "@": {
2629
+ "$type": "color",
2630
+ "$value": "{color.purple.light.600}"
2631
+ },
2632
+ "hover": {
2633
+ "$type": "color",
2634
+ "$value": "{color.purple.light.700}"
2635
+ }
2636
+ },
2637
+ "secondary": {
2638
+ "@": {
2639
+ "$type": "color",
2640
+ "$value": "{color.slate.light.0}"
2641
+ },
2642
+ "hover": {
2643
+ "$type": "color",
2644
+ "$value": "{color.slate.light.100}"
2645
+ }
2646
+ }
2647
+ },
2648
+ "status": {
2649
+ "info": {
2650
+ "@": {
2651
+ "$type": "color",
2652
+ "$value": "{color.blue.light.700}"
2653
+ },
2654
+ "subtle": {
2655
+ "$type": "color",
2656
+ "$value": "{color.blue.light.100}"
2657
+ }
2658
+ },
2659
+ "success": {
2660
+ "@": {
2661
+ "$type": "color",
2662
+ "$value": "{color.green.light.700}"
2663
+ },
2664
+ "subtle": {
2665
+ "$type": "color",
2666
+ "$value": "{color.green.light.100}"
2667
+ }
2668
+ },
2669
+ "warning": {
2670
+ "@": {
2671
+ "$type": "color",
2672
+ "$value": "{color.amber.light.700}"
2673
+ },
2674
+ "subtle": {
2675
+ "$type": "color",
2676
+ "$value": "{color.amber.light.100}"
2677
+ }
2678
+ },
2679
+ "danger": {
2680
+ "@": {
2681
+ "$type": "color",
2682
+ "$value": "{color.red.light.700}"
2683
+ },
2684
+ "subtle": {
2685
+ "$type": "color",
2686
+ "$value": "{color.red.light.100}"
2687
+ }
2688
+ }
2689
+ },
2690
+ "category": {
2691
+ "1": {
2692
+ "@": {
2693
+ "$type": "color",
2694
+ "$value": "{color.teal.light.600}"
2695
+ },
2696
+ "subtle": {
2697
+ "$type": "color",
2698
+ "$value": "{color.teal.light.100}"
2699
+ }
2700
+ },
2701
+ "2": {
2702
+ "@": {
2703
+ "$type": "color",
2704
+ "$value": "{color.purple.light.600}"
2705
+ },
2706
+ "subtle": {
2707
+ "$type": "color",
2708
+ "$value": "{color.purple.light.100}"
2709
+ }
2710
+ },
2711
+ "3": {
2712
+ "@": {
2713
+ "$type": "color",
2714
+ "$value": "{color.orange.light.600}"
2715
+ },
2716
+ "subtle": {
2717
+ "$type": "color",
2718
+ "$value": "{color.orange.light.100}"
2719
+ }
2720
+ },
2721
+ "4": {
2722
+ "@": {
2723
+ "$type": "color",
2724
+ "$value": "{color.blue.light.600}"
2725
+ },
2726
+ "subtle": {
2727
+ "$type": "color",
2728
+ "$value": "{color.blue.light.100}"
2729
+ }
2730
+ },
2731
+ "5": {
2732
+ "@": {
2733
+ "$type": "color",
2734
+ "$value": "{color.green.light.700}"
2735
+ },
2736
+ "subtle": {
2737
+ "$type": "color",
2738
+ "$value": "{color.green.light.100}"
2739
+ }
2740
+ }
2741
+ },
2742
+ "disabled": {
2743
+ "text": {
2744
+ "$type": "color",
2745
+ "$value": "{color.slate.light.500}"
2746
+ },
2747
+ "surface": {
2748
+ "$type": "color",
2749
+ "$value": "{color.slate.light.100}"
2750
+ },
2751
+ "border": {
2752
+ "$type": "color",
2753
+ "$value": "{color.slate.light.200}"
2754
+ }
2755
+ }
2756
+ },
2757
+ "elevation": {
2758
+ "card": {
2759
+ "$type": "shadow",
2760
+ "$value": "{shadow.card}"
2761
+ },
2762
+ "overlay": {
2763
+ "$type": "shadow",
2764
+ "$value": "{shadow.overlay}"
2765
+ }
2766
+ }
2767
+ },
2768
+ "dark": {
2769
+ "color": {
2770
+ "surface": {
2771
+ "canvas": {
2772
+ "$type": "color",
2773
+ "$value": "{color.slate.dark.0}"
2774
+ },
2775
+ "default": {
2776
+ "$type": "color",
2777
+ "$value": "{color.slate.dark.50}"
2778
+ },
2779
+ "raised": {
2780
+ "$type": "color",
2781
+ "$value": "{color.slate.dark.100}"
2782
+ },
2783
+ "sunken": {
2784
+ "$type": "color",
2785
+ "$value": "{color.slate.dark.100}"
2786
+ },
2787
+ "selected": {
2788
+ "$type": "color",
2789
+ "$value": "{color.purple.dark.100}"
2790
+ },
2791
+ "inverse": {
2792
+ "$type": "color",
2793
+ "$value": "{color.slate.dark.900}"
2794
+ },
2795
+ "scrim": {
2796
+ "$type": "color",
2797
+ "$value": "{color.black.dark.scrim}"
2798
+ }
2799
+ },
2800
+ "text": {
2801
+ "primary": {
2802
+ "$type": "color",
2803
+ "$value": "{color.slate.dark.900}"
2804
+ },
2805
+ "secondary": {
2806
+ "$type": "color",
2807
+ "$value": "{color.slate.dark.500}"
2808
+ },
2809
+ "muted": {
2810
+ "$type": "color",
2811
+ "$value": "{color.slate.dark.400}"
2812
+ },
2813
+ "inverse": {
2814
+ "$type": "color",
2815
+ "$value": "{color.slate.dark.50}"
2816
+ },
2817
+ "on-action": {
2818
+ "$type": "color",
2819
+ "$value": "{color.slate.dark.0}"
2820
+ },
2821
+ "link": {
2822
+ "$type": "color",
2823
+ "$value": "{color.purple.dark.700}"
2824
+ }
2825
+ },
2826
+ "border": {
2827
+ "default": {
2828
+ "$type": "color",
2829
+ "$value": "{color.slate.dark.100}"
2830
+ },
2831
+ "strong": {
2832
+ "$type": "color",
2833
+ "$value": "{color.slate.dark.300}"
2834
+ },
2835
+ "focus": {
2836
+ "$type": "color",
2837
+ "$value": "{color.purple.dark.700}"
2838
+ }
2839
+ },
2840
+ "action": {
2841
+ "primary": {
2842
+ "@": {
2843
+ "$type": "color",
2844
+ "$value": "{color.purple.dark.700}"
2845
+ },
2846
+ "hover": {
2847
+ "$type": "color",
2848
+ "$value": "{color.purple.dark.800}"
2849
+ }
2850
+ },
2851
+ "secondary": {
2852
+ "@": {
2853
+ "$type": "color",
2854
+ "$value": "{color.slate.dark.50}"
2855
+ },
2856
+ "hover": {
2857
+ "$type": "color",
2858
+ "$value": "{color.slate.dark.100}"
2859
+ }
2860
+ }
2861
+ },
2862
+ "status": {
2863
+ "info": {
2864
+ "@": {
2865
+ "$type": "color",
2866
+ "$value": "{color.blue.dark.700}"
2867
+ },
2868
+ "subtle": {
2869
+ "$type": "color",
2870
+ "$value": "{color.blue.dark.100}"
2871
+ }
2872
+ },
2873
+ "success": {
2874
+ "@": {
2875
+ "$type": "color",
2876
+ "$value": "{color.green.dark.700}"
2877
+ },
2878
+ "subtle": {
2879
+ "$type": "color",
2880
+ "$value": "{color.green.dark.100}"
2881
+ }
2882
+ },
2883
+ "warning": {
2884
+ "@": {
2885
+ "$type": "color",
2886
+ "$value": "{color.amber.dark.700}"
2887
+ },
2888
+ "subtle": {
2889
+ "$type": "color",
2890
+ "$value": "{color.amber.dark.100}"
2891
+ }
2892
+ },
2893
+ "danger": {
2894
+ "@": {
2895
+ "$type": "color",
2896
+ "$value": "{color.red.dark.700}"
2897
+ },
2898
+ "subtle": {
2899
+ "$type": "color",
2900
+ "$value": "{color.red.dark.100}"
2901
+ }
2902
+ }
2903
+ },
2904
+ "category": {
2905
+ "1": {
2906
+ "@": {
2907
+ "$type": "color",
2908
+ "$value": "{color.teal.dark.700}"
2909
+ },
2910
+ "subtle": {
2911
+ "$type": "color",
2912
+ "$value": "{color.teal.dark.100}"
2913
+ }
2914
+ },
2915
+ "2": {
2916
+ "@": {
2917
+ "$type": "color",
2918
+ "$value": "{color.purple.dark.700}"
2919
+ },
2920
+ "subtle": {
2921
+ "$type": "color",
2922
+ "$value": "{color.purple.dark.100}"
2923
+ }
2924
+ },
2925
+ "3": {
2926
+ "@": {
2927
+ "$type": "color",
2928
+ "$value": "{color.orange.dark.700}"
2929
+ },
2930
+ "subtle": {
2931
+ "$type": "color",
2932
+ "$value": "{color.orange.dark.100}"
2933
+ }
2934
+ },
2935
+ "4": {
2936
+ "@": {
2937
+ "$type": "color",
2938
+ "$value": "{color.blue.dark.700}"
2939
+ },
2940
+ "subtle": {
2941
+ "$type": "color",
2942
+ "$value": "{color.blue.dark.100}"
2943
+ }
2944
+ },
2945
+ "5": {
2946
+ "@": {
2947
+ "$type": "color",
2948
+ "$value": "{color.green.dark.700}"
2949
+ },
2950
+ "subtle": {
2951
+ "$type": "color",
2952
+ "$value": "{color.green.dark.100}"
2953
+ }
2954
+ }
2955
+ },
2956
+ "disabled": {
2957
+ "text": {
2958
+ "$type": "color",
2959
+ "$value": "{color.slate.dark.500}"
2960
+ },
2961
+ "surface": {
2962
+ "$type": "color",
2963
+ "$value": "{color.slate.dark.100}"
2964
+ },
2965
+ "border": {
2966
+ "$type": "color",
2967
+ "$value": "{color.slate.dark.200}"
2968
+ }
2969
+ }
2970
+ },
2971
+ "elevation": {
2972
+ "card": {
2973
+ "$type": "shadow",
2974
+ "$value": "{shadow.card-dark}"
2975
+ },
2976
+ "overlay": {
2977
+ "$type": "shadow",
2978
+ "$value": "{shadow.overlay-dark}"
2979
+ }
2980
+ }
2981
+ }
2982
+ }
2983
+ },
2984
+ "coral": {
2985
+ "label": "Coral",
2986
+ "description": "Upbeat and energetic: coral orange, Poppins, pill controls.",
2987
+ "theme": {
2988
+ "$description": "The Coral theme: what each brand-dependent semantic key picks, in light and dark, plus mode-free picks (fonts, corners) in base. Info uses blue, kept apart from the brand colour so it never reads as an action. Categories 1 to 5 are teal, purple, orange, blue, green: distinct hues for tags and chart series, with no meaning. Disabled uses the neutral slate.",
2989
+ "base": {
2990
+ "radius": {
2991
+ "control": {
2992
+ "$type": "dimension",
2993
+ "$value": "{radius.999}"
2994
+ },
2995
+ "badge": {
2996
+ "$type": "dimension",
2997
+ "$value": "{radius.999}"
2998
+ },
2999
+ "container": {
3000
+ "$type": "dimension",
3001
+ "$value": "{radius.20}"
3002
+ }
3003
+ },
3004
+ "type": {
3005
+ "display": {
3006
+ "font-family": {
3007
+ "$type": "fontFamily",
3008
+ "$value": "{font.family.poppins}"
3009
+ }
3010
+ },
3011
+ "title": {
3012
+ "font-family": {
3013
+ "$type": "fontFamily",
3014
+ "$value": "{font.family.poppins}"
3015
+ }
3016
+ },
3017
+ "heading": {
3018
+ "font-family": {
3019
+ "$type": "fontFamily",
3020
+ "$value": "{font.family.poppins}"
3021
+ }
3022
+ },
3023
+ "body": {
3024
+ "font-family": {
3025
+ "$type": "fontFamily",
3026
+ "$value": "{font.family.poppins}"
3027
+ }
3028
+ },
3029
+ "label": {
3030
+ "font-family": {
3031
+ "$type": "fontFamily",
3032
+ "$value": "{font.family.poppins}"
3033
+ }
3034
+ },
3035
+ "caption": {
3036
+ "font-family": {
3037
+ "$type": "fontFamily",
3038
+ "$value": "{font.family.poppins}"
3039
+ }
3040
+ },
3041
+ "data": {
3042
+ "font-family": {
3043
+ "$type": "fontFamily",
3044
+ "$value": "{font.family.poppins}"
3045
+ }
3046
+ }
3047
+ }
3048
+ },
3049
+ "light": {
3050
+ "color": {
3051
+ "surface": {
3052
+ "canvas": {
3053
+ "$type": "color",
3054
+ "$value": "{color.slate.light.50}"
3055
+ },
3056
+ "default": {
3057
+ "$type": "color",
3058
+ "$value": "{color.slate.light.0}"
3059
+ },
3060
+ "raised": {
3061
+ "$type": "color",
3062
+ "$value": "{color.slate.light.0}"
3063
+ },
3064
+ "sunken": {
3065
+ "$type": "color",
3066
+ "$value": "{color.slate.light.100}"
3067
+ },
3068
+ "selected": {
3069
+ "$type": "color",
3070
+ "$value": "{color.orange.light.100}"
3071
+ },
3072
+ "inverse": {
3073
+ "$type": "color",
3074
+ "$value": "{color.slate.light.900}"
3075
+ },
3076
+ "scrim": {
3077
+ "$type": "color",
3078
+ "$value": "{color.black.light.scrim}"
3079
+ }
3080
+ },
3081
+ "text": {
3082
+ "primary": {
3083
+ "$type": "color",
3084
+ "$value": "{color.slate.light.900}"
3085
+ },
3086
+ "secondary": {
3087
+ "$type": "color",
3088
+ "$value": "{color.slate.light.700}"
3089
+ },
3090
+ "muted": {
3091
+ "$type": "color",
3092
+ "$value": "{color.slate.light.600}"
3093
+ },
3094
+ "inverse": {
3095
+ "$type": "color",
3096
+ "$value": "{color.slate.light.0}"
3097
+ },
3098
+ "on-action": {
3099
+ "$type": "color",
3100
+ "$value": "{color.slate.light.0}"
3101
+ },
3102
+ "link": {
3103
+ "$type": "color",
3104
+ "$value": "{color.orange.light.700}"
3105
+ }
3106
+ },
3107
+ "border": {
3108
+ "default": {
3109
+ "$type": "color",
3110
+ "$value": "{color.slate.light.200}"
3111
+ },
3112
+ "strong": {
3113
+ "$type": "color",
3114
+ "$value": "{color.slate.light.500}"
3115
+ },
3116
+ "focus": {
3117
+ "$type": "color",
3118
+ "$value": "{color.orange.light.600}"
3119
+ }
3120
+ },
3121
+ "action": {
3122
+ "primary": {
3123
+ "@": {
3124
+ "$type": "color",
3125
+ "$value": "{color.orange.light.600}"
3126
+ },
3127
+ "hover": {
3128
+ "$type": "color",
3129
+ "$value": "{color.orange.light.700}"
3130
+ }
3131
+ },
3132
+ "secondary": {
3133
+ "@": {
3134
+ "$type": "color",
3135
+ "$value": "{color.slate.light.0}"
3136
+ },
3137
+ "hover": {
3138
+ "$type": "color",
3139
+ "$value": "{color.slate.light.100}"
3140
+ }
3141
+ }
3142
+ },
3143
+ "status": {
3144
+ "info": {
3145
+ "@": {
3146
+ "$type": "color",
3147
+ "$value": "{color.blue.light.700}"
3148
+ },
3149
+ "subtle": {
3150
+ "$type": "color",
3151
+ "$value": "{color.blue.light.100}"
3152
+ }
3153
+ },
3154
+ "success": {
3155
+ "@": {
3156
+ "$type": "color",
3157
+ "$value": "{color.green.light.700}"
3158
+ },
3159
+ "subtle": {
3160
+ "$type": "color",
3161
+ "$value": "{color.green.light.100}"
3162
+ }
3163
+ },
3164
+ "warning": {
3165
+ "@": {
3166
+ "$type": "color",
3167
+ "$value": "{color.amber.light.700}"
3168
+ },
3169
+ "subtle": {
3170
+ "$type": "color",
3171
+ "$value": "{color.amber.light.100}"
3172
+ }
3173
+ },
3174
+ "danger": {
3175
+ "@": {
3176
+ "$type": "color",
3177
+ "$value": "{color.red.light.700}"
3178
+ },
3179
+ "subtle": {
3180
+ "$type": "color",
3181
+ "$value": "{color.red.light.100}"
3182
+ }
3183
+ }
3184
+ },
3185
+ "category": {
3186
+ "1": {
3187
+ "@": {
3188
+ "$type": "color",
3189
+ "$value": "{color.teal.light.600}"
3190
+ },
3191
+ "subtle": {
3192
+ "$type": "color",
3193
+ "$value": "{color.teal.light.100}"
3194
+ }
3195
+ },
3196
+ "2": {
3197
+ "@": {
3198
+ "$type": "color",
3199
+ "$value": "{color.purple.light.600}"
3200
+ },
3201
+ "subtle": {
3202
+ "$type": "color",
3203
+ "$value": "{color.purple.light.100}"
3204
+ }
3205
+ },
3206
+ "3": {
3207
+ "@": {
3208
+ "$type": "color",
3209
+ "$value": "{color.orange.light.600}"
3210
+ },
3211
+ "subtle": {
3212
+ "$type": "color",
3213
+ "$value": "{color.orange.light.100}"
3214
+ }
3215
+ },
3216
+ "4": {
3217
+ "@": {
3218
+ "$type": "color",
3219
+ "$value": "{color.blue.light.600}"
3220
+ },
3221
+ "subtle": {
3222
+ "$type": "color",
3223
+ "$value": "{color.blue.light.100}"
3224
+ }
3225
+ },
3226
+ "5": {
3227
+ "@": {
3228
+ "$type": "color",
3229
+ "$value": "{color.green.light.700}"
3230
+ },
3231
+ "subtle": {
3232
+ "$type": "color",
3233
+ "$value": "{color.green.light.100}"
3234
+ }
3235
+ }
3236
+ },
3237
+ "disabled": {
3238
+ "text": {
3239
+ "$type": "color",
3240
+ "$value": "{color.slate.light.500}"
3241
+ },
3242
+ "surface": {
3243
+ "$type": "color",
3244
+ "$value": "{color.slate.light.100}"
3245
+ },
3246
+ "border": {
3247
+ "$type": "color",
3248
+ "$value": "{color.slate.light.200}"
3249
+ }
3250
+ }
3251
+ },
3252
+ "elevation": {
3253
+ "card": {
3254
+ "$type": "shadow",
3255
+ "$value": "{shadow.card}"
3256
+ },
3257
+ "overlay": {
3258
+ "$type": "shadow",
3259
+ "$value": "{shadow.overlay}"
3260
+ }
3261
+ }
3262
+ },
3263
+ "dark": {
3264
+ "color": {
3265
+ "surface": {
3266
+ "canvas": {
3267
+ "$type": "color",
3268
+ "$value": "{color.slate.dark.0}"
3269
+ },
3270
+ "default": {
3271
+ "$type": "color",
3272
+ "$value": "{color.slate.dark.50}"
3273
+ },
3274
+ "raised": {
3275
+ "$type": "color",
3276
+ "$value": "{color.slate.dark.100}"
3277
+ },
3278
+ "sunken": {
3279
+ "$type": "color",
3280
+ "$value": "{color.slate.dark.100}"
3281
+ },
3282
+ "selected": {
3283
+ "$type": "color",
3284
+ "$value": "{color.orange.dark.100}"
3285
+ },
3286
+ "inverse": {
3287
+ "$type": "color",
3288
+ "$value": "{color.slate.dark.900}"
3289
+ },
3290
+ "scrim": {
3291
+ "$type": "color",
3292
+ "$value": "{color.black.dark.scrim}"
3293
+ }
3294
+ },
3295
+ "text": {
3296
+ "primary": {
3297
+ "$type": "color",
3298
+ "$value": "{color.slate.dark.900}"
3299
+ },
3300
+ "secondary": {
3301
+ "$type": "color",
3302
+ "$value": "{color.slate.dark.500}"
3303
+ },
3304
+ "muted": {
3305
+ "$type": "color",
3306
+ "$value": "{color.slate.dark.400}"
3307
+ },
3308
+ "inverse": {
3309
+ "$type": "color",
3310
+ "$value": "{color.slate.dark.50}"
3311
+ },
3312
+ "on-action": {
3313
+ "$type": "color",
3314
+ "$value": "{color.slate.dark.0}"
3315
+ },
3316
+ "link": {
3317
+ "$type": "color",
3318
+ "$value": "{color.orange.dark.700}"
3319
+ }
3320
+ },
3321
+ "border": {
3322
+ "default": {
3323
+ "$type": "color",
3324
+ "$value": "{color.slate.dark.100}"
3325
+ },
3326
+ "strong": {
3327
+ "$type": "color",
3328
+ "$value": "{color.slate.dark.300}"
3329
+ },
3330
+ "focus": {
3331
+ "$type": "color",
3332
+ "$value": "{color.orange.dark.700}"
3333
+ }
3334
+ },
3335
+ "action": {
3336
+ "primary": {
3337
+ "@": {
3338
+ "$type": "color",
3339
+ "$value": "{color.orange.dark.700}"
3340
+ },
3341
+ "hover": {
3342
+ "$type": "color",
3343
+ "$value": "{color.orange.dark.800}"
3344
+ }
3345
+ },
3346
+ "secondary": {
3347
+ "@": {
3348
+ "$type": "color",
3349
+ "$value": "{color.slate.dark.50}"
3350
+ },
3351
+ "hover": {
3352
+ "$type": "color",
3353
+ "$value": "{color.slate.dark.100}"
3354
+ }
3355
+ }
3356
+ },
3357
+ "status": {
3358
+ "info": {
3359
+ "@": {
3360
+ "$type": "color",
3361
+ "$value": "{color.blue.dark.700}"
3362
+ },
3363
+ "subtle": {
3364
+ "$type": "color",
3365
+ "$value": "{color.blue.dark.100}"
3366
+ }
3367
+ },
3368
+ "success": {
3369
+ "@": {
3370
+ "$type": "color",
3371
+ "$value": "{color.green.dark.700}"
3372
+ },
3373
+ "subtle": {
3374
+ "$type": "color",
3375
+ "$value": "{color.green.dark.100}"
3376
+ }
3377
+ },
3378
+ "warning": {
3379
+ "@": {
3380
+ "$type": "color",
3381
+ "$value": "{color.amber.dark.700}"
3382
+ },
3383
+ "subtle": {
3384
+ "$type": "color",
3385
+ "$value": "{color.amber.dark.100}"
3386
+ }
3387
+ },
3388
+ "danger": {
3389
+ "@": {
3390
+ "$type": "color",
3391
+ "$value": "{color.red.dark.700}"
3392
+ },
3393
+ "subtle": {
3394
+ "$type": "color",
3395
+ "$value": "{color.red.dark.100}"
3396
+ }
3397
+ }
3398
+ },
3399
+ "category": {
3400
+ "1": {
3401
+ "@": {
3402
+ "$type": "color",
3403
+ "$value": "{color.teal.dark.700}"
3404
+ },
3405
+ "subtle": {
3406
+ "$type": "color",
3407
+ "$value": "{color.teal.dark.100}"
3408
+ }
3409
+ },
3410
+ "2": {
3411
+ "@": {
3412
+ "$type": "color",
3413
+ "$value": "{color.purple.dark.700}"
3414
+ },
3415
+ "subtle": {
3416
+ "$type": "color",
3417
+ "$value": "{color.purple.dark.100}"
3418
+ }
3419
+ },
3420
+ "3": {
3421
+ "@": {
3422
+ "$type": "color",
3423
+ "$value": "{color.orange.dark.700}"
3424
+ },
3425
+ "subtle": {
3426
+ "$type": "color",
3427
+ "$value": "{color.orange.dark.100}"
3428
+ }
3429
+ },
3430
+ "4": {
3431
+ "@": {
3432
+ "$type": "color",
3433
+ "$value": "{color.blue.dark.700}"
3434
+ },
3435
+ "subtle": {
3436
+ "$type": "color",
3437
+ "$value": "{color.blue.dark.100}"
3438
+ }
3439
+ },
3440
+ "5": {
3441
+ "@": {
3442
+ "$type": "color",
3443
+ "$value": "{color.green.dark.700}"
3444
+ },
3445
+ "subtle": {
3446
+ "$type": "color",
3447
+ "$value": "{color.green.dark.100}"
3448
+ }
3449
+ }
3450
+ },
3451
+ "disabled": {
3452
+ "text": {
3453
+ "$type": "color",
3454
+ "$value": "{color.slate.dark.500}"
3455
+ },
3456
+ "surface": {
3457
+ "$type": "color",
3458
+ "$value": "{color.slate.dark.100}"
3459
+ },
3460
+ "border": {
3461
+ "$type": "color",
3462
+ "$value": "{color.slate.dark.200}"
3463
+ }
3464
+ }
3465
+ },
3466
+ "elevation": {
3467
+ "card": {
3468
+ "$type": "shadow",
3469
+ "$value": "{shadow.card-dark}"
3470
+ },
3471
+ "overlay": {
3472
+ "$type": "shadow",
3473
+ "$value": "{shadow.overlay-dark}"
3474
+ }
3475
+ }
3476
+ }
3477
+ }
3478
+ }
3479
+ },
3480
+ "semantic": {
3481
+ "space": {
3482
+ "gap": {
3483
+ "tight": {
3484
+ "$type": "dimension",
3485
+ "$value": "{space.8}",
3486
+ "$description": "Between things that belong together."
3487
+ },
3488
+ "default": {
3489
+ "$type": "dimension",
3490
+ "$value": "{space.12}",
3491
+ "$description": "Between items in one group."
3492
+ },
3493
+ "group": {
3494
+ "$type": "dimension",
3495
+ "$value": "{space.24}",
3496
+ "$description": "Between groups."
3497
+ },
3498
+ "section": {
3499
+ "$type": "dimension",
3500
+ "$value": "{space.48}",
3501
+ "$description": "Between page sections."
3502
+ }
3503
+ },
3504
+ "inset": {
3505
+ "control-x": {
3506
+ "$type": "dimension",
3507
+ "$value": "{space.16}",
3508
+ "$description": "Horizontal padding inside controls."
3509
+ },
3510
+ "container": {
3511
+ "$type": "dimension",
3512
+ "$value": "{space.24}",
3513
+ "$description": "Padding inside cards and dialogs."
3514
+ },
3515
+ "cell-x": {
3516
+ "$type": "dimension",
3517
+ "$value": "{space.16}",
3518
+ "$description": "Horizontal padding inside table cells."
3519
+ }
3520
+ }
3521
+ },
3522
+ "size": {
3523
+ "control": {
3524
+ "default": {
3525
+ "$type": "dimension",
3526
+ "$value": "{size.44}",
3527
+ "$description": "Height of buttons and inputs, and the smallest target."
3528
+ },
3529
+ "compact": {
3530
+ "$type": "dimension",
3531
+ "$value": "{size.36}",
3532
+ "$description": "Height of compact controls."
3533
+ }
3534
+ },
3535
+ "row": {
3536
+ "$type": "dimension",
3537
+ "$value": "{size.48}",
3538
+ "$description": "Height of one table row."
3539
+ },
3540
+ "icon": {
3541
+ "$type": "dimension",
3542
+ "$value": "{size.16}",
3543
+ "$description": "Icon size next to text."
3544
+ }
3545
+ },
3546
+ "radius": {
3547
+ "control": {
3548
+ "$type": "dimension",
3549
+ "$value": "{theme.radius.control}",
3550
+ "$description": "Corner of buttons and inputs."
3551
+ },
3552
+ "badge": {
3553
+ "$type": "dimension",
3554
+ "$value": "{theme.radius.badge}",
3555
+ "$description": "Corner of badges and checkboxes."
3556
+ },
3557
+ "container": {
3558
+ "$type": "dimension",
3559
+ "$value": "{theme.radius.container}",
3560
+ "$description": "Corner of cards, menus and dialogs."
3561
+ },
3562
+ "round": {
3563
+ "$type": "dimension",
3564
+ "$value": "{radius.full}",
3565
+ "$description": "Fully round: avatars and dots."
3566
+ }
3567
+ },
3568
+ "border-width": {
3569
+ "default": {
3570
+ "$type": "dimension",
3571
+ "$value": "{border-width.1}",
3572
+ "$description": "Every border."
3573
+ },
3574
+ "focus": {
3575
+ "$type": "dimension",
3576
+ "$value": "{border-width.2}",
3577
+ "$description": "The focus ring."
3578
+ }
3579
+ },
3580
+ "type": {
3581
+ "display": {
3582
+ "font-family": {
3583
+ "$type": "fontFamily",
3584
+ "$value": "{theme.type.display.font-family}"
3585
+ },
3586
+ "font-size": {
3587
+ "$type": "dimension",
3588
+ "$value": "{font.size.32}"
3589
+ },
3590
+ "line-height": {
3591
+ "$type": "number",
3592
+ "$value": "{font.line-height.1_2}"
3593
+ },
3594
+ "font-weight": {
3595
+ "$type": "fontWeight",
3596
+ "$value": "{font.weight.700}"
3597
+ },
3598
+ "$description": "The display text role."
3599
+ },
3600
+ "title": {
3601
+ "font-family": {
3602
+ "$type": "fontFamily",
3603
+ "$value": "{theme.type.title.font-family}"
3604
+ },
3605
+ "font-size": {
3606
+ "$type": "dimension",
3607
+ "$value": "{font.size.24}"
3608
+ },
3609
+ "line-height": {
3610
+ "$type": "number",
3611
+ "$value": "{font.line-height.1_25}"
3612
+ },
3613
+ "font-weight": {
3614
+ "$type": "fontWeight",
3615
+ "$value": "{font.weight.600}"
3616
+ },
3617
+ "$description": "The title text role."
3618
+ },
3619
+ "heading": {
3620
+ "font-family": {
3621
+ "$type": "fontFamily",
3622
+ "$value": "{theme.type.heading.font-family}"
3623
+ },
3624
+ "font-size": {
3625
+ "$type": "dimension",
3626
+ "$value": "{font.size.20}"
3627
+ },
3628
+ "line-height": {
3629
+ "$type": "number",
3630
+ "$value": "{font.line-height.1_3}"
3631
+ },
3632
+ "font-weight": {
3633
+ "$type": "fontWeight",
3634
+ "$value": "{font.weight.600}"
3635
+ },
3636
+ "$description": "The heading text role."
3637
+ },
3638
+ "body": {
3639
+ "font-family": {
3640
+ "$type": "fontFamily",
3641
+ "$value": "{theme.type.body.font-family}"
3642
+ },
3643
+ "font-size": {
3644
+ "$type": "dimension",
3645
+ "$value": "{font.size.16}"
3646
+ },
3647
+ "line-height": {
3648
+ "$type": "number",
3649
+ "$value": "{font.line-height.1_5}"
3650
+ },
3651
+ "font-weight": {
3652
+ "$type": "fontWeight",
3653
+ "$value": "{font.weight.400}"
3654
+ },
3655
+ "$description": "The body text role."
3656
+ },
3657
+ "label": {
3658
+ "font-family": {
3659
+ "$type": "fontFamily",
3660
+ "$value": "{theme.type.label.font-family}"
3661
+ },
3662
+ "font-size": {
3663
+ "$type": "dimension",
3664
+ "$value": "{font.size.14}"
3665
+ },
3666
+ "line-height": {
3667
+ "$type": "number",
3668
+ "$value": "{font.line-height.1_4}"
3669
+ },
3670
+ "font-weight": {
3671
+ "$type": "fontWeight",
3672
+ "$value": "{font.weight.600}"
3673
+ },
3674
+ "$description": "The label text role."
3675
+ },
3676
+ "caption": {
3677
+ "font-family": {
3678
+ "$type": "fontFamily",
3679
+ "$value": "{theme.type.caption.font-family}"
3680
+ },
3681
+ "font-size": {
3682
+ "$type": "dimension",
3683
+ "$value": "{font.size.13}"
3684
+ },
3685
+ "line-height": {
3686
+ "$type": "number",
3687
+ "$value": "{font.line-height.1_4}"
3688
+ },
3689
+ "font-weight": {
3690
+ "$type": "fontWeight",
3691
+ "$value": "{font.weight.400}"
3692
+ },
3693
+ "$description": "The caption text role."
3694
+ },
3695
+ "data": {
3696
+ "font-family": {
3697
+ "$type": "fontFamily",
3698
+ "$value": "{theme.type.data.font-family}"
3699
+ },
3700
+ "font-size": {
3701
+ "$type": "dimension",
3702
+ "$value": "{font.size.16}"
3703
+ },
3704
+ "line-height": {
3705
+ "$type": "number",
3706
+ "$value": "{font.line-height.1_5}"
3707
+ },
3708
+ "font-weight": {
3709
+ "$type": "fontWeight",
3710
+ "$value": "{font.weight.400}"
3711
+ },
3712
+ "$description": "The data text role."
3713
+ }
3714
+ },
3715
+ "motion": {
3716
+ "duration": {
3717
+ "feedback": {
3718
+ "$type": "duration",
3719
+ "$value": "{duration.moderate}",
3720
+ "$description": "Feedback speed: moderate."
3721
+ }
3722
+ },
3723
+ "easing": {
3724
+ "standard": {
3725
+ "$type": "cubicBezier",
3726
+ "$value": "{easing.standard}",
3727
+ "$description": "Feedback easing."
3728
+ }
3729
+ }
3730
+ },
3731
+ "opacity": {
3732
+ "disabled": {
3733
+ "$type": "number",
3734
+ "$value": "{opacity.40}",
3735
+ "$description": "Disabled controls."
3736
+ }
3737
+ },
3738
+ "color": {
3739
+ "surface": {
3740
+ "canvas": {
3741
+ "$type": "color",
3742
+ "$description": "The page background.",
3743
+ "$value": "{theme.color.surface.canvas}"
3744
+ },
3745
+ "default": {
3746
+ "$type": "color",
3747
+ "$description": "Cards, inputs and tables.",
3748
+ "$value": "{theme.color.surface.default}"
3749
+ },
3750
+ "raised": {
3751
+ "$type": "color",
3752
+ "$description": "Menus, dialogs, toasts.",
3753
+ "$value": "{theme.color.surface.raised}"
3754
+ },
3755
+ "sunken": {
3756
+ "$type": "color",
3757
+ "$description": "Table headers and wells.",
3758
+ "$value": "{theme.color.surface.sunken}"
3759
+ },
3760
+ "selected": {
3761
+ "$type": "color",
3762
+ "$description": "A selected row or item.",
3763
+ "$value": "{theme.color.surface.selected}"
3764
+ },
3765
+ "inverse": {
3766
+ "$type": "color",
3767
+ "$description": "Tooltips.",
3768
+ "$value": "{theme.color.surface.inverse}"
3769
+ },
3770
+ "scrim": {
3771
+ "$type": "color",
3772
+ "$description": "Dims the page behind a dialog.",
3773
+ "$value": "{theme.color.surface.scrim}"
3774
+ }
3775
+ },
3776
+ "text": {
3777
+ "primary": {
3778
+ "$type": "color",
3779
+ "$description": "Main text.",
3780
+ "$value": "{theme.color.text.primary}"
3781
+ },
3782
+ "secondary": {
3783
+ "$type": "color",
3784
+ "$description": "Supporting text; passes AA.",
3785
+ "$value": "{theme.color.text.secondary}"
3786
+ },
3787
+ "muted": {
3788
+ "$type": "color",
3789
+ "$description": "Hints and placeholders.",
3790
+ "$value": "{theme.color.text.muted}"
3791
+ },
3792
+ "inverse": {
3793
+ "$type": "color",
3794
+ "$description": "Text on inverse surfaces.",
3795
+ "$value": "{theme.color.text.inverse}"
3796
+ },
3797
+ "on-action": {
3798
+ "$type": "color",
3799
+ "$description": "Text on the primary action.",
3800
+ "$value": "{theme.color.text.on-action}"
3801
+ },
3802
+ "link": {
3803
+ "$type": "color",
3804
+ "$description": "Links.",
3805
+ "$value": "{theme.color.text.link}"
3806
+ }
3807
+ },
3808
+ "border": {
3809
+ "default": {
3810
+ "$type": "color",
3811
+ "$description": "Row lines and card borders.",
3812
+ "$value": "{theme.color.border.default}"
3813
+ },
3814
+ "strong": {
3815
+ "$type": "color",
3816
+ "$description": "Input and secondary button borders.",
3817
+ "$value": "{theme.color.border.strong}"
3818
+ },
3819
+ "focus": {
3820
+ "$type": "color",
3821
+ "$description": "The keyboard focus ring.",
3822
+ "$value": "{theme.color.border.focus}"
3823
+ }
3824
+ },
3825
+ "action": {
3826
+ "primary": {
3827
+ "@": {
3828
+ "$type": "color",
3829
+ "$description": "The primary action.",
3830
+ "$value": "{theme.color.action.primary.@}"
3831
+ },
3832
+ "hover": {
3833
+ "$type": "color",
3834
+ "$description": "Primary action on hover.",
3835
+ "$value": "{theme.color.action.primary.hover}"
3836
+ }
3837
+ },
3838
+ "secondary": {
3839
+ "@": {
3840
+ "$type": "color",
3841
+ "$description": "Secondary action fill.",
3842
+ "$value": "{theme.color.action.secondary.@}"
3843
+ },
3844
+ "hover": {
3845
+ "$type": "color",
3846
+ "$description": "Secondary action on hover.",
3847
+ "$value": "{theme.color.action.secondary.hover}"
3848
+ }
3849
+ }
3850
+ },
3851
+ "status": {
3852
+ "info": {
3853
+ "@": {
3854
+ "$type": "color",
3855
+ "$description": "Info text and icons: neutral news, no action needed.",
3856
+ "$value": "{theme.color.status.info.@}"
3857
+ },
3858
+ "subtle": {
3859
+ "$type": "color",
3860
+ "$description": "Info badge and banner fill.",
3861
+ "$value": "{theme.color.status.info.subtle}"
3862
+ }
3863
+ },
3864
+ "success": {
3865
+ "@": {
3866
+ "$type": "color",
3867
+ "$description": "Success text and icons.",
3868
+ "$value": "{theme.color.status.success.@}"
3869
+ },
3870
+ "subtle": {
3871
+ "$type": "color",
3872
+ "$description": "Success badge fill.",
3873
+ "$value": "{theme.color.status.success.subtle}"
3874
+ }
3875
+ },
3876
+ "warning": {
3877
+ "@": {
3878
+ "$type": "color",
3879
+ "$description": "Warning text and icons.",
3880
+ "$value": "{theme.color.status.warning.@}"
3881
+ },
3882
+ "subtle": {
3883
+ "$type": "color",
3884
+ "$description": "Warning badge fill.",
3885
+ "$value": "{theme.color.status.warning.subtle}"
3886
+ }
3887
+ },
3888
+ "danger": {
3889
+ "@": {
3890
+ "$type": "color",
3891
+ "$description": "Danger text and icons.",
3892
+ "$value": "{theme.color.status.danger.@}"
3893
+ },
3894
+ "subtle": {
3895
+ "$type": "color",
3896
+ "$description": "Danger badge fill.",
3897
+ "$value": "{theme.color.status.danger.subtle}"
3898
+ }
3899
+ }
3900
+ },
3901
+ "category": {
3902
+ "$description": "Identity colours for tags, labels and chart series. They tell items apart and carry no meaning.",
3903
+ "1": {
3904
+ "@": {
3905
+ "$type": "color",
3906
+ "$description": "Category 1: chart series, tag dots and icons. Tag text uses color.text.primary.",
3907
+ "$value": "{theme.color.category.1.@}"
3908
+ },
3909
+ "subtle": {
3910
+ "$type": "color",
3911
+ "$description": "Category 1: tag fill.",
3912
+ "$value": "{theme.color.category.1.subtle}"
3913
+ }
3914
+ },
3915
+ "2": {
3916
+ "@": {
3917
+ "$type": "color",
3918
+ "$description": "Category 2: chart series, tag dots and icons. Tag text uses color.text.primary.",
3919
+ "$value": "{theme.color.category.2.@}"
3920
+ },
3921
+ "subtle": {
3922
+ "$type": "color",
3923
+ "$description": "Category 2: tag fill.",
3924
+ "$value": "{theme.color.category.2.subtle}"
3925
+ }
3926
+ },
3927
+ "3": {
3928
+ "@": {
3929
+ "$type": "color",
3930
+ "$description": "Category 3: chart series, tag dots and icons. Tag text uses color.text.primary.",
3931
+ "$value": "{theme.color.category.3.@}"
3932
+ },
3933
+ "subtle": {
3934
+ "$type": "color",
3935
+ "$description": "Category 3: tag fill.",
3936
+ "$value": "{theme.color.category.3.subtle}"
3937
+ }
3938
+ },
3939
+ "4": {
3940
+ "@": {
3941
+ "$type": "color",
3942
+ "$description": "Category 4: chart series, tag dots and icons. Tag text uses color.text.primary.",
3943
+ "$value": "{theme.color.category.4.@}"
3944
+ },
3945
+ "subtle": {
3946
+ "$type": "color",
3947
+ "$description": "Category 4: tag fill.",
3948
+ "$value": "{theme.color.category.4.subtle}"
3949
+ }
3950
+ },
3951
+ "5": {
3952
+ "@": {
3953
+ "$type": "color",
3954
+ "$description": "Category 5: chart series, tag dots and icons. Tag text uses color.text.primary.",
3955
+ "$value": "{theme.color.category.5.@}"
3956
+ },
3957
+ "subtle": {
3958
+ "$type": "color",
3959
+ "$description": "Category 5: tag fill.",
3960
+ "$value": "{theme.color.category.5.subtle}"
3961
+ }
3962
+ }
3963
+ },
3964
+ "disabled": {
3965
+ "$description": "The shared look of controls that cannot be used right now.",
3966
+ "text": {
3967
+ "$type": "color",
3968
+ "$description": "Text and icons of a disabled control.",
3969
+ "$value": "{theme.color.disabled.text}"
3970
+ },
3971
+ "surface": {
3972
+ "$type": "color",
3973
+ "$description": "Fill of a disabled control.",
3974
+ "$value": "{theme.color.disabled.surface}"
3975
+ },
3976
+ "border": {
3977
+ "$type": "color",
3978
+ "$description": "Border of a disabled control.",
3979
+ "$value": "{theme.color.disabled.border}"
3980
+ }
3981
+ }
3982
+ },
3983
+ "elevation": {
3984
+ "card": {
3985
+ "$type": "shadow",
3986
+ "$value": "{theme.elevation.card}"
3987
+ },
3988
+ "overlay": {
3989
+ "$type": "shadow",
3990
+ "$value": "{theme.elevation.overlay}"
3991
+ }
3992
+ }
3993
+ },
3994
+ "component": {
3995
+ "button": {
3996
+ "primary": {
3997
+ "background": {
3998
+ "@": {
3999
+ "$value": "{color.action.primary.@}",
4000
+ "$description": "Primary button fill."
4001
+ },
4002
+ "hover": {
4003
+ "$value": "{color.action.primary.hover}",
4004
+ "$description": "Primary button fill on hover."
4005
+ }
4006
+ },
4007
+ "label": {
4008
+ "$value": "{color.text.on-action}",
4009
+ "$description": "Primary button label color."
4010
+ }
4011
+ },
4012
+ "secondary": {
4013
+ "background": {
4014
+ "@": {
4015
+ "$value": "{color.action.secondary.@}",
4016
+ "$description": "Secondary button fill."
4017
+ },
4018
+ "hover": {
4019
+ "$value": "{color.action.secondary.hover}",
4020
+ "$description": "Secondary button fill on hover."
4021
+ }
4022
+ },
4023
+ "label": {
4024
+ "$value": "{color.text.primary}",
4025
+ "$description": "Secondary button label color."
4026
+ },
4027
+ "border": {
4028
+ "$value": "{color.border.strong}",
4029
+ "$description": "Secondary button border."
4030
+ }
4031
+ },
4032
+ "ghost": {
4033
+ "background-hover": {
4034
+ "$value": "{color.surface.sunken}",
4035
+ "$description": "Ghost button fill on hover."
4036
+ },
4037
+ "label": {
4038
+ "$value": "{color.text.link}",
4039
+ "$description": "Ghost button label color."
4040
+ }
4041
+ },
4042
+ "height": {
4043
+ "$value": "{size.control.default}",
4044
+ "$description": "Button height."
4045
+ },
4046
+ "padding-x": {
4047
+ "$value": "{space.inset.control-x}",
4048
+ "$description": "Horizontal padding inside a button."
4049
+ },
4050
+ "radius": {
4051
+ "$value": "{radius.control}",
4052
+ "$description": "Button corner radius."
4053
+ },
4054
+ "font-size": {
4055
+ "$value": "{type.label.font-size}",
4056
+ "$description": "Button label size."
4057
+ },
4058
+ "font-weight": {
4059
+ "$value": "{type.label.font-weight}",
4060
+ "$description": "Button label weight."
4061
+ },
4062
+ "focus-ring": {
4063
+ "$value": "{color.border.focus}",
4064
+ "$description": "Focus ring color on any button."
4065
+ },
4066
+ "icon-size": {
4067
+ "$value": "{size.icon}",
4068
+ "$description": "Size of an icon inside a button."
4069
+ },
4070
+ "disabled": {
4071
+ "background": {
4072
+ "$value": "{color.disabled.surface}",
4073
+ "$description": "Fill of a disabled button."
4074
+ },
4075
+ "label": {
4076
+ "$value": "{color.disabled.text}",
4077
+ "$description": "Label of a disabled button."
4078
+ },
4079
+ "border": {
4080
+ "$value": "{color.disabled.border}",
4081
+ "$description": "Border of a disabled secondary button."
4082
+ }
4083
+ }
4084
+ },
4085
+ "input": {
4086
+ "background": {
4087
+ "$value": "{color.surface.default}",
4088
+ "$description": "Input fill."
4089
+ },
4090
+ "border": {
4091
+ "@": {
4092
+ "$value": "{color.border.strong}",
4093
+ "$description": "Input border at rest."
4094
+ },
4095
+ "focus": {
4096
+ "$value": "{color.border.focus}",
4097
+ "$description": "Input border when focused."
4098
+ }
4099
+ },
4100
+ "text": {
4101
+ "$value": "{color.text.primary}",
4102
+ "$description": "Typed text color."
4103
+ },
4104
+ "placeholder": {
4105
+ "$value": "{color.text.muted}",
4106
+ "$description": "Placeholder text color."
4107
+ },
4108
+ "height": {
4109
+ "$value": "{size.control.default}",
4110
+ "$description": "Input height."
4111
+ },
4112
+ "padding-x": {
4113
+ "$value": "{space.inset.control-x}",
4114
+ "$description": "Horizontal padding inside an input."
4115
+ },
4116
+ "radius": {
4117
+ "$value": "{radius.control}",
4118
+ "$description": "Input corner radius."
4119
+ },
4120
+ "font-size": {
4121
+ "$value": "{type.body.font-size}",
4122
+ "$description": "Typed text size."
4123
+ },
4124
+ "disabled": {
4125
+ "background": {
4126
+ "$value": "{color.disabled.surface}",
4127
+ "$description": "Fill of a disabled input."
4128
+ },
4129
+ "border": {
4130
+ "$value": "{color.disabled.border}",
4131
+ "$description": "Border of a disabled input."
4132
+ },
4133
+ "text": {
4134
+ "$value": "{color.disabled.text}",
4135
+ "$description": "Text in a disabled input."
4136
+ }
4137
+ }
4138
+ },
4139
+ "control": {
4140
+ "checked": {
4141
+ "$value": "{color.action.primary.@}",
4142
+ "$description": "Fill of a checked checkbox or an on switch."
4143
+ },
4144
+ "track": {
4145
+ "$value": "{color.border.strong}",
4146
+ "$description": "Track of an off switch."
4147
+ },
4148
+ "thumb": {
4149
+ "$value": "{color.surface.default}",
4150
+ "$description": "Switch thumb and checkmark color."
4151
+ },
4152
+ "radius": {
4153
+ "$value": "{radius.badge}",
4154
+ "$description": "Checkbox corner radius."
4155
+ }
4156
+ },
4157
+ "badge": {
4158
+ "radius": {
4159
+ "$value": "{radius.badge}",
4160
+ "$description": "Badge corner radius."
4161
+ },
4162
+ "padding-x": {
4163
+ "$value": "{space.gap.tight}",
4164
+ "$description": "Horizontal padding inside a badge."
4165
+ },
4166
+ "font-size": {
4167
+ "$value": "{type.caption.font-size}",
4168
+ "$description": "Badge label size."
4169
+ },
4170
+ "neutral": {
4171
+ "background": {
4172
+ "$value": "{color.surface.sunken}",
4173
+ "$description": "Neutral badge fill."
4174
+ },
4175
+ "label": {
4176
+ "$value": "{color.text.secondary}",
4177
+ "$description": "Neutral badge label."
4178
+ }
4179
+ },
4180
+ "success": {
4181
+ "background": {
4182
+ "$value": "{color.status.success.subtle}",
4183
+ "$description": "Success badge fill."
4184
+ },
4185
+ "label": {
4186
+ "$value": "{color.status.success.@}",
4187
+ "$description": "Success badge label."
4188
+ }
4189
+ },
4190
+ "warning": {
4191
+ "background": {
4192
+ "$value": "{color.status.warning.subtle}",
4193
+ "$description": "Warning badge fill."
4194
+ },
4195
+ "label": {
4196
+ "$value": "{color.status.warning.@}",
4197
+ "$description": "Warning badge label."
4198
+ }
4199
+ },
4200
+ "danger": {
4201
+ "background": {
4202
+ "$value": "{color.status.danger.subtle}",
4203
+ "$description": "Danger badge fill."
4204
+ },
4205
+ "label": {
4206
+ "$value": "{color.status.danger.@}",
4207
+ "$description": "Danger badge label."
4208
+ }
4209
+ },
4210
+ "info": {
4211
+ "background": {
4212
+ "$value": "{color.status.info.subtle}",
4213
+ "$description": "Info badge fill."
4214
+ },
4215
+ "label": {
4216
+ "$value": "{color.status.info.@}",
4217
+ "$description": "Info badge label."
4218
+ }
4219
+ }
4220
+ },
4221
+ "card": {
4222
+ "background": {
4223
+ "$value": "{color.surface.default}",
4224
+ "$description": "Card fill."
4225
+ },
4226
+ "border": {
4227
+ "$value": "{color.border.default}",
4228
+ "$description": "Card border."
4229
+ },
4230
+ "radius": {
4231
+ "$value": "{radius.container}",
4232
+ "$description": "Card corner radius."
4233
+ },
4234
+ "padding": {
4235
+ "$value": "{space.inset.container}",
4236
+ "$description": "Padding inside a card."
4237
+ },
4238
+ "shadow": {
4239
+ "$value": "{elevation.card}",
4240
+ "$description": "Card shadow."
4241
+ }
4242
+ },
4243
+ "table": {
4244
+ "header-background": {
4245
+ "$value": "{color.surface.sunken}",
4246
+ "$description": "Header row fill."
4247
+ },
4248
+ "row-height": {
4249
+ "$value": "{size.row}",
4250
+ "$description": "Height of one data row."
4251
+ },
4252
+ "cell-padding-x": {
4253
+ "$value": "{space.inset.cell-x}",
4254
+ "$description": "Horizontal padding inside a cell."
4255
+ },
4256
+ "row-border": {
4257
+ "$value": "{color.border.default}",
4258
+ "$description": "Line between rows."
4259
+ },
4260
+ "row-selected": {
4261
+ "$value": "{color.surface.selected}",
4262
+ "$description": "Fill of a selected row."
4263
+ },
4264
+ "font-size": {
4265
+ "$value": "{type.data.font-size}",
4266
+ "$description": "Cell text size."
4267
+ }
4268
+ },
4269
+ "tabs": {
4270
+ "indicator": {
4271
+ "$value": "{color.action.primary.@}",
4272
+ "$description": "Active tab indicator."
4273
+ },
4274
+ "label": {
4275
+ "@": {
4276
+ "$value": "{color.text.secondary}",
4277
+ "$description": "Inactive tab label."
4278
+ },
4279
+ "active": {
4280
+ "$value": "{color.text.primary}",
4281
+ "$description": "Active tab label."
4282
+ }
4283
+ }
4284
+ },
4285
+ "overlay": {
4286
+ "background": {
4287
+ "$value": "{color.surface.raised}",
4288
+ "$description": "Fill of a dialog, menu or toast."
4289
+ },
4290
+ "radius": {
4291
+ "$value": "{radius.container}",
4292
+ "$description": "Corner radius of overlays."
4293
+ },
4294
+ "shadow": {
4295
+ "$value": "{elevation.overlay}",
4296
+ "$description": "Shadow of overlays."
4297
+ },
4298
+ "scrim": {
4299
+ "$value": "{color.surface.scrim}",
4300
+ "$description": "Color that dims the page behind a dialog."
4301
+ },
4302
+ "item-height": {
4303
+ "$value": "{size.control.default}",
4304
+ "$description": "Height of a menu item."
4305
+ }
4306
+ },
4307
+ "tooltip": {
4308
+ "background": {
4309
+ "$value": "{color.surface.inverse}",
4310
+ "$description": "Tooltip fill."
4311
+ },
4312
+ "label": {
4313
+ "$value": "{color.text.inverse}",
4314
+ "$description": "Tooltip text."
4315
+ }
4316
+ },
4317
+ "transition": {
4318
+ "duration": {
4319
+ "$value": "{motion.duration.feedback}",
4320
+ "$description": "Duration of feedback transitions."
4321
+ },
4322
+ "easing": {
4323
+ "$value": "{motion.easing.standard}",
4324
+ "$description": "Easing of feedback transitions."
4325
+ }
4326
+ }
4327
+ },
4328
+ "content": {
4329
+ "$description": "Voice tokens: the words components use for common actions. Text, not CSS.",
4330
+ "action": {
4331
+ "commit": {
4332
+ "$type": "string",
4333
+ "$value": "Save",
4334
+ "$description": "The label of the action that completes a task."
4335
+ },
4336
+ "cancel": {
4337
+ "$type": "string",
4338
+ "$value": "Cancel",
4339
+ "$description": "The label of the way out next to the main action."
4340
+ },
4341
+ "destroy": {
4342
+ "$type": "string",
4343
+ "$value": "Remove",
4344
+ "$description": "The label of an action that deletes data."
4345
+ },
4346
+ "retry": {
4347
+ "$type": "string",
4348
+ "$value": "Try again",
4349
+ "$description": "The label that repeats a failed action."
4350
+ },
4351
+ "empty-action": {
4352
+ "$type": "string",
4353
+ "$value": "Get started",
4354
+ "$description": "The label of the action in an empty state."
4355
+ }
4356
+ }
4357
+ }
4358
+ }
4359
+ }