@exponential-at/ui 0.0.0-stage → 0.1.0

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 (251) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +360 -2
  4. package/catalog/a11y.json +668 -0
  5. package/catalog/basic-map.json +104 -0
  6. package/catalog/code.json +58 -0
  7. package/catalog/core.catalog.json +4752 -0
  8. package/catalog/core.schema.json +22667 -0
  9. package/catalog/host.json +64 -0
  10. package/catalog/layout.json +20 -0
  11. package/catalog/limits.json +9 -0
  12. package/catalog/locale.json +48 -0
  13. package/catalog/macros.json +3417 -0
  14. package/catalog/recipes.json +61 -0
  15. package/catalog/strings.json +72 -0
  16. package/catalog/style.json +128 -0
  17. package/catalog/theme.schema.json +42543 -0
  18. package/catalog/tokens.json +47 -0
  19. package/conformance/README.md +217 -0
  20. package/conformance/baseline.ts +101 -0
  21. package/conformance/browser-page.ts +146 -0
  22. package/conformance/browser-suites.ts +683 -0
  23. package/conformance/compare.ts +201 -0
  24. package/conformance/dom.ts +96 -0
  25. package/conformance/dump.ts +163 -0
  26. package/conformance/fonts.json +154 -0
  27. package/conformance/manifest.json +224 -0
  28. package/conformance/parity-compare.ts +191 -0
  29. package/conformance/parity-report.schema.json +73 -0
  30. package/conformance/parity.ts +412 -0
  31. package/conformance/pixel.ts +177 -0
  32. package/conformance/primitives-page.ts +49 -0
  33. package/conformance/report.schema.json +66 -0
  34. package/conformance/run.ts +118 -0
  35. package/dist/chunks/index-98npjvsd.js +3940 -0
  36. package/dist/chunks/index-98npjvsd.js.map +27 -0
  37. package/dist/chunks/index-gwkt14w3.js +7314 -0
  38. package/dist/chunks/index-gwkt14w3.js.map +10 -0
  39. package/dist/chunks/index-njt7yzzm.js +134 -0
  40. package/dist/chunks/index-njt7yzzm.js.map +9 -0
  41. package/dist/chunks/index-we7va6v6.js +7984 -0
  42. package/dist/chunks/index-we7va6v6.js.map +15 -0
  43. package/dist/chunks/index-xrm6f7wc.js +2563 -0
  44. package/dist/chunks/index-xrm6f7wc.js.map +10 -0
  45. package/dist/conformance.js +182749 -0
  46. package/dist/conformance.js.map +10 -0
  47. package/dist/entries/prompt.js +251 -0
  48. package/dist/entries/prompt.js.map +11 -0
  49. package/dist/entries/schema.js +1725 -0
  50. package/dist/entries/schema.js.map +11 -0
  51. package/dist/host/index.js +122 -0
  52. package/dist/host/index.js.map +9 -0
  53. package/dist/index.js +3213 -0
  54. package/dist/index.js.map +27 -0
  55. package/dist/types/src/a11y.d.ts +21 -0
  56. package/dist/types/src/animation.d.ts +76 -0
  57. package/dist/types/src/basic-map.d.ts +38 -0
  58. package/dist/types/src/builder.d.ts +50 -0
  59. package/dist/types/src/catalog.d.ts +54 -0
  60. package/dist/types/src/catalog.described.d.ts +33 -0
  61. package/dist/types/src/catalog.generated.d.ts +829 -0
  62. package/dist/types/src/chart.d.ts +46 -0
  63. package/dist/types/src/code.d.ts +44 -0
  64. package/dist/types/src/color.d.ts +20 -0
  65. package/dist/types/src/conformance.d.ts +39 -0
  66. package/dist/types/src/connector/app.d.ts +14 -0
  67. package/dist/types/src/connector/connector.d.ts +77 -0
  68. package/dist/types/src/connector/index.d.ts +4 -0
  69. package/dist/types/src/css.d.ts +29 -0
  70. package/dist/types/src/define.d.ts +66 -0
  71. package/dist/types/src/direction.d.ts +16 -0
  72. package/dist/types/src/dynamic.d.ts +159 -0
  73. package/dist/types/src/entries/prompt.d.ts +11 -0
  74. package/dist/types/src/entries/schema.d.ts +8 -0
  75. package/dist/types/src/expr.d.ts +71 -0
  76. package/dist/types/src/extension.d.ts +4 -0
  77. package/dist/types/src/format.d.ts +112 -0
  78. package/dist/types/src/geometry.d.ts +40 -0
  79. package/dist/types/src/host/contract.d.ts +188 -0
  80. package/dist/types/src/host/decoders.d.ts +61 -0
  81. package/dist/types/src/host/index.d.ts +11 -0
  82. package/dist/types/src/host/package.d.ts +58 -0
  83. package/dist/types/src/host/policy.d.ts +105 -0
  84. package/dist/types/src/host/router.d.ts +34 -0
  85. package/dist/types/src/host/runtime.d.ts +205 -0
  86. package/dist/types/src/host/sources.d.ts +15 -0
  87. package/dist/types/src/host/transports.d.ts +109 -0
  88. package/dist/types/src/index.d.ts +63 -0
  89. package/dist/types/src/layout.d.ts +20 -0
  90. package/dist/types/src/limits.d.ts +21 -0
  91. package/dist/types/src/list.d.ts +133 -0
  92. package/dist/types/src/locale.d.ts +22 -0
  93. package/dist/types/src/macros.d.ts +29 -0
  94. package/dist/types/src/overlay.d.ts +27 -0
  95. package/dist/types/src/prompt.d.ts +44 -0
  96. package/dist/types/src/recipes.d.ts +17 -0
  97. package/dist/types/src/reducer.d.ts +41 -0
  98. package/dist/types/src/resizable.d.ts +38 -0
  99. package/dist/types/src/schema.d.ts +7 -0
  100. package/dist/types/src/strings.d.ts +13 -0
  101. package/dist/types/src/style.d.ts +201 -0
  102. package/dist/types/src/test-preload.d.ts +1 -0
  103. package/dist/types/src/text-shimmer.d.ts +24 -0
  104. package/dist/types/src/theme-types.d.ts +162 -0
  105. package/dist/types/src/theme.d.ts +73 -0
  106. package/dist/types/src/themes.d.ts +22 -0
  107. package/dist/types/src/tree-guides.d.ts +17 -0
  108. package/dist/types/src/types.d.ts +314 -0
  109. package/dist/types/src/validate.d.ts +31 -0
  110. package/dist/types/src/web/base-css.d.ts +1 -0
  111. package/dist/types/src/web/box-css.d.ts +55 -0
  112. package/dist/types/src/web/coerce.d.ts +32 -0
  113. package/dist/types/src/web/data.d.ts +105 -0
  114. package/dist/types/src/web/dates.d.ts +12 -0
  115. package/dist/types/src/web/form.d.ts +44 -0
  116. package/dist/types/src/web/host-types.d.ts +119 -0
  117. package/dist/types/src/web/index.d.ts +28 -0
  118. package/dist/types/src/web/inputs.d.ts +55 -0
  119. package/dist/types/src/web/list.d.ts +13 -0
  120. package/dist/types/src/web/listbox.d.ts +14 -0
  121. package/dist/types/src/web/markdown.d.ts +96 -0
  122. package/dist/types/src/web/media.d.ts +62 -0
  123. package/dist/types/src/web/parts.d.ts +4 -0
  124. package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
  125. package/dist/types/src/web/primitives/alert.d.ts +9 -0
  126. package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
  127. package/dist/types/src/web/primitives/avatar.d.ts +13 -0
  128. package/dist/types/src/web/primitives/badge.d.ts +10 -0
  129. package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
  130. package/dist/types/src/web/primitives/button.d.ts +6 -0
  131. package/dist/types/src/web/primitives/calendar.d.ts +43 -0
  132. package/dist/types/src/web/primitives/card.d.ts +9 -0
  133. package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
  134. package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
  135. package/dist/types/src/web/primitives/cn.d.ts +3 -0
  136. package/dist/types/src/web/primitives/code-block.d.ts +24 -0
  137. package/dist/types/src/web/primitives/command.d.ts +134 -0
  138. package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
  139. package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
  140. package/dist/types/src/web/primitives/dialog.d.ts +24 -0
  141. package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
  142. package/dist/types/src/web/primitives/dock.d.ts +42 -0
  143. package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
  144. package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
  145. package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
  146. package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
  147. package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
  148. package/dist/types/src/web/primitives/index.d.ts +48 -0
  149. package/dist/types/src/web/primitives/input.d.ts +5 -0
  150. package/dist/types/src/web/primitives/kbd.d.ts +4 -0
  151. package/dist/types/src/web/primitives/label.d.ts +3 -0
  152. package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
  153. package/dist/types/src/web/primitives/meter.d.ts +21 -0
  154. package/dist/types/src/web/primitives/popover.d.ts +3 -0
  155. package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
  156. package/dist/types/src/web/primitives/progress.d.ts +8 -0
  157. package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
  158. package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
  159. package/dist/types/src/web/primitives/select.d.ts +47 -0
  160. package/dist/types/src/web/primitives/separator.d.ts +3 -0
  161. package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
  162. package/dist/types/src/web/primitives/sheet.d.ts +20 -0
  163. package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
  164. package/dist/types/src/web/primitives/spinner.d.ts +3 -0
  165. package/dist/types/src/web/primitives/switch.d.ts +4 -0
  166. package/dist/types/src/web/primitives/table.d.ts +11 -0
  167. package/dist/types/src/web/primitives/tabs.d.ts +13 -0
  168. package/dist/types/src/web/primitives/textarea.d.ts +3 -0
  169. package/dist/types/src/web/primitives/toast.d.ts +163 -0
  170. package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
  171. package/dist/types/src/web/primitives/truncate.d.ts +7 -0
  172. package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
  173. package/dist/types/src/web/share.d.ts +6 -0
  174. package/dist/types/src/web/table.d.ts +20 -0
  175. package/dist/types/src/web/theme-css.d.ts +69 -0
  176. package/dist/types/src/web/urls.d.ts +21 -0
  177. package/dist/web/index.js +2303 -0
  178. package/dist/web/index.js.map +26 -0
  179. package/dist/web/primitives/index.js +1450 -0
  180. package/dist/web/primitives/index.js.map +57 -0
  181. package/docs/components.generated.json +6238 -0
  182. package/docs/round-1-contract.md +679 -0
  183. package/docs/round-2-contract.md +476 -0
  184. package/docs/round-3-contract.md +174 -0
  185. package/docs/themes.generated.json +3503 -0
  186. package/fixtures/animations.json +2890 -0
  187. package/fixtures/bench-list.json +58 -0
  188. package/fixtures/bind-time.json +30664 -0
  189. package/fixtures/catalog-basic-map.json +1692 -0
  190. package/fixtures/catalog-components.json +9323 -0
  191. package/fixtures/catalog-extension.json +620 -0
  192. package/fixtures/catalog-macros.json +36370 -0
  193. package/fixtures/code-tokens.json +1993 -0
  194. package/fixtures/conformance-baseline.json +55544 -0
  195. package/fixtures/conformance-cases.json +49 -0
  196. package/fixtures/conformance-known.json +2123 -0
  197. package/fixtures/control-geometry.json +4200 -0
  198. package/fixtures/dashboard.data.json +74 -0
  199. package/fixtures/dashboard.json +752 -0
  200. package/fixtures/demo-surface.json +47 -0
  201. package/fixtures/format.json +870 -0
  202. package/fixtures/host-policy.json +1067 -0
  203. package/fixtures/host-router.json +1152 -0
  204. package/fixtures/host-transport.json +590 -0
  205. package/fixtures/interactions-round1.json +773 -0
  206. package/fixtures/kitchen-sink.expanded.json +10844 -0
  207. package/fixtures/kitchen-sink.json +3049 -0
  208. package/fixtures/layout-geometry-round1.json +7278 -0
  209. package/fixtures/layout-geometry.json +2072 -0
  210. package/fixtures/overlay-geometry.json +272 -0
  211. package/fixtures/primitive-specimens.json +58 -0
  212. package/fixtures/prompt-budget.json +33 -0
  213. package/fixtures/resizable.json +714 -0
  214. package/fixtures/round4-contract.json +2985 -0
  215. package/fixtures/specimens.json +9832 -0
  216. package/fixtures/style-conditions.json +336 -0
  217. package/fixtures/template-items.json +2215 -0
  218. package/fixtures/text-direction.json +309 -0
  219. package/fixtures/text-shimmer.json +96 -0
  220. package/fixtures/theme-extends.json +573 -0
  221. package/fixtures/theme-invalid.json +1296 -0
  222. package/fixtures/theme-recipes.json +58600 -0
  223. package/fixtures/theme-resolved.json +23949 -0
  224. package/fixtures/toast-stack.json +215 -0
  225. package/fixtures/tree-guides.json +224 -0
  226. package/fixtures/virtual-list.json +733 -0
  227. package/generated/ExponentialUICatalog.generated.kt +67 -0
  228. package/generated/ExponentialUICatalog.generated.swift +67 -0
  229. package/generated/ExponentialUIThemes.generated.kt +23 -0
  230. package/generated/ExponentialUIThemes.generated.swift +23 -0
  231. package/generated/catalog.descriptions.generated.rs +6 -0
  232. package/generated/catalog.generated.rs +80 -0
  233. package/generated/catalog.themes.generated.rs +34 -0
  234. package/generated/core.descriptions.json +2505 -0
  235. package/generated/core.runtime.json +3609 -0
  236. package/package.json +87 -4
  237. package/themes/exponential.recipes.json +49 -0
  238. package/themes/exponential.theme.json +755 -0
  239. package/themes/neutral.theme.json +5676 -0
  240. package/themes/orange.theme.json +43 -0
  241. package/themes/playful.theme.json +219 -0
  242. package/vendor/a2ui/LICENSE.txt +203 -0
  243. package/vendor/a2ui/README.md +27 -0
  244. package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
  245. package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
  246. package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
  247. package/vendor/a2ui/v0_9/client_to_server.json +104 -0
  248. package/vendor/a2ui/v0_9/common_types.json +315 -0
  249. package/vendor/a2ui/v0_9/server_to_client.json +132 -0
  250. package/vendor/json-render/LICENSE.txt +201 -0
  251. package/vendor/json-render/README.md +13 -0
@@ -0,0 +1,1296 @@
1
+ {
2
+ "$comment": "VAPP-92: themes that must FAIL to load with a readable issue list, never a crash. The generator fills `issues` from the TS validator; every renderer's loader reports the same paths (the wording may differ on a native, the paths may not). A case's `theme` is any JSON value.",
3
+ "cases": [
4
+ {
5
+ "name": "not an object",
6
+ "theme": "neutral",
7
+ "issues": [
8
+ {
9
+ "path": "theme",
10
+ "message": "expected a theme object {id, name, modes, tokens, recipes}"
11
+ }
12
+ ]
13
+ },
14
+ {
15
+ "name": "missing id and name",
16
+ "theme": {
17
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
18
+ "modes": {}
19
+ },
20
+ "issues": [
21
+ {
22
+ "path": "id",
23
+ "message": "expected a kebab-case id"
24
+ },
25
+ {
26
+ "path": "name",
27
+ "message": "expected a name"
28
+ }
29
+ ]
30
+ },
31
+ {
32
+ "name": "Round 4: no $schema",
33
+ "theme": {
34
+ "id": "t",
35
+ "name": "T",
36
+ "extends": "neutral"
37
+ },
38
+ "issues": [
39
+ {
40
+ "path": "$schema",
41
+ "message": "expected \"https://ui.exponential.at/schemas/theme/v1.json\""
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ "name": "Round 4: another $schema",
47
+ "theme": {
48
+ "$schema": "https://ui.exponential.at/schemas/theme/v0.json",
49
+ "id": "t",
50
+ "name": "T",
51
+ "extends": "neutral"
52
+ },
53
+ "issues": [
54
+ {
55
+ "path": "$schema",
56
+ "message": "expected \"https://ui.exponential.at/schemas/theme/v1.json\""
57
+ }
58
+ ]
59
+ },
60
+ {
61
+ "name": "unknown token name",
62
+ "theme": {
63
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
64
+ "id": "t",
65
+ "name": "T",
66
+ "extends": "neutral",
67
+ "tokens": {
68
+ "spacing": {
69
+ "huge": 64
70
+ }
71
+ }
72
+ },
73
+ "issues": [
74
+ {
75
+ "path": "tokens.spacing.huge",
76
+ "message": "unknown token; known: none|xxs|xs|sm|md|lg|xl|xl2|xl3"
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ "name": "unknown token group",
82
+ "theme": {
83
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
84
+ "id": "t",
85
+ "name": "T",
86
+ "extends": "neutral",
87
+ "tokens": {
88
+ "elevation": {
89
+ "sm": 1
90
+ }
91
+ }
92
+ },
93
+ "issues": [
94
+ {
95
+ "path": "tokens.elevation",
96
+ "message": "unknown token group; known: spacing|radius|control|opacity|border|motion|breakpoint|ease|density|blur|scale|type"
97
+ }
98
+ ]
99
+ },
100
+ {
101
+ "name": "colour not hex",
102
+ "theme": {
103
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
104
+ "id": "t",
105
+ "name": "T",
106
+ "extends": "neutral",
107
+ "modes": {
108
+ "light": {
109
+ "color": {
110
+ "primary": "oklch(0.5 0.2 260)"
111
+ }
112
+ }
113
+ }
114
+ },
115
+ "issues": [
116
+ {
117
+ "path": "modes.light.color.primary",
118
+ "message": "expected #rrggbb or #rrggbbaa (lowercase); the builder converts oklch/hsl on import"
119
+ }
120
+ ]
121
+ },
122
+ {
123
+ "name": "unknown mode",
124
+ "theme": {
125
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
126
+ "id": "t",
127
+ "name": "T",
128
+ "extends": "neutral",
129
+ "modes": {
130
+ "dim": {
131
+ "color": {}
132
+ }
133
+ }
134
+ },
135
+ "issues": [
136
+ {
137
+ "path": "modes.dim",
138
+ "message": "unknown mode; known: light|dark"
139
+ }
140
+ ]
141
+ },
142
+ {
143
+ "name": "colour under tokens",
144
+ "theme": {
145
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
146
+ "id": "t",
147
+ "name": "T",
148
+ "extends": "neutral",
149
+ "tokens": {
150
+ "color": {
151
+ "primary": "#000000"
152
+ }
153
+ }
154
+ },
155
+ "issues": [
156
+ {
157
+ "path": "tokens.color",
158
+ "message": "color values live under modes.light / modes.dark"
159
+ }
160
+ ]
161
+ },
162
+ {
163
+ "name": "recipe key outside the whitelist",
164
+ "theme": {
165
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
166
+ "id": "t",
167
+ "name": "T",
168
+ "extends": "neutral",
169
+ "recipes": {
170
+ "Button": {
171
+ "root": [
172
+ {
173
+ "style": {
174
+ "display": "flex",
175
+ "backgroundColor": "$color.primary"
176
+ }
177
+ }
178
+ ]
179
+ }
180
+ }
181
+ },
182
+ "issues": [
183
+ {
184
+ "path": "recipes.Button.root[0].style.display",
185
+ "message": "not a recipe key; known: backgroundColor|color|borderColor|borderWidth|borderTopWidth|borderRightWidth|borderBottomWidth|borderLeftWidth|borderRadius|borderStyle|padding|paddingHorizontal|paddingVertical|gap|width|height|minWidth|minHeight|fontSize|fontWeight|lineHeight|fontFamily|letterSpacing|textDecoration|textTransform|fontStyle|boxShadow|opacity|transition|transitionEasing|transform|backdropBlur|animation|native"
186
+ }
187
+ ]
188
+ },
189
+ {
190
+ "name": "recipe for an unknown component",
191
+ "theme": {
192
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
193
+ "id": "t",
194
+ "name": "T",
195
+ "extends": "neutral",
196
+ "recipes": {
197
+ "Gauge": {
198
+ "root": []
199
+ }
200
+ }
201
+ },
202
+ "issues": [
203
+ {
204
+ "path": "recipes.Gauge",
205
+ "message": "unknown component"
206
+ }
207
+ ]
208
+ },
209
+ {
210
+ "name": "recipe for an unknown part",
211
+ "theme": {
212
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
213
+ "id": "t",
214
+ "name": "T",
215
+ "extends": "neutral",
216
+ "recipes": {
217
+ "Switch": {
218
+ "knob": [
219
+ {
220
+ "style": {
221
+ "backgroundColor": "$color.primary"
222
+ }
223
+ }
224
+ ]
225
+ }
226
+ }
227
+ },
228
+ "issues": [
229
+ {
230
+ "path": "recipes.Switch.knob",
231
+ "message": "unknown part; known: root|track|thumb|label|description|body"
232
+ }
233
+ ]
234
+ },
235
+ {
236
+ "name": "when on a prop the part does not have",
237
+ "theme": {
238
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
239
+ "id": "t",
240
+ "name": "T",
241
+ "extends": "neutral",
242
+ "recipes": {
243
+ "Button": {
244
+ "root": [
245
+ {
246
+ "when": {
247
+ "tone": "primary"
248
+ },
249
+ "style": {
250
+ "color": "$color.primary"
251
+ }
252
+ }
253
+ ]
254
+ }
255
+ }
256
+ },
257
+ "issues": [
258
+ {
259
+ "path": "recipes.Button.root[0].when.tone",
260
+ "message": "not a recipe prop of this part; known: state|variant|size|disabled|loading"
261
+ }
262
+ ]
263
+ },
264
+ {
265
+ "name": "unknown state",
266
+ "theme": {
267
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
268
+ "id": "t",
269
+ "name": "T",
270
+ "extends": "neutral",
271
+ "recipes": {
272
+ "Button": {
273
+ "root": [
274
+ {
275
+ "when": {
276
+ "state": "active"
277
+ },
278
+ "style": {
279
+ "opacity": 0.5
280
+ }
281
+ }
282
+ ]
283
+ }
284
+ }
285
+ },
286
+ "issues": [
287
+ {
288
+ "path": "recipes.Button.root[0].when.state",
289
+ "message": "unknown state; known: hover|pressed|focus|disabled|checked|open|selected|invalid|dragover"
290
+ }
291
+ ]
292
+ },
293
+ {
294
+ "name": "token of the wrong group",
295
+ "theme": {
296
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
297
+ "id": "t",
298
+ "name": "T",
299
+ "extends": "neutral",
300
+ "recipes": {
301
+ "Button": {
302
+ "root": [
303
+ {
304
+ "style": {
305
+ "backgroundColor": "$spacing.md",
306
+ "borderRadius": "$color.primary"
307
+ }
308
+ }
309
+ ]
310
+ }
311
+ }
312
+ },
313
+ "issues": [
314
+ {
315
+ "path": "recipes.Button.root[0].style.backgroundColor",
316
+ "message": "expected a $color token, got $spacing"
317
+ },
318
+ {
319
+ "path": "recipes.Button.root[0].style.borderRadius",
320
+ "message": "expected a $radius|$spacing token, got $color"
321
+ }
322
+ ]
323
+ },
324
+ {
325
+ "name": "unknown token in a recipe",
326
+ "theme": {
327
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
328
+ "id": "t",
329
+ "name": "T",
330
+ "extends": "neutral",
331
+ "recipes": {
332
+ "Button": {
333
+ "root": [
334
+ {
335
+ "style": {
336
+ "borderRadius": "$radius.pill"
337
+ }
338
+ }
339
+ ]
340
+ }
341
+ }
342
+ },
343
+ "issues": [
344
+ {
345
+ "path": "recipes.Button.root[0].style.borderRadius",
346
+ "message": "unknown token $radius.pill; known: none|sm|md|lg|xl|xl2|xl3|full"
347
+ }
348
+ ]
349
+ },
350
+ {
351
+ "name": "extends an unknown theme",
352
+ "theme": {
353
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
354
+ "id": "t",
355
+ "name": "T",
356
+ "extends": "material"
357
+ },
358
+ "issues": [
359
+ {
360
+ "path": "extends",
361
+ "message": "unknown theme \"material\"; known: neutral|exponential|playful|orange"
362
+ }
363
+ ]
364
+ },
365
+ {
366
+ "name": "extends itself",
367
+ "theme": {
368
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
369
+ "id": "neutral",
370
+ "name": "Loop",
371
+ "extends": "neutral"
372
+ },
373
+ "issues": [
374
+ {
375
+ "path": "extends",
376
+ "message": "a theme cannot extend itself"
377
+ }
378
+ ]
379
+ },
380
+ {
381
+ "name": "a root theme missing values",
382
+ "theme": {
383
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
384
+ "id": "bare",
385
+ "name": "Bare",
386
+ "modes": {
387
+ "light": {
388
+ "color": {
389
+ "primary": "#000000"
390
+ }
391
+ }
392
+ },
393
+ "tokens": {
394
+ "spacing": {
395
+ "md": 12
396
+ }
397
+ }
398
+ },
399
+ "issues": [
400
+ {
401
+ "path": "modes.light.color.background",
402
+ "message": "missing value for $color.background"
403
+ },
404
+ {
405
+ "path": "modes.dark.color.background",
406
+ "message": "missing value for $color.background"
407
+ },
408
+ {
409
+ "path": "modes.light.color.foreground",
410
+ "message": "missing value for $color.foreground"
411
+ },
412
+ {
413
+ "path": "modes.dark.color.foreground",
414
+ "message": "missing value for $color.foreground"
415
+ },
416
+ {
417
+ "path": "modes.light.color.card",
418
+ "message": "missing value for $color.card"
419
+ },
420
+ {
421
+ "path": "modes.dark.color.card",
422
+ "message": "missing value for $color.card"
423
+ },
424
+ {
425
+ "path": "modes.light.color.cardForeground",
426
+ "message": "missing value for $color.cardForeground"
427
+ },
428
+ {
429
+ "path": "modes.dark.color.cardForeground",
430
+ "message": "missing value for $color.cardForeground"
431
+ },
432
+ {
433
+ "path": "modes.light.color.popover",
434
+ "message": "missing value for $color.popover"
435
+ },
436
+ {
437
+ "path": "modes.dark.color.popover",
438
+ "message": "missing value for $color.popover"
439
+ },
440
+ {
441
+ "path": "modes.light.color.popoverForeground",
442
+ "message": "missing value for $color.popoverForeground"
443
+ },
444
+ {
445
+ "path": "modes.dark.color.popoverForeground",
446
+ "message": "missing value for $color.popoverForeground"
447
+ },
448
+ {
449
+ "path": "modes.dark.color.primary",
450
+ "message": "missing value for $color.primary"
451
+ },
452
+ {
453
+ "path": "modes.light.color.primaryForeground",
454
+ "message": "missing value for $color.primaryForeground"
455
+ },
456
+ {
457
+ "path": "modes.dark.color.primaryForeground",
458
+ "message": "missing value for $color.primaryForeground"
459
+ },
460
+ {
461
+ "path": "modes.light.color.secondary",
462
+ "message": "missing value for $color.secondary"
463
+ },
464
+ {
465
+ "path": "modes.dark.color.secondary",
466
+ "message": "missing value for $color.secondary"
467
+ },
468
+ {
469
+ "path": "modes.light.color.secondaryForeground",
470
+ "message": "missing value for $color.secondaryForeground"
471
+ },
472
+ {
473
+ "path": "modes.dark.color.secondaryForeground",
474
+ "message": "missing value for $color.secondaryForeground"
475
+ },
476
+ {
477
+ "path": "modes.light.color.muted",
478
+ "message": "missing value for $color.muted"
479
+ },
480
+ {
481
+ "path": "modes.dark.color.muted",
482
+ "message": "missing value for $color.muted"
483
+ },
484
+ {
485
+ "path": "modes.light.color.mutedForeground",
486
+ "message": "missing value for $color.mutedForeground"
487
+ },
488
+ {
489
+ "path": "modes.dark.color.mutedForeground",
490
+ "message": "missing value for $color.mutedForeground"
491
+ },
492
+ {
493
+ "path": "modes.light.color.accent",
494
+ "message": "missing value for $color.accent"
495
+ },
496
+ {
497
+ "path": "modes.dark.color.accent",
498
+ "message": "missing value for $color.accent"
499
+ },
500
+ {
501
+ "path": "modes.light.color.accentForeground",
502
+ "message": "missing value for $color.accentForeground"
503
+ },
504
+ {
505
+ "path": "modes.dark.color.accentForeground",
506
+ "message": "missing value for $color.accentForeground"
507
+ },
508
+ {
509
+ "path": "modes.light.color.destructive",
510
+ "message": "missing value for $color.destructive"
511
+ },
512
+ {
513
+ "path": "modes.dark.color.destructive",
514
+ "message": "missing value for $color.destructive"
515
+ },
516
+ {
517
+ "path": "modes.light.color.destructiveForeground",
518
+ "message": "missing value for $color.destructiveForeground"
519
+ },
520
+ {
521
+ "path": "modes.dark.color.destructiveForeground",
522
+ "message": "missing value for $color.destructiveForeground"
523
+ },
524
+ {
525
+ "path": "modes.light.color.success",
526
+ "message": "missing value for $color.success"
527
+ },
528
+ {
529
+ "path": "modes.dark.color.success",
530
+ "message": "missing value for $color.success"
531
+ },
532
+ {
533
+ "path": "modes.light.color.successForeground",
534
+ "message": "missing value for $color.successForeground"
535
+ },
536
+ {
537
+ "path": "modes.dark.color.successForeground",
538
+ "message": "missing value for $color.successForeground"
539
+ },
540
+ {
541
+ "path": "modes.light.color.warning",
542
+ "message": "missing value for $color.warning"
543
+ },
544
+ {
545
+ "path": "modes.dark.color.warning",
546
+ "message": "missing value for $color.warning"
547
+ },
548
+ {
549
+ "path": "modes.light.color.warningForeground",
550
+ "message": "missing value for $color.warningForeground"
551
+ },
552
+ {
553
+ "path": "modes.dark.color.warningForeground",
554
+ "message": "missing value for $color.warningForeground"
555
+ },
556
+ {
557
+ "path": "modes.light.color.info",
558
+ "message": "missing value for $color.info"
559
+ },
560
+ {
561
+ "path": "modes.dark.color.info",
562
+ "message": "missing value for $color.info"
563
+ },
564
+ {
565
+ "path": "modes.light.color.infoForeground",
566
+ "message": "missing value for $color.infoForeground"
567
+ },
568
+ {
569
+ "path": "modes.dark.color.infoForeground",
570
+ "message": "missing value for $color.infoForeground"
571
+ },
572
+ {
573
+ "path": "modes.light.color.border",
574
+ "message": "missing value for $color.border"
575
+ },
576
+ {
577
+ "path": "modes.dark.color.border",
578
+ "message": "missing value for $color.border"
579
+ },
580
+ {
581
+ "path": "modes.light.color.input",
582
+ "message": "missing value for $color.input"
583
+ },
584
+ {
585
+ "path": "modes.dark.color.input",
586
+ "message": "missing value for $color.input"
587
+ },
588
+ {
589
+ "path": "modes.light.color.ring",
590
+ "message": "missing value for $color.ring"
591
+ },
592
+ {
593
+ "path": "modes.dark.color.ring",
594
+ "message": "missing value for $color.ring"
595
+ },
596
+ {
597
+ "path": "modes.light.color.chart1",
598
+ "message": "missing value for $color.chart1"
599
+ },
600
+ {
601
+ "path": "modes.dark.color.chart1",
602
+ "message": "missing value for $color.chart1"
603
+ },
604
+ {
605
+ "path": "modes.light.color.chart2",
606
+ "message": "missing value for $color.chart2"
607
+ },
608
+ {
609
+ "path": "modes.dark.color.chart2",
610
+ "message": "missing value for $color.chart2"
611
+ },
612
+ {
613
+ "path": "modes.light.color.chart3",
614
+ "message": "missing value for $color.chart3"
615
+ },
616
+ {
617
+ "path": "modes.dark.color.chart3",
618
+ "message": "missing value for $color.chart3"
619
+ },
620
+ {
621
+ "path": "modes.light.color.chart4",
622
+ "message": "missing value for $color.chart4"
623
+ },
624
+ {
625
+ "path": "modes.dark.color.chart4",
626
+ "message": "missing value for $color.chart4"
627
+ },
628
+ {
629
+ "path": "modes.light.color.chart5",
630
+ "message": "missing value for $color.chart5"
631
+ },
632
+ {
633
+ "path": "modes.dark.color.chart5",
634
+ "message": "missing value for $color.chart5"
635
+ },
636
+ {
637
+ "path": "modes.light.color.chart6",
638
+ "message": "missing value for $color.chart6"
639
+ },
640
+ {
641
+ "path": "modes.dark.color.chart6",
642
+ "message": "missing value for $color.chart6"
643
+ },
644
+ {
645
+ "path": "modes.light.color.chart7",
646
+ "message": "missing value for $color.chart7"
647
+ },
648
+ {
649
+ "path": "modes.dark.color.chart7",
650
+ "message": "missing value for $color.chart7"
651
+ },
652
+ {
653
+ "path": "modes.light.color.chart8",
654
+ "message": "missing value for $color.chart8"
655
+ },
656
+ {
657
+ "path": "modes.dark.color.chart8",
658
+ "message": "missing value for $color.chart8"
659
+ },
660
+ {
661
+ "path": "tokens.spacing.none",
662
+ "message": "missing value for $spacing.none"
663
+ },
664
+ {
665
+ "path": "tokens.spacing.xxs",
666
+ "message": "missing value for $spacing.xxs"
667
+ },
668
+ {
669
+ "path": "tokens.spacing.xs",
670
+ "message": "missing value for $spacing.xs"
671
+ },
672
+ {
673
+ "path": "tokens.spacing.sm",
674
+ "message": "missing value for $spacing.sm"
675
+ },
676
+ {
677
+ "path": "tokens.spacing.lg",
678
+ "message": "missing value for $spacing.lg"
679
+ },
680
+ {
681
+ "path": "tokens.spacing.xl",
682
+ "message": "missing value for $spacing.xl"
683
+ },
684
+ {
685
+ "path": "tokens.spacing.xl2",
686
+ "message": "missing value for $spacing.xl2"
687
+ },
688
+ {
689
+ "path": "tokens.spacing.xl3",
690
+ "message": "missing value for $spacing.xl3"
691
+ },
692
+ {
693
+ "path": "tokens.radius.none",
694
+ "message": "missing value for $radius.none"
695
+ },
696
+ {
697
+ "path": "tokens.radius.sm",
698
+ "message": "missing value for $radius.sm"
699
+ },
700
+ {
701
+ "path": "tokens.radius.md",
702
+ "message": "missing value for $radius.md"
703
+ },
704
+ {
705
+ "path": "tokens.radius.lg",
706
+ "message": "missing value for $radius.lg"
707
+ },
708
+ {
709
+ "path": "tokens.radius.xl",
710
+ "message": "missing value for $radius.xl"
711
+ },
712
+ {
713
+ "path": "tokens.radius.xl2",
714
+ "message": "missing value for $radius.xl2"
715
+ },
716
+ {
717
+ "path": "tokens.radius.xl3",
718
+ "message": "missing value for $radius.xl3"
719
+ },
720
+ {
721
+ "path": "tokens.radius.full",
722
+ "message": "missing value for $radius.full"
723
+ },
724
+ {
725
+ "path": "tokens.type.size.xs",
726
+ "message": "missing value for $type.size.xs"
727
+ },
728
+ {
729
+ "path": "tokens.type.size.sm",
730
+ "message": "missing value for $type.size.sm"
731
+ },
732
+ {
733
+ "path": "tokens.type.size.base",
734
+ "message": "missing value for $type.size.base"
735
+ },
736
+ {
737
+ "path": "tokens.type.size.lg",
738
+ "message": "missing value for $type.size.lg"
739
+ },
740
+ {
741
+ "path": "tokens.type.size.xl",
742
+ "message": "missing value for $type.size.xl"
743
+ },
744
+ {
745
+ "path": "tokens.type.size.xl2",
746
+ "message": "missing value for $type.size.xl2"
747
+ },
748
+ {
749
+ "path": "tokens.type.size.xl3",
750
+ "message": "missing value for $type.size.xl3"
751
+ },
752
+ {
753
+ "path": "tokens.type.lineHeight.xs",
754
+ "message": "missing value for $type.lineHeight.xs"
755
+ },
756
+ {
757
+ "path": "tokens.type.lineHeight.sm",
758
+ "message": "missing value for $type.lineHeight.sm"
759
+ },
760
+ {
761
+ "path": "tokens.type.lineHeight.base",
762
+ "message": "missing value for $type.lineHeight.base"
763
+ },
764
+ {
765
+ "path": "tokens.type.lineHeight.lg",
766
+ "message": "missing value for $type.lineHeight.lg"
767
+ },
768
+ {
769
+ "path": "tokens.type.lineHeight.xl",
770
+ "message": "missing value for $type.lineHeight.xl"
771
+ },
772
+ {
773
+ "path": "tokens.type.lineHeight.xl2",
774
+ "message": "missing value for $type.lineHeight.xl2"
775
+ },
776
+ {
777
+ "path": "tokens.type.lineHeight.xl3",
778
+ "message": "missing value for $type.lineHeight.xl3"
779
+ },
780
+ {
781
+ "path": "tokens.type.weight.regular",
782
+ "message": "missing value for $type.weight.regular"
783
+ },
784
+ {
785
+ "path": "tokens.type.weight.medium",
786
+ "message": "missing value for $type.weight.medium"
787
+ },
788
+ {
789
+ "path": "tokens.type.weight.semibold",
790
+ "message": "missing value for $type.weight.semibold"
791
+ },
792
+ {
793
+ "path": "tokens.type.weight.bold",
794
+ "message": "missing value for $type.weight.bold"
795
+ },
796
+ {
797
+ "path": "tokens.type.family.sans",
798
+ "message": "missing value for $type.family.sans"
799
+ },
800
+ {
801
+ "path": "tokens.type.family.mono",
802
+ "message": "missing value for $type.family.mono"
803
+ },
804
+ {
805
+ "path": "tokens.control.buttonSm",
806
+ "message": "missing value for $control.buttonSm"
807
+ },
808
+ {
809
+ "path": "tokens.control.buttonMd",
810
+ "message": "missing value for $control.buttonMd"
811
+ },
812
+ {
813
+ "path": "tokens.control.buttonLg",
814
+ "message": "missing value for $control.buttonLg"
815
+ },
816
+ {
817
+ "path": "tokens.control.buttonIcon",
818
+ "message": "missing value for $control.buttonIcon"
819
+ },
820
+ {
821
+ "path": "tokens.control.input",
822
+ "message": "missing value for $control.input"
823
+ },
824
+ {
825
+ "path": "tokens.control.textarea",
826
+ "message": "missing value for $control.textarea"
827
+ },
828
+ {
829
+ "path": "tokens.control.row",
830
+ "message": "missing value for $control.row"
831
+ },
832
+ {
833
+ "path": "tokens.control.rowCompact",
834
+ "message": "missing value for $control.rowCompact"
835
+ },
836
+ {
837
+ "path": "tokens.control.pill",
838
+ "message": "missing value for $control.pill"
839
+ },
840
+ {
841
+ "path": "tokens.control.badge",
842
+ "message": "missing value for $control.badge"
843
+ },
844
+ {
845
+ "path": "tokens.control.chip",
846
+ "message": "missing value for $control.chip"
847
+ },
848
+ {
849
+ "path": "tokens.control.toggle",
850
+ "message": "missing value for $control.toggle"
851
+ },
852
+ {
853
+ "path": "tokens.control.switch",
854
+ "message": "missing value for $control.switch"
855
+ },
856
+ {
857
+ "path": "tokens.control.checkbox",
858
+ "message": "missing value for $control.checkbox"
859
+ },
860
+ {
861
+ "path": "tokens.control.slider",
862
+ "message": "missing value for $control.slider"
863
+ },
864
+ {
865
+ "path": "tokens.control.progress",
866
+ "message": "missing value for $control.progress"
867
+ },
868
+ {
869
+ "path": "tokens.control.meter",
870
+ "message": "missing value for $control.meter"
871
+ },
872
+ {
873
+ "path": "tokens.control.avatarSm",
874
+ "message": "missing value for $control.avatarSm"
875
+ },
876
+ {
877
+ "path": "tokens.control.avatarMd",
878
+ "message": "missing value for $control.avatarMd"
879
+ },
880
+ {
881
+ "path": "tokens.control.avatarLg",
882
+ "message": "missing value for $control.avatarLg"
883
+ },
884
+ {
885
+ "path": "tokens.control.iconSm",
886
+ "message": "missing value for $control.iconSm"
887
+ },
888
+ {
889
+ "path": "tokens.control.iconMd",
890
+ "message": "missing value for $control.iconMd"
891
+ },
892
+ {
893
+ "path": "tokens.control.iconLg",
894
+ "message": "missing value for $control.iconLg"
895
+ },
896
+ {
897
+ "path": "tokens.control.hairline",
898
+ "message": "missing value for $control.hairline"
899
+ },
900
+ {
901
+ "path": "tokens.control.appBar",
902
+ "message": "missing value for $control.appBar"
903
+ },
904
+ {
905
+ "path": "tokens.control.tabBar",
906
+ "message": "missing value for $control.tabBar"
907
+ },
908
+ {
909
+ "path": "tokens.control.toast",
910
+ "message": "missing value for $control.toast"
911
+ },
912
+ {
913
+ "path": "modes.light.shadow.none",
914
+ "message": "missing value for $shadow.none"
915
+ },
916
+ {
917
+ "path": "modes.dark.shadow.none",
918
+ "message": "missing value for $shadow.none"
919
+ },
920
+ {
921
+ "path": "modes.light.shadow.sm",
922
+ "message": "missing value for $shadow.sm"
923
+ },
924
+ {
925
+ "path": "modes.dark.shadow.sm",
926
+ "message": "missing value for $shadow.sm"
927
+ },
928
+ {
929
+ "path": "modes.light.shadow.md",
930
+ "message": "missing value for $shadow.md"
931
+ },
932
+ {
933
+ "path": "modes.dark.shadow.md",
934
+ "message": "missing value for $shadow.md"
935
+ },
936
+ {
937
+ "path": "modes.light.shadow.lg",
938
+ "message": "missing value for $shadow.lg"
939
+ },
940
+ {
941
+ "path": "modes.dark.shadow.lg",
942
+ "message": "missing value for $shadow.lg"
943
+ },
944
+ {
945
+ "path": "modes.light.shadow.xl",
946
+ "message": "missing value for $shadow.xl"
947
+ },
948
+ {
949
+ "path": "modes.dark.shadow.xl",
950
+ "message": "missing value for $shadow.xl"
951
+ },
952
+ {
953
+ "path": "tokens.opacity.primary",
954
+ "message": "missing value for $opacity.primary"
955
+ },
956
+ {
957
+ "path": "tokens.opacity.secondary",
958
+ "message": "missing value for $opacity.secondary"
959
+ },
960
+ {
961
+ "path": "tokens.opacity.tertiary",
962
+ "message": "missing value for $opacity.tertiary"
963
+ },
964
+ {
965
+ "path": "tokens.opacity.quaternary",
966
+ "message": "missing value for $opacity.quaternary"
967
+ },
968
+ {
969
+ "path": "tokens.opacity.disabled",
970
+ "message": "missing value for $opacity.disabled"
971
+ },
972
+ {
973
+ "path": "tokens.border.none",
974
+ "message": "missing value for $border.none"
975
+ },
976
+ {
977
+ "path": "tokens.border.hairline",
978
+ "message": "missing value for $border.hairline"
979
+ },
980
+ {
981
+ "path": "tokens.border.thick",
982
+ "message": "missing value for $border.thick"
983
+ },
984
+ {
985
+ "path": "tokens.motion.fast",
986
+ "message": "missing value for $motion.fast"
987
+ },
988
+ {
989
+ "path": "tokens.motion.standard",
990
+ "message": "missing value for $motion.standard"
991
+ },
992
+ {
993
+ "path": "tokens.motion.slow",
994
+ "message": "missing value for $motion.slow"
995
+ },
996
+ {
997
+ "path": "tokens.breakpoint.sm",
998
+ "message": "missing value for $breakpoint.sm"
999
+ },
1000
+ {
1001
+ "path": "tokens.breakpoint.md",
1002
+ "message": "missing value for $breakpoint.md"
1003
+ },
1004
+ {
1005
+ "path": "tokens.breakpoint.lg",
1006
+ "message": "missing value for $breakpoint.lg"
1007
+ },
1008
+ {
1009
+ "path": "tokens.breakpoint.xl",
1010
+ "message": "missing value for $breakpoint.xl"
1011
+ },
1012
+ {
1013
+ "path": "tokens.ease.standard",
1014
+ "message": "missing value for $ease.standard"
1015
+ },
1016
+ {
1017
+ "path": "tokens.ease.decelerate",
1018
+ "message": "missing value for $ease.decelerate"
1019
+ },
1020
+ {
1021
+ "path": "tokens.ease.accelerate",
1022
+ "message": "missing value for $ease.accelerate"
1023
+ },
1024
+ {
1025
+ "path": "tokens.density.compact",
1026
+ "message": "missing value for $density.compact"
1027
+ },
1028
+ {
1029
+ "path": "tokens.density.comfortable",
1030
+ "message": "missing value for $density.comfortable"
1031
+ },
1032
+ {
1033
+ "path": "tokens.blur.sm",
1034
+ "message": "missing value for $blur.sm"
1035
+ },
1036
+ {
1037
+ "path": "tokens.blur.md",
1038
+ "message": "missing value for $blur.md"
1039
+ },
1040
+ {
1041
+ "path": "tokens.blur.lg",
1042
+ "message": "missing value for $blur.lg"
1043
+ },
1044
+ {
1045
+ "path": "tokens.blur.xl",
1046
+ "message": "missing value for $blur.xl"
1047
+ },
1048
+ {
1049
+ "path": "tokens.scale.press",
1050
+ "message": "missing value for $scale.press"
1051
+ },
1052
+ {
1053
+ "path": "tokens.scale.popoverFrom",
1054
+ "message": "missing value for $scale.popoverFrom"
1055
+ }
1056
+ ]
1057
+ },
1058
+ {
1059
+ "name": "a family without a fonts entry",
1060
+ "theme": {
1061
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1062
+ "id": "t",
1063
+ "name": "T",
1064
+ "extends": "neutral",
1065
+ "tokens": {
1066
+ "type": {
1067
+ "family": {
1068
+ "sans": "Comic Neue"
1069
+ }
1070
+ }
1071
+ }
1072
+ },
1073
+ "issues": [
1074
+ {
1075
+ "path": "fonts.Comic Neue",
1076
+ "message": "family named by tokens.type.family has no fonts entry"
1077
+ }
1078
+ ]
1079
+ },
1080
+ {
1081
+ "name": "bad shadow layer",
1082
+ "theme": {
1083
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1084
+ "id": "t",
1085
+ "name": "T",
1086
+ "extends": "neutral",
1087
+ "modes": {
1088
+ "dark": {
1089
+ "shadow": {
1090
+ "sm": [
1091
+ {
1092
+ "x": 0,
1093
+ "y": 1,
1094
+ "blur": "2px",
1095
+ "spread": 0,
1096
+ "color": "black"
1097
+ }
1098
+ ]
1099
+ }
1100
+ }
1101
+ }
1102
+ },
1103
+ "issues": [
1104
+ {
1105
+ "path": "modes.dark.shadow.sm[0].blur",
1106
+ "message": "expected a number"
1107
+ },
1108
+ {
1109
+ "path": "modes.dark.shadow.sm[0].color",
1110
+ "message": "expected #rrggbb or #rrggbbaa"
1111
+ }
1112
+ ]
1113
+ },
1114
+ {
1115
+ "name": "unknown top-level key",
1116
+ "theme": {
1117
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1118
+ "id": "t",
1119
+ "name": "T",
1120
+ "extends": "neutral",
1121
+ "components": {}
1122
+ },
1123
+ "issues": [
1124
+ {
1125
+ "path": "components",
1126
+ "message": "unknown theme key; known: id|name|extends|modes|contrast|tokens|fonts|recipes"
1127
+ }
1128
+ ]
1129
+ },
1130
+ {
1131
+ "name": "Round 1: an easing that is not four numbers, a density outside 0.5..2, a breakpoint that is not a number",
1132
+ "theme": {
1133
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1134
+ "id": "bad-motion",
1135
+ "name": "Bad motion",
1136
+ "extends": "neutral",
1137
+ "tokens": {
1138
+ "ease": {
1139
+ "standard": [
1140
+ 0.2,
1141
+ 0,
1142
+ 1
1143
+ ],
1144
+ "bounce": [
1145
+ 0,
1146
+ 0,
1147
+ 1,
1148
+ 1
1149
+ ]
1150
+ },
1151
+ "density": {
1152
+ "compact": 0.2
1153
+ },
1154
+ "breakpoint": {
1155
+ "md": "768px"
1156
+ }
1157
+ }
1158
+ },
1159
+ "issues": [
1160
+ {
1161
+ "path": "tokens.ease.standard",
1162
+ "message": "expected [x1, y1, x2, y2]"
1163
+ },
1164
+ {
1165
+ "path": "tokens.ease.bounce",
1166
+ "message": "unknown token; known: standard|decelerate|accelerate"
1167
+ },
1168
+ {
1169
+ "path": "tokens.density.compact",
1170
+ "message": "expected 0.5–2"
1171
+ },
1172
+ {
1173
+ "path": "tokens.breakpoint.md",
1174
+ "message": "expected a number"
1175
+ }
1176
+ ]
1177
+ },
1178
+ {
1179
+ "name": "Round 1: a contrast overlay for an unknown mode and with a non-hex colour",
1180
+ "theme": {
1181
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1182
+ "id": "bad-contrast",
1183
+ "name": "Bad contrast",
1184
+ "extends": "neutral",
1185
+ "contrast": {
1186
+ "sepia": {
1187
+ "color": {
1188
+ "foreground": "#000000"
1189
+ }
1190
+ },
1191
+ "light": {
1192
+ "color": {
1193
+ "foreground": "black"
1194
+ }
1195
+ }
1196
+ }
1197
+ },
1198
+ "issues": [
1199
+ {
1200
+ "path": "contrast.sepia",
1201
+ "message": "unknown mode; known: light|dark"
1202
+ },
1203
+ {
1204
+ "path": "contrast.light.color.foreground",
1205
+ "message": "expected #rrggbb or #rrggbbaa (lowercase); the builder converts oklch/hsl on import"
1206
+ }
1207
+ ]
1208
+ },
1209
+ {
1210
+ "name": "Round 1: recipe motion and paint keys out of their grammar",
1211
+ "theme": {
1212
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1213
+ "id": "bad-paint",
1214
+ "name": "Bad paint",
1215
+ "extends": "neutral",
1216
+ "recipes": {
1217
+ "Collapsible": {
1218
+ "chevron": [
1219
+ {
1220
+ "when": {
1221
+ "open": true
1222
+ },
1223
+ "style": {
1224
+ "transform": "rotate(90deg) skew(2deg)",
1225
+ "transition": 180,
1226
+ "transitionEasing": "$motion.fast",
1227
+ "borderStyle": "double",
1228
+ "fontStyle": "oblique",
1229
+ "letterSpacing": "$spacing.xs"
1230
+ }
1231
+ }
1232
+ ]
1233
+ }
1234
+ }
1235
+ },
1236
+ "issues": [
1237
+ {
1238
+ "path": "recipes.Collapsible.chevron[0].style.transform",
1239
+ "message": "expected translate(Xpx, Ypx), scale(N) and/or rotate(Ndeg)"
1240
+ },
1241
+ {
1242
+ "path": "recipes.Collapsible.chevron[0].style.transition",
1243
+ "message": "expected a $motion.<name> token"
1244
+ },
1245
+ {
1246
+ "path": "recipes.Collapsible.chevron[0].style.transitionEasing",
1247
+ "message": "expected a $ease token, got $motion"
1248
+ },
1249
+ {
1250
+ "path": "recipes.Collapsible.chevron[0].style.borderStyle",
1251
+ "message": "expected solid|dashed|dotted"
1252
+ },
1253
+ {
1254
+ "path": "recipes.Collapsible.chevron[0].style.fontStyle",
1255
+ "message": "expected normal|italic"
1256
+ },
1257
+ {
1258
+ "path": "recipes.Collapsible.chevron[0].style.letterSpacing",
1259
+ "message": "expected a number, not a token"
1260
+ }
1261
+ ]
1262
+ },
1263
+ {
1264
+ "name": "Round 1: the new states are known, an unknown one is not",
1265
+ "theme": {
1266
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1267
+ "id": "bad-state",
1268
+ "name": "Bad state",
1269
+ "extends": "neutral",
1270
+ "recipes": {
1271
+ "FileUpload": {
1272
+ "dropzone": [
1273
+ {
1274
+ "when": {
1275
+ "state": [
1276
+ "dragover",
1277
+ "dropped"
1278
+ ]
1279
+ },
1280
+ "style": {
1281
+ "borderColor": "$color.ring"
1282
+ }
1283
+ }
1284
+ ]
1285
+ }
1286
+ }
1287
+ },
1288
+ "issues": [
1289
+ {
1290
+ "path": "recipes.FileUpload.dropzone[0].when.state",
1291
+ "message": "unknown state; known: hover|pressed|focus|disabled|checked|open|selected|invalid|dragover"
1292
+ }
1293
+ ]
1294
+ }
1295
+ ]
1296
+ }