@exponential_app/eui 0.0.0-stage → 0.2.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 (274) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +377 -2
  4. package/catalog/a11y.json +705 -0
  5. package/catalog/basic-map.json +104 -0
  6. package/catalog/code.json +58 -0
  7. package/catalog/core.catalog.json +5190 -0
  8. package/catalog/core.schema.json +24542 -0
  9. package/catalog/host.json +95 -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 +4152 -0
  14. package/catalog/recipes.json +64 -0
  15. package/catalog/strings.json +84 -0
  16. package/catalog/style.json +180 -0
  17. package/catalog/theme.schema.json +47754 -0
  18. package/catalog/tokens.json +47 -0
  19. package/conformance/README.md +218 -0
  20. package/conformance/baseline.ts +101 -0
  21. package/conformance/browser-page.ts +146 -0
  22. package/conformance/browser-suites.ts +699 -0
  23. package/conformance/compare.ts +201 -0
  24. package/conformance/dom.ts +97 -0
  25. package/conformance/dump.ts +163 -0
  26. package/conformance/fonts.json +157 -0
  27. package/conformance/manifest.json +233 -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/conformance/voice-wave-child.ts +102 -0
  36. package/dist/chunks/index-5fmaa0xq.js +8384 -0
  37. package/dist/chunks/index-5fmaa0xq.js.map +10 -0
  38. package/dist/chunks/index-62yzr94z.js +2784 -0
  39. package/dist/chunks/index-62yzr94z.js.map +10 -0
  40. package/dist/chunks/index-bg2jsgjq.js +8541 -0
  41. package/dist/chunks/index-bg2jsgjq.js.map +15 -0
  42. package/dist/chunks/index-fy7y2nz8.js +186 -0
  43. package/dist/chunks/index-fy7y2nz8.js.map +9 -0
  44. package/dist/chunks/index-gtk2gwsb.js +4555 -0
  45. package/dist/chunks/index-gtk2gwsb.js.map +31 -0
  46. package/dist/chunks/index-t6qz1770.js +95 -0
  47. package/dist/chunks/index-t6qz1770.js.map +11 -0
  48. package/dist/conformance.js +230462 -0
  49. package/dist/conformance.js.map +10 -0
  50. package/dist/entries/prompt.js +251 -0
  51. package/dist/entries/prompt.js.map +11 -0
  52. package/dist/entries/schema.js +1725 -0
  53. package/dist/entries/schema.js.map +11 -0
  54. package/dist/host/index.js +194 -0
  55. package/dist/host/index.js.map +9 -0
  56. package/dist/index.js +3851 -0
  57. package/dist/index.js.map +30 -0
  58. package/dist/types/src/a11y.d.ts +21 -0
  59. package/dist/types/src/animation.d.ts +76 -0
  60. package/dist/types/src/basic-map.d.ts +38 -0
  61. package/dist/types/src/builder.d.ts +50 -0
  62. package/dist/types/src/catalog.d.ts +54 -0
  63. package/dist/types/src/catalog.described.d.ts +33 -0
  64. package/dist/types/src/catalog.generated.d.ts +904 -0
  65. package/dist/types/src/chart.d.ts +46 -0
  66. package/dist/types/src/code.d.ts +44 -0
  67. package/dist/types/src/color.d.ts +20 -0
  68. package/dist/types/src/conformance.d.ts +39 -0
  69. package/dist/types/src/connector/app.d.ts +14 -0
  70. package/dist/types/src/connector/connector.d.ts +77 -0
  71. package/dist/types/src/connector/index.d.ts +4 -0
  72. package/dist/types/src/css.d.ts +27 -0
  73. package/dist/types/src/define.d.ts +66 -0
  74. package/dist/types/src/direction.d.ts +16 -0
  75. package/dist/types/src/dynamic.d.ts +161 -0
  76. package/dist/types/src/entries/prompt.d.ts +11 -0
  77. package/dist/types/src/entries/schema.d.ts +8 -0
  78. package/dist/types/src/expr.d.ts +71 -0
  79. package/dist/types/src/extension.d.ts +4 -0
  80. package/dist/types/src/format.d.ts +112 -0
  81. package/dist/types/src/geometry.d.ts +40 -0
  82. package/dist/types/src/host/contract.d.ts +225 -0
  83. package/dist/types/src/host/decoders.d.ts +61 -0
  84. package/dist/types/src/host/index.d.ts +15 -0
  85. package/dist/types/src/host/package.d.ts +102 -0
  86. package/dist/types/src/host/policy.d.ts +107 -0
  87. package/dist/types/src/host/record-store.d.ts +103 -0
  88. package/dist/types/src/host/records.d.ts +45 -0
  89. package/dist/types/src/host/router.d.ts +38 -0
  90. package/dist/types/src/host/runtime.d.ts +213 -0
  91. package/dist/types/src/host/signature.d.ts +52 -0
  92. package/dist/types/src/host/sources.d.ts +22 -0
  93. package/dist/types/src/host/tools.d.ts +42 -0
  94. package/dist/types/src/host/transports.d.ts +109 -0
  95. package/dist/types/src/index.d.ts +70 -0
  96. package/dist/types/src/layout.d.ts +20 -0
  97. package/dist/types/src/limits.d.ts +21 -0
  98. package/dist/types/src/list.d.ts +133 -0
  99. package/dist/types/src/locale.d.ts +22 -0
  100. package/dist/types/src/macros.d.ts +29 -0
  101. package/dist/types/src/overlay.d.ts +27 -0
  102. package/dist/types/src/prompt.d.ts +44 -0
  103. package/dist/types/src/qr-code.d.ts +30 -0
  104. package/dist/types/src/recipes.d.ts +17 -0
  105. package/dist/types/src/reducer.d.ts +41 -0
  106. package/dist/types/src/resizable.d.ts +38 -0
  107. package/dist/types/src/schema.d.ts +7 -0
  108. package/dist/types/src/strings.d.ts +13 -0
  109. package/dist/types/src/style.d.ts +201 -0
  110. package/dist/types/src/test-preload.d.ts +1 -0
  111. package/dist/types/src/text-clusters.d.ts +11 -0
  112. package/dist/types/src/text-shimmer.d.ts +24 -0
  113. package/dist/types/src/theme-types.d.ts +162 -0
  114. package/dist/types/src/theme.d.ts +75 -0
  115. package/dist/types/src/themes.d.ts +22 -0
  116. package/dist/types/src/tree-guides.d.ts +17 -0
  117. package/dist/types/src/types.d.ts +320 -0
  118. package/dist/types/src/validate.d.ts +31 -0
  119. package/dist/types/src/voice-wave.d.ts +181 -0
  120. package/dist/types/src/web/base-css.d.ts +1 -0
  121. package/dist/types/src/web/box-css.d.ts +63 -0
  122. package/dist/types/src/web/coerce.d.ts +32 -0
  123. package/dist/types/src/web/custom-icons.generated.d.ts +4 -0
  124. package/dist/types/src/web/data.d.ts +107 -0
  125. package/dist/types/src/web/dates.d.ts +12 -0
  126. package/dist/types/src/web/form.d.ts +44 -0
  127. package/dist/types/src/web/host-types.d.ts +126 -0
  128. package/dist/types/src/web/index.d.ts +35 -0
  129. package/dist/types/src/web/inputs.d.ts +55 -0
  130. package/dist/types/src/web/list.d.ts +16 -0
  131. package/dist/types/src/web/listbox.d.ts +14 -0
  132. package/dist/types/src/web/markdown.d.ts +96 -0
  133. package/dist/types/src/web/media.d.ts +63 -0
  134. package/dist/types/src/web/parts.d.ts +4 -0
  135. package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
  136. package/dist/types/src/web/primitives/alert.d.ts +9 -0
  137. package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
  138. package/dist/types/src/web/primitives/avatar.d.ts +13 -0
  139. package/dist/types/src/web/primitives/badge.d.ts +10 -0
  140. package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
  141. package/dist/types/src/web/primitives/button.d.ts +6 -0
  142. package/dist/types/src/web/primitives/calendar.d.ts +43 -0
  143. package/dist/types/src/web/primitives/card.d.ts +9 -0
  144. package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
  145. package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
  146. package/dist/types/src/web/primitives/cn.d.ts +3 -0
  147. package/dist/types/src/web/primitives/code-block.d.ts +24 -0
  148. package/dist/types/src/web/primitives/command.d.ts +134 -0
  149. package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
  150. package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
  151. package/dist/types/src/web/primitives/dialog.d.ts +24 -0
  152. package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
  153. package/dist/types/src/web/primitives/dock.d.ts +42 -0
  154. package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
  155. package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
  156. package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
  157. package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
  158. package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
  159. package/dist/types/src/web/primitives/index.d.ts +50 -0
  160. package/dist/types/src/web/primitives/input.d.ts +5 -0
  161. package/dist/types/src/web/primitives/kbd.d.ts +4 -0
  162. package/dist/types/src/web/primitives/label.d.ts +3 -0
  163. package/dist/types/src/web/primitives/measure.d.ts +16 -0
  164. package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
  165. package/dist/types/src/web/primitives/meter.d.ts +21 -0
  166. package/dist/types/src/web/primitives/popover.d.ts +3 -0
  167. package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
  168. package/dist/types/src/web/primitives/progress.d.ts +8 -0
  169. package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
  170. package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
  171. package/dist/types/src/web/primitives/select.d.ts +47 -0
  172. package/dist/types/src/web/primitives/separator.d.ts +3 -0
  173. package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
  174. package/dist/types/src/web/primitives/sheet.d.ts +20 -0
  175. package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
  176. package/dist/types/src/web/primitives/spinner.d.ts +3 -0
  177. package/dist/types/src/web/primitives/switch.d.ts +4 -0
  178. package/dist/types/src/web/primitives/table.d.ts +11 -0
  179. package/dist/types/src/web/primitives/tabs.d.ts +13 -0
  180. package/dist/types/src/web/primitives/textarea.d.ts +3 -0
  181. package/dist/types/src/web/primitives/toast.d.ts +163 -0
  182. package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
  183. package/dist/types/src/web/primitives/truncate.d.ts +7 -0
  184. package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
  185. package/dist/types/src/web/primitives/voice-wave.d.ts +50 -0
  186. package/dist/types/src/web/round5.d.ts +107 -0
  187. package/dist/types/src/web/share.d.ts +6 -0
  188. package/dist/types/src/web/table.d.ts +20 -0
  189. package/dist/types/src/web/theme-css.d.ts +69 -0
  190. package/dist/types/src/web/urls.d.ts +21 -0
  191. package/dist/web/index.js +2565 -0
  192. package/dist/web/index.js.map +28 -0
  193. package/dist/web/primitives/index.js +1476 -0
  194. package/dist/web/primitives/index.js.map +57 -0
  195. package/docs/components.generated.json +6783 -0
  196. package/docs/package-format.md +182 -0
  197. package/docs/round-1-contract.md +679 -0
  198. package/docs/round-2-contract.md +476 -0
  199. package/docs/round-3-contract.md +174 -0
  200. package/docs/round-5-contract.md +268 -0
  201. package/docs/themes.generated.json +3647 -0
  202. package/fixtures/animations.json +2890 -0
  203. package/fixtures/bench-list.json +58 -0
  204. package/fixtures/bind-time.json +54734 -0
  205. package/fixtures/catalog-basic-map.json +1692 -0
  206. package/fixtures/catalog-components.json +10293 -0
  207. package/fixtures/catalog-extension.json +620 -0
  208. package/fixtures/catalog-macros.json +51805 -0
  209. package/fixtures/code-tokens.json +1993 -0
  210. package/fixtures/conformance-baseline.json +59016 -0
  211. package/fixtures/conformance-cases.json +49 -0
  212. package/fixtures/conformance-known.json +2111 -0
  213. package/fixtures/control-geometry.json +5129 -0
  214. package/fixtures/dashboard.data.json +74 -0
  215. package/fixtures/dashboard.json +781 -0
  216. package/fixtures/demo-surface.json +47 -0
  217. package/fixtures/format.json +870 -0
  218. package/fixtures/host-package.json +1262 -0
  219. package/fixtures/host-policy.json +1209 -0
  220. package/fixtures/host-router.json +2034 -0
  221. package/fixtures/host-transport.json +590 -0
  222. package/fixtures/interactions-round1.json +1058 -0
  223. package/fixtures/kitchen-sink.expanded.json +11972 -0
  224. package/fixtures/kitchen-sink.json +3140 -0
  225. package/fixtures/layout-geometry-round1.json +7278 -0
  226. package/fixtures/layout-geometry.json +2072 -0
  227. package/fixtures/overlay-geometry.json +272 -0
  228. package/fixtures/pointer.json +89 -0
  229. package/fixtures/primitive-specimens.json +59 -0
  230. package/fixtures/prompt-budget.json +33 -0
  231. package/fixtures/qr-code.json +480 -0
  232. package/fixtures/resizable.json +714 -0
  233. package/fixtures/round4-contract.json +2985 -0
  234. package/fixtures/specimens.json +11168 -0
  235. package/fixtures/style-conditions.json +336 -0
  236. package/fixtures/template-items.json +2215 -0
  237. package/fixtures/text-clusters.json +65 -0
  238. package/fixtures/text-direction.json +309 -0
  239. package/fixtures/text-shimmer.json +96 -0
  240. package/fixtures/theme-extends.json +573 -0
  241. package/fixtures/theme-invalid.json +1300 -0
  242. package/fixtures/theme-recipes.json +61762 -0
  243. package/fixtures/theme-resolved.json +25969 -0
  244. package/fixtures/toast-stack.json +215 -0
  245. package/fixtures/tree-guides.json +224 -0
  246. package/fixtures/virtual-list.json +733 -0
  247. package/fixtures/voice-wave.json +19236 -0
  248. package/generated/ExponentialUICatalog.generated.kt +67 -0
  249. package/generated/ExponentialUICatalog.generated.swift +67 -0
  250. package/generated/ExponentialUIThemes.generated.kt +23 -0
  251. package/generated/ExponentialUIThemes.generated.swift +23 -0
  252. package/generated/catalog.descriptions.generated.rs +6 -0
  253. package/generated/catalog.generated.rs +80 -0
  254. package/generated/catalog.themes.generated.rs +34 -0
  255. package/generated/core.descriptions.json +2726 -0
  256. package/generated/core.runtime.json +3944 -0
  257. package/package.json +87 -4
  258. package/themes/exponential.recipes.json +49 -0
  259. package/themes/exponential.theme.json +768 -0
  260. package/themes/neutral.theme.json +6178 -0
  261. package/themes/orange.theme.json +43 -0
  262. package/themes/playful.theme.json +219 -0
  263. package/vendor/a2ui/LICENSE.txt +203 -0
  264. package/vendor/a2ui/README.md +27 -0
  265. package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
  266. package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
  267. package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
  268. package/vendor/a2ui/v0_9/client_to_server.json +104 -0
  269. package/vendor/a2ui/v0_9/common_types.json +315 -0
  270. package/vendor/a2ui/v0_9/server_to_client.json +132 -0
  271. package/vendor/json-render/LICENSE.txt +201 -0
  272. package/vendor/json-render/README.md +13 -0
  273. package/vendor/nayuki-qr/LICENSE.txt +20 -0
  274. package/vendor/nayuki-qr/README.md +10 -0
@@ -0,0 +1,1300 @@
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.type.family.serif",
806
+ "message": "missing value for $type.family.serif"
807
+ },
808
+ {
809
+ "path": "tokens.control.buttonSm",
810
+ "message": "missing value for $control.buttonSm"
811
+ },
812
+ {
813
+ "path": "tokens.control.buttonMd",
814
+ "message": "missing value for $control.buttonMd"
815
+ },
816
+ {
817
+ "path": "tokens.control.buttonLg",
818
+ "message": "missing value for $control.buttonLg"
819
+ },
820
+ {
821
+ "path": "tokens.control.buttonIcon",
822
+ "message": "missing value for $control.buttonIcon"
823
+ },
824
+ {
825
+ "path": "tokens.control.input",
826
+ "message": "missing value for $control.input"
827
+ },
828
+ {
829
+ "path": "tokens.control.textarea",
830
+ "message": "missing value for $control.textarea"
831
+ },
832
+ {
833
+ "path": "tokens.control.row",
834
+ "message": "missing value for $control.row"
835
+ },
836
+ {
837
+ "path": "tokens.control.rowCompact",
838
+ "message": "missing value for $control.rowCompact"
839
+ },
840
+ {
841
+ "path": "tokens.control.pill",
842
+ "message": "missing value for $control.pill"
843
+ },
844
+ {
845
+ "path": "tokens.control.badge",
846
+ "message": "missing value for $control.badge"
847
+ },
848
+ {
849
+ "path": "tokens.control.chip",
850
+ "message": "missing value for $control.chip"
851
+ },
852
+ {
853
+ "path": "tokens.control.toggle",
854
+ "message": "missing value for $control.toggle"
855
+ },
856
+ {
857
+ "path": "tokens.control.switch",
858
+ "message": "missing value for $control.switch"
859
+ },
860
+ {
861
+ "path": "tokens.control.checkbox",
862
+ "message": "missing value for $control.checkbox"
863
+ },
864
+ {
865
+ "path": "tokens.control.slider",
866
+ "message": "missing value for $control.slider"
867
+ },
868
+ {
869
+ "path": "tokens.control.progress",
870
+ "message": "missing value for $control.progress"
871
+ },
872
+ {
873
+ "path": "tokens.control.meter",
874
+ "message": "missing value for $control.meter"
875
+ },
876
+ {
877
+ "path": "tokens.control.avatarSm",
878
+ "message": "missing value for $control.avatarSm"
879
+ },
880
+ {
881
+ "path": "tokens.control.avatarMd",
882
+ "message": "missing value for $control.avatarMd"
883
+ },
884
+ {
885
+ "path": "tokens.control.avatarLg",
886
+ "message": "missing value for $control.avatarLg"
887
+ },
888
+ {
889
+ "path": "tokens.control.iconSm",
890
+ "message": "missing value for $control.iconSm"
891
+ },
892
+ {
893
+ "path": "tokens.control.iconMd",
894
+ "message": "missing value for $control.iconMd"
895
+ },
896
+ {
897
+ "path": "tokens.control.iconLg",
898
+ "message": "missing value for $control.iconLg"
899
+ },
900
+ {
901
+ "path": "tokens.control.hairline",
902
+ "message": "missing value for $control.hairline"
903
+ },
904
+ {
905
+ "path": "tokens.control.appBar",
906
+ "message": "missing value for $control.appBar"
907
+ },
908
+ {
909
+ "path": "tokens.control.tabBar",
910
+ "message": "missing value for $control.tabBar"
911
+ },
912
+ {
913
+ "path": "tokens.control.toast",
914
+ "message": "missing value for $control.toast"
915
+ },
916
+ {
917
+ "path": "modes.light.shadow.none",
918
+ "message": "missing value for $shadow.none"
919
+ },
920
+ {
921
+ "path": "modes.dark.shadow.none",
922
+ "message": "missing value for $shadow.none"
923
+ },
924
+ {
925
+ "path": "modes.light.shadow.sm",
926
+ "message": "missing value for $shadow.sm"
927
+ },
928
+ {
929
+ "path": "modes.dark.shadow.sm",
930
+ "message": "missing value for $shadow.sm"
931
+ },
932
+ {
933
+ "path": "modes.light.shadow.md",
934
+ "message": "missing value for $shadow.md"
935
+ },
936
+ {
937
+ "path": "modes.dark.shadow.md",
938
+ "message": "missing value for $shadow.md"
939
+ },
940
+ {
941
+ "path": "modes.light.shadow.lg",
942
+ "message": "missing value for $shadow.lg"
943
+ },
944
+ {
945
+ "path": "modes.dark.shadow.lg",
946
+ "message": "missing value for $shadow.lg"
947
+ },
948
+ {
949
+ "path": "modes.light.shadow.xl",
950
+ "message": "missing value for $shadow.xl"
951
+ },
952
+ {
953
+ "path": "modes.dark.shadow.xl",
954
+ "message": "missing value for $shadow.xl"
955
+ },
956
+ {
957
+ "path": "tokens.opacity.primary",
958
+ "message": "missing value for $opacity.primary"
959
+ },
960
+ {
961
+ "path": "tokens.opacity.secondary",
962
+ "message": "missing value for $opacity.secondary"
963
+ },
964
+ {
965
+ "path": "tokens.opacity.tertiary",
966
+ "message": "missing value for $opacity.tertiary"
967
+ },
968
+ {
969
+ "path": "tokens.opacity.quaternary",
970
+ "message": "missing value for $opacity.quaternary"
971
+ },
972
+ {
973
+ "path": "tokens.opacity.disabled",
974
+ "message": "missing value for $opacity.disabled"
975
+ },
976
+ {
977
+ "path": "tokens.border.none",
978
+ "message": "missing value for $border.none"
979
+ },
980
+ {
981
+ "path": "tokens.border.hairline",
982
+ "message": "missing value for $border.hairline"
983
+ },
984
+ {
985
+ "path": "tokens.border.thick",
986
+ "message": "missing value for $border.thick"
987
+ },
988
+ {
989
+ "path": "tokens.motion.fast",
990
+ "message": "missing value for $motion.fast"
991
+ },
992
+ {
993
+ "path": "tokens.motion.standard",
994
+ "message": "missing value for $motion.standard"
995
+ },
996
+ {
997
+ "path": "tokens.motion.slow",
998
+ "message": "missing value for $motion.slow"
999
+ },
1000
+ {
1001
+ "path": "tokens.breakpoint.sm",
1002
+ "message": "missing value for $breakpoint.sm"
1003
+ },
1004
+ {
1005
+ "path": "tokens.breakpoint.md",
1006
+ "message": "missing value for $breakpoint.md"
1007
+ },
1008
+ {
1009
+ "path": "tokens.breakpoint.lg",
1010
+ "message": "missing value for $breakpoint.lg"
1011
+ },
1012
+ {
1013
+ "path": "tokens.breakpoint.xl",
1014
+ "message": "missing value for $breakpoint.xl"
1015
+ },
1016
+ {
1017
+ "path": "tokens.ease.standard",
1018
+ "message": "missing value for $ease.standard"
1019
+ },
1020
+ {
1021
+ "path": "tokens.ease.decelerate",
1022
+ "message": "missing value for $ease.decelerate"
1023
+ },
1024
+ {
1025
+ "path": "tokens.ease.accelerate",
1026
+ "message": "missing value for $ease.accelerate"
1027
+ },
1028
+ {
1029
+ "path": "tokens.density.compact",
1030
+ "message": "missing value for $density.compact"
1031
+ },
1032
+ {
1033
+ "path": "tokens.density.comfortable",
1034
+ "message": "missing value for $density.comfortable"
1035
+ },
1036
+ {
1037
+ "path": "tokens.blur.sm",
1038
+ "message": "missing value for $blur.sm"
1039
+ },
1040
+ {
1041
+ "path": "tokens.blur.md",
1042
+ "message": "missing value for $blur.md"
1043
+ },
1044
+ {
1045
+ "path": "tokens.blur.lg",
1046
+ "message": "missing value for $blur.lg"
1047
+ },
1048
+ {
1049
+ "path": "tokens.blur.xl",
1050
+ "message": "missing value for $blur.xl"
1051
+ },
1052
+ {
1053
+ "path": "tokens.scale.press",
1054
+ "message": "missing value for $scale.press"
1055
+ },
1056
+ {
1057
+ "path": "tokens.scale.popoverFrom",
1058
+ "message": "missing value for $scale.popoverFrom"
1059
+ }
1060
+ ]
1061
+ },
1062
+ {
1063
+ "name": "a family without a fonts entry",
1064
+ "theme": {
1065
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1066
+ "id": "t",
1067
+ "name": "T",
1068
+ "extends": "neutral",
1069
+ "tokens": {
1070
+ "type": {
1071
+ "family": {
1072
+ "sans": "Comic Neue"
1073
+ }
1074
+ }
1075
+ }
1076
+ },
1077
+ "issues": [
1078
+ {
1079
+ "path": "fonts.Comic Neue",
1080
+ "message": "family named by tokens.type.family has no fonts entry"
1081
+ }
1082
+ ]
1083
+ },
1084
+ {
1085
+ "name": "bad shadow layer",
1086
+ "theme": {
1087
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1088
+ "id": "t",
1089
+ "name": "T",
1090
+ "extends": "neutral",
1091
+ "modes": {
1092
+ "dark": {
1093
+ "shadow": {
1094
+ "sm": [
1095
+ {
1096
+ "x": 0,
1097
+ "y": 1,
1098
+ "blur": "2px",
1099
+ "spread": 0,
1100
+ "color": "black"
1101
+ }
1102
+ ]
1103
+ }
1104
+ }
1105
+ }
1106
+ },
1107
+ "issues": [
1108
+ {
1109
+ "path": "modes.dark.shadow.sm[0].blur",
1110
+ "message": "expected a number"
1111
+ },
1112
+ {
1113
+ "path": "modes.dark.shadow.sm[0].color",
1114
+ "message": "expected #rrggbb or #rrggbbaa"
1115
+ }
1116
+ ]
1117
+ },
1118
+ {
1119
+ "name": "unknown top-level key",
1120
+ "theme": {
1121
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1122
+ "id": "t",
1123
+ "name": "T",
1124
+ "extends": "neutral",
1125
+ "components": {}
1126
+ },
1127
+ "issues": [
1128
+ {
1129
+ "path": "components",
1130
+ "message": "unknown theme key; known: id|name|extends|modes|contrast|tokens|fonts|recipes"
1131
+ }
1132
+ ]
1133
+ },
1134
+ {
1135
+ "name": "Round 1: an easing that is not four numbers, a density outside 0.5..2, a breakpoint that is not a number",
1136
+ "theme": {
1137
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1138
+ "id": "bad-motion",
1139
+ "name": "Bad motion",
1140
+ "extends": "neutral",
1141
+ "tokens": {
1142
+ "ease": {
1143
+ "standard": [
1144
+ 0.2,
1145
+ 0,
1146
+ 1
1147
+ ],
1148
+ "bounce": [
1149
+ 0,
1150
+ 0,
1151
+ 1,
1152
+ 1
1153
+ ]
1154
+ },
1155
+ "density": {
1156
+ "compact": 0.2
1157
+ },
1158
+ "breakpoint": {
1159
+ "md": "768px"
1160
+ }
1161
+ }
1162
+ },
1163
+ "issues": [
1164
+ {
1165
+ "path": "tokens.ease.standard",
1166
+ "message": "expected [x1, y1, x2, y2]"
1167
+ },
1168
+ {
1169
+ "path": "tokens.ease.bounce",
1170
+ "message": "unknown token; known: standard|decelerate|accelerate"
1171
+ },
1172
+ {
1173
+ "path": "tokens.density.compact",
1174
+ "message": "expected 0.5–2"
1175
+ },
1176
+ {
1177
+ "path": "tokens.breakpoint.md",
1178
+ "message": "expected a number"
1179
+ }
1180
+ ]
1181
+ },
1182
+ {
1183
+ "name": "Round 1: a contrast overlay for an unknown mode and with a non-hex colour",
1184
+ "theme": {
1185
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1186
+ "id": "bad-contrast",
1187
+ "name": "Bad contrast",
1188
+ "extends": "neutral",
1189
+ "contrast": {
1190
+ "sepia": {
1191
+ "color": {
1192
+ "foreground": "#000000"
1193
+ }
1194
+ },
1195
+ "light": {
1196
+ "color": {
1197
+ "foreground": "black"
1198
+ }
1199
+ }
1200
+ }
1201
+ },
1202
+ "issues": [
1203
+ {
1204
+ "path": "contrast.sepia",
1205
+ "message": "unknown mode; known: light|dark"
1206
+ },
1207
+ {
1208
+ "path": "contrast.light.color.foreground",
1209
+ "message": "expected #rrggbb or #rrggbbaa (lowercase); the builder converts oklch/hsl on import"
1210
+ }
1211
+ ]
1212
+ },
1213
+ {
1214
+ "name": "Round 1: recipe motion and paint keys out of their grammar",
1215
+ "theme": {
1216
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1217
+ "id": "bad-paint",
1218
+ "name": "Bad paint",
1219
+ "extends": "neutral",
1220
+ "recipes": {
1221
+ "Collapsible": {
1222
+ "chevron": [
1223
+ {
1224
+ "when": {
1225
+ "open": true
1226
+ },
1227
+ "style": {
1228
+ "transform": "rotate(90deg) skew(2deg)",
1229
+ "transition": 180,
1230
+ "transitionEasing": "$motion.fast",
1231
+ "borderStyle": "double",
1232
+ "fontStyle": "oblique",
1233
+ "letterSpacing": "$spacing.xs"
1234
+ }
1235
+ }
1236
+ ]
1237
+ }
1238
+ }
1239
+ },
1240
+ "issues": [
1241
+ {
1242
+ "path": "recipes.Collapsible.chevron[0].style.transform",
1243
+ "message": "expected translate(Xpx, Ypx), scale(N) and/or rotate(Ndeg)"
1244
+ },
1245
+ {
1246
+ "path": "recipes.Collapsible.chevron[0].style.transition",
1247
+ "message": "expected a $motion.<name> token"
1248
+ },
1249
+ {
1250
+ "path": "recipes.Collapsible.chevron[0].style.transitionEasing",
1251
+ "message": "expected a $ease token, got $motion"
1252
+ },
1253
+ {
1254
+ "path": "recipes.Collapsible.chevron[0].style.borderStyle",
1255
+ "message": "expected solid|dashed|dotted"
1256
+ },
1257
+ {
1258
+ "path": "recipes.Collapsible.chevron[0].style.fontStyle",
1259
+ "message": "expected normal|italic"
1260
+ },
1261
+ {
1262
+ "path": "recipes.Collapsible.chevron[0].style.letterSpacing",
1263
+ "message": "expected a number, not a token"
1264
+ }
1265
+ ]
1266
+ },
1267
+ {
1268
+ "name": "Round 1: the new states are known, an unknown one is not",
1269
+ "theme": {
1270
+ "$schema": "https://ui.exponential.at/schemas/theme/v1.json",
1271
+ "id": "bad-state",
1272
+ "name": "Bad state",
1273
+ "extends": "neutral",
1274
+ "recipes": {
1275
+ "FileUpload": {
1276
+ "dropzone": [
1277
+ {
1278
+ "when": {
1279
+ "state": [
1280
+ "dragover",
1281
+ "dropped"
1282
+ ]
1283
+ },
1284
+ "style": {
1285
+ "borderColor": "$color.ring"
1286
+ }
1287
+ }
1288
+ ]
1289
+ }
1290
+ }
1291
+ },
1292
+ "issues": [
1293
+ {
1294
+ "path": "recipes.FileUpload.dropzone[0].when.state",
1295
+ "message": "unknown state; known: hover|pressed|focus|disabled|checked|open|selected|invalid|dragover"
1296
+ }
1297
+ ]
1298
+ }
1299
+ ]
1300
+ }