@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,1692 @@
1
+ {
2
+ "$comment": "VAPP-85 (D14): the A2UI basic catalog cases. `components` are hand-written A2UI v0.9 component lists (every basic component, every variant that maps differently, bindings, a template child list, an unmapped component, a missing reference, a cycle); `expected` is generated by scripts/generate.ts from the TS reference reducer and locked here for the Rust core.",
3
+ "catalogId": "https://a2ui.org/specification/v0_9/basic_catalog.json",
4
+ "cases": [
5
+ {
6
+ "name": "Text variants: h1 and h4 become Heading, h5 a label, caption and body stay Text",
7
+ "components": [
8
+ {
9
+ "id": "root",
10
+ "component": "Column",
11
+ "children": [
12
+ "t1",
13
+ "t4",
14
+ "t5",
15
+ "tc",
16
+ "tb",
17
+ "td"
18
+ ]
19
+ },
20
+ {
21
+ "id": "t1",
22
+ "component": "Text",
23
+ "text": "Page",
24
+ "variant": "h1"
25
+ },
26
+ {
27
+ "id": "t4",
28
+ "component": "Text",
29
+ "text": "Section",
30
+ "variant": "h4"
31
+ },
32
+ {
33
+ "id": "t5",
34
+ "component": "Text",
35
+ "text": "Label",
36
+ "variant": "h5"
37
+ },
38
+ {
39
+ "id": "tc",
40
+ "component": "Text",
41
+ "text": "Caption",
42
+ "variant": "caption"
43
+ },
44
+ {
45
+ "id": "tb",
46
+ "component": "Text",
47
+ "text": "Body"
48
+ },
49
+ {
50
+ "id": "td",
51
+ "component": "Text",
52
+ "text": {
53
+ "path": "/user/name"
54
+ },
55
+ "variant": "body"
56
+ }
57
+ ],
58
+ "expected": {
59
+ "root": {
60
+ "id": "root",
61
+ "component": "Box",
62
+ "props": {},
63
+ "children": [
64
+ {
65
+ "id": "t1",
66
+ "component": "Text",
67
+ "props": {
68
+ "text": "Page",
69
+ "variant": "title"
70
+ },
71
+ "children": [],
72
+ "recipe": {
73
+ "macro": "Heading",
74
+ "part": "root",
75
+ "props": {
76
+ "level": "h1"
77
+ }
78
+ },
79
+ "accessibility": {
80
+ "role": "heading",
81
+ "level": 1
82
+ }
83
+ },
84
+ {
85
+ "id": "t4",
86
+ "component": "Text",
87
+ "props": {
88
+ "text": "Section",
89
+ "variant": "title"
90
+ },
91
+ "children": [],
92
+ "recipe": {
93
+ "macro": "Heading",
94
+ "part": "root",
95
+ "props": {
96
+ "level": "h4"
97
+ }
98
+ },
99
+ "accessibility": {
100
+ "role": "heading",
101
+ "level": 4
102
+ }
103
+ },
104
+ {
105
+ "id": "t5",
106
+ "component": "Text",
107
+ "props": {
108
+ "text": "Label",
109
+ "variant": "label"
110
+ },
111
+ "children": []
112
+ },
113
+ {
114
+ "id": "tc",
115
+ "component": "Text",
116
+ "props": {
117
+ "text": "Caption",
118
+ "variant": "caption"
119
+ },
120
+ "children": []
121
+ },
122
+ {
123
+ "id": "tb",
124
+ "component": "Text",
125
+ "props": {
126
+ "text": "Body",
127
+ "variant": "body"
128
+ },
129
+ "children": []
130
+ },
131
+ {
132
+ "id": "td",
133
+ "component": "Text",
134
+ "props": {
135
+ "text": {
136
+ "path": "/user/name"
137
+ },
138
+ "variant": "body"
139
+ },
140
+ "children": []
141
+ }
142
+ ],
143
+ "style": {
144
+ "display": "flex",
145
+ "flexDirection": "column",
146
+ "flexWrap": "nowrap",
147
+ "gap": "$spacing.sm",
148
+ "alignItems": "stretch",
149
+ "justifyContent": "start"
150
+ },
151
+ "recipe": {
152
+ "macro": "Stack",
153
+ "part": "root",
154
+ "props": {}
155
+ }
156
+ },
157
+ "issues": []
158
+ }
159
+ },
160
+ {
161
+ "name": "Image variants: avatar becomes Avatar, the others size the box",
162
+ "components": [
163
+ {
164
+ "id": "root",
165
+ "component": "Row",
166
+ "justify": "spaceBetween",
167
+ "align": "center",
168
+ "children": [
169
+ "ia",
170
+ "ii",
171
+ "is",
172
+ "im",
173
+ "il",
174
+ "ih"
175
+ ]
176
+ },
177
+ {
178
+ "id": "ia",
179
+ "component": "Image",
180
+ "url": "https://example.com/a.png",
181
+ "description": "Alex Chen",
182
+ "variant": "avatar"
183
+ },
184
+ {
185
+ "id": "ii",
186
+ "component": "Image",
187
+ "url": "https://example.com/i.png",
188
+ "variant": "icon"
189
+ },
190
+ {
191
+ "id": "is",
192
+ "component": "Image",
193
+ "url": "https://example.com/s.png",
194
+ "description": "Small",
195
+ "variant": "smallFeature",
196
+ "fit": "contain"
197
+ },
198
+ {
199
+ "id": "im",
200
+ "component": "Image",
201
+ "url": "https://example.com/m.png",
202
+ "description": "Medium"
203
+ },
204
+ {
205
+ "id": "il",
206
+ "component": "Image",
207
+ "url": "https://example.com/l.png",
208
+ "description": "Large",
209
+ "variant": "largeFeature",
210
+ "fit": "scaleDown"
211
+ },
212
+ {
213
+ "id": "ih",
214
+ "component": "Image",
215
+ "url": "https://example.com/h.png",
216
+ "description": "Header",
217
+ "variant": "header"
218
+ }
219
+ ],
220
+ "expected": {
221
+ "root": {
222
+ "id": "root",
223
+ "component": "Box",
224
+ "props": {},
225
+ "children": [
226
+ {
227
+ "id": "ia",
228
+ "component": "Avatar",
229
+ "props": {
230
+ "src": "https://example.com/a.png",
231
+ "name": "Alex Chen"
232
+ },
233
+ "children": []
234
+ },
235
+ {
236
+ "id": "ii",
237
+ "component": "Image",
238
+ "props": {
239
+ "src": "https://example.com/i.png",
240
+ "alt": "",
241
+ "fit": "cover"
242
+ },
243
+ "children": [],
244
+ "style": {
245
+ "width": 24,
246
+ "height": 24
247
+ }
248
+ },
249
+ {
250
+ "id": "is",
251
+ "component": "Image",
252
+ "props": {
253
+ "src": "https://example.com/s.png",
254
+ "alt": "Small",
255
+ "fit": "contain"
256
+ },
257
+ "children": [],
258
+ "style": {
259
+ "width": 120,
260
+ "height": 120
261
+ }
262
+ },
263
+ {
264
+ "id": "im",
265
+ "component": "Image",
266
+ "props": {
267
+ "src": "https://example.com/m.png",
268
+ "alt": "Medium",
269
+ "fit": "cover"
270
+ },
271
+ "children": [],
272
+ "style": {
273
+ "width": "100%",
274
+ "aspectRatio": 1.7777778
275
+ }
276
+ },
277
+ {
278
+ "id": "il",
279
+ "component": "Image",
280
+ "props": {
281
+ "src": "https://example.com/l.png",
282
+ "alt": "Large",
283
+ "fit": "scaleDown"
284
+ },
285
+ "children": [],
286
+ "style": {
287
+ "width": "100%",
288
+ "aspectRatio": 1.7777778
289
+ }
290
+ },
291
+ {
292
+ "id": "ih",
293
+ "component": "Image",
294
+ "props": {
295
+ "src": "https://example.com/h.png",
296
+ "alt": "Header",
297
+ "fit": "cover"
298
+ },
299
+ "children": [],
300
+ "style": {
301
+ "width": "100%",
302
+ "aspectRatio": 3
303
+ }
304
+ }
305
+ ],
306
+ "style": {
307
+ "display": "flex",
308
+ "flexDirection": "row",
309
+ "flexWrap": "nowrap",
310
+ "gap": "$spacing.sm",
311
+ "alignItems": "center",
312
+ "justifyContent": "space-between"
313
+ },
314
+ "recipe": {
315
+ "macro": "Stack",
316
+ "part": "root",
317
+ "props": {}
318
+ }
319
+ },
320
+ "issues": []
321
+ }
322
+ },
323
+ {
324
+ "name": "Icon names: a mapped name, an unmapped name and a custom path all paint",
325
+ "components": [
326
+ {
327
+ "id": "root",
328
+ "component": "Row",
329
+ "children": [
330
+ "ik",
331
+ "iu",
332
+ "ip"
333
+ ]
334
+ },
335
+ {
336
+ "id": "ik",
337
+ "component": "Icon",
338
+ "name": "search"
339
+ },
340
+ {
341
+ "id": "iu",
342
+ "component": "Icon",
343
+ "name": "volumeUp"
344
+ },
345
+ {
346
+ "id": "ip",
347
+ "component": "Icon",
348
+ "name": {
349
+ "path": "M0 0h24v24H0z"
350
+ }
351
+ }
352
+ ],
353
+ "expected": {
354
+ "root": {
355
+ "id": "root",
356
+ "component": "Box",
357
+ "props": {},
358
+ "children": [
359
+ {
360
+ "id": "ik",
361
+ "component": "Icon",
362
+ "props": {
363
+ "name": "nav-search"
364
+ },
365
+ "children": []
366
+ },
367
+ {
368
+ "id": "iu",
369
+ "component": "Icon",
370
+ "props": {
371
+ "name": "media-volume-up"
372
+ },
373
+ "children": []
374
+ },
375
+ {
376
+ "id": "ip",
377
+ "component": "Icon",
378
+ "props": {
379
+ "name": "ui-icon-placeholder"
380
+ },
381
+ "children": []
382
+ }
383
+ ],
384
+ "style": {
385
+ "display": "flex",
386
+ "flexDirection": "row",
387
+ "flexWrap": "nowrap",
388
+ "gap": "$spacing.sm",
389
+ "alignItems": "stretch",
390
+ "justifyContent": "start"
391
+ },
392
+ "recipe": {
393
+ "macro": "Stack",
394
+ "part": "root",
395
+ "props": {}
396
+ }
397
+ },
398
+ "issues": []
399
+ }
400
+ },
401
+ {
402
+ "name": "Media: Video and AudioPlayer",
403
+ "components": [
404
+ {
405
+ "id": "root",
406
+ "component": "Column",
407
+ "children": [
408
+ "v",
409
+ "a"
410
+ ]
411
+ },
412
+ {
413
+ "id": "v",
414
+ "component": "Video",
415
+ "url": "https://example.com/clip.mp4"
416
+ },
417
+ {
418
+ "id": "a",
419
+ "component": "AudioPlayer",
420
+ "url": "https://example.com/track.mp3",
421
+ "description": "Episode 12"
422
+ }
423
+ ],
424
+ "expected": {
425
+ "root": {
426
+ "id": "root",
427
+ "component": "Box",
428
+ "props": {},
429
+ "children": [
430
+ {
431
+ "id": "v",
432
+ "component": "Video",
433
+ "props": {
434
+ "src": "https://example.com/clip.mp4"
435
+ },
436
+ "children": []
437
+ },
438
+ {
439
+ "id": "a",
440
+ "component": "AudioPlayer",
441
+ "props": {
442
+ "src": "https://example.com/track.mp3",
443
+ "title": "Episode 12"
444
+ },
445
+ "children": []
446
+ }
447
+ ],
448
+ "style": {
449
+ "display": "flex",
450
+ "flexDirection": "column",
451
+ "flexWrap": "nowrap",
452
+ "gap": "$spacing.sm",
453
+ "alignItems": "stretch",
454
+ "justifyContent": "start"
455
+ },
456
+ "recipe": {
457
+ "macro": "Stack",
458
+ "part": "root",
459
+ "props": {}
460
+ }
461
+ },
462
+ "issues": []
463
+ }
464
+ },
465
+ {
466
+ "name": "Layout: Row and Column justify/align, List with a template child list, Card, Divider",
467
+ "components": [
468
+ {
469
+ "id": "root",
470
+ "component": "Column",
471
+ "justify": "spaceEvenly",
472
+ "align": "start",
473
+ "children": [
474
+ "card",
475
+ "div",
476
+ "list"
477
+ ]
478
+ },
479
+ {
480
+ "id": "card",
481
+ "component": "Card",
482
+ "child": "row"
483
+ },
484
+ {
485
+ "id": "row",
486
+ "component": "Row",
487
+ "justify": "stretch",
488
+ "align": "end",
489
+ "children": [
490
+ "t"
491
+ ]
492
+ },
493
+ {
494
+ "id": "t",
495
+ "component": "Text",
496
+ "text": "In a card"
497
+ },
498
+ {
499
+ "id": "div",
500
+ "component": "Divider",
501
+ "axis": "vertical"
502
+ },
503
+ {
504
+ "id": "list",
505
+ "component": "List",
506
+ "direction": "horizontal",
507
+ "children": {
508
+ "componentId": "item",
509
+ "path": "/items"
510
+ }
511
+ },
512
+ {
513
+ "id": "item",
514
+ "component": "Text",
515
+ "text": {
516
+ "path": "name"
517
+ }
518
+ }
519
+ ],
520
+ "expected": {
521
+ "root": {
522
+ "id": "root",
523
+ "component": "Box",
524
+ "props": {},
525
+ "children": [
526
+ {
527
+ "id": "card",
528
+ "component": "Box",
529
+ "props": {},
530
+ "children": [
531
+ {
532
+ "id": "card.body",
533
+ "component": "Box",
534
+ "props": {},
535
+ "children": [
536
+ {
537
+ "id": "row",
538
+ "component": "Box",
539
+ "props": {},
540
+ "children": [
541
+ {
542
+ "id": "t",
543
+ "component": "Text",
544
+ "props": {
545
+ "text": "In a card",
546
+ "variant": "body"
547
+ },
548
+ "children": []
549
+ }
550
+ ],
551
+ "style": {
552
+ "display": "flex",
553
+ "flexDirection": "row",
554
+ "flexWrap": "nowrap",
555
+ "gap": "$spacing.sm",
556
+ "alignItems": "end",
557
+ "justifyContent": "start"
558
+ },
559
+ "recipe": {
560
+ "macro": "Stack",
561
+ "part": "root",
562
+ "props": {}
563
+ }
564
+ }
565
+ ],
566
+ "style": {
567
+ "display": "flex",
568
+ "flexDirection": "column",
569
+ "gap": "$spacing.md",
570
+ "padding": "$spacing.lg"
571
+ },
572
+ "recipe": {
573
+ "macro": "Card",
574
+ "part": "body",
575
+ "props": {}
576
+ }
577
+ }
578
+ ],
579
+ "style": {
580
+ "display": "flex",
581
+ "flexDirection": "column",
582
+ "borderRadius": "$radius.xl",
583
+ "overflow": "hidden"
584
+ },
585
+ "recipe": {
586
+ "macro": "Card",
587
+ "part": "root",
588
+ "props": {}
589
+ },
590
+ "accessibility": {
591
+ "role": "group"
592
+ }
593
+ },
594
+ {
595
+ "id": "div",
596
+ "component": "Box",
597
+ "props": {},
598
+ "children": [],
599
+ "style": {
600
+ "alignSelf": "stretch",
601
+ "flexShrink": 0,
602
+ "width": 1,
603
+ "height": "auto"
604
+ },
605
+ "recipe": {
606
+ "macro": "Separator",
607
+ "part": "root",
608
+ "props": {}
609
+ },
610
+ "accessibility": {
611
+ "role": "separator"
612
+ }
613
+ },
614
+ {
615
+ "id": "list",
616
+ "component": "List",
617
+ "props": {
618
+ "direction": "horizontal",
619
+ "gap": "sm"
620
+ },
621
+ "children": [],
622
+ "template": {
623
+ "component": "item",
624
+ "path": "/items"
625
+ }
626
+ }
627
+ ],
628
+ "style": {
629
+ "display": "flex",
630
+ "flexDirection": "column",
631
+ "flexWrap": "nowrap",
632
+ "gap": "$spacing.sm",
633
+ "alignItems": "start",
634
+ "justifyContent": "space-evenly"
635
+ },
636
+ "recipe": {
637
+ "macro": "Stack",
638
+ "part": "root",
639
+ "props": {}
640
+ }
641
+ },
642
+ "issues": [],
643
+ "templates": {
644
+ "item": {
645
+ "id": "item",
646
+ "component": "Text",
647
+ "props": {
648
+ "text": {
649
+ "path": "name"
650
+ },
651
+ "variant": "body"
652
+ },
653
+ "children": []
654
+ }
655
+ }
656
+ }
657
+ },
658
+ {
659
+ "name": "Tabs: titles become headers, children the panels, the first tab active",
660
+ "components": [
661
+ {
662
+ "id": "root",
663
+ "component": "Tabs",
664
+ "tabs": [
665
+ {
666
+ "title": "Issue",
667
+ "child": "p1"
668
+ },
669
+ {
670
+ "title": {
671
+ "path": "/second"
672
+ },
673
+ "child": "p2"
674
+ }
675
+ ]
676
+ },
677
+ {
678
+ "id": "p1",
679
+ "component": "Text",
680
+ "text": "One"
681
+ },
682
+ {
683
+ "id": "p2",
684
+ "component": "Text",
685
+ "text": "Two"
686
+ }
687
+ ],
688
+ "expected": {
689
+ "root": {
690
+ "id": "root",
691
+ "component": "Tabs",
692
+ "props": {
693
+ "tabs": [
694
+ {
695
+ "label": "Issue",
696
+ "value": "p1"
697
+ },
698
+ {
699
+ "label": {
700
+ "path": "/second"
701
+ },
702
+ "value": "p2"
703
+ }
704
+ ],
705
+ "value": "p1"
706
+ },
707
+ "children": [
708
+ {
709
+ "id": "p1",
710
+ "component": "Text",
711
+ "props": {
712
+ "text": "One",
713
+ "variant": "body"
714
+ },
715
+ "children": []
716
+ },
717
+ {
718
+ "id": "p2",
719
+ "component": "Text",
720
+ "props": {
721
+ "text": "Two",
722
+ "variant": "body"
723
+ },
724
+ "children": []
725
+ }
726
+ ]
727
+ },
728
+ "issues": []
729
+ }
730
+ },
731
+ {
732
+ "name": "Modal: trigger slot + content child become a Dialog",
733
+ "components": [
734
+ {
735
+ "id": "root",
736
+ "component": "Modal",
737
+ "trigger": "open",
738
+ "content": "body"
739
+ },
740
+ {
741
+ "id": "open",
742
+ "component": "Button",
743
+ "child": "openLabel",
744
+ "action": {
745
+ "event": {
746
+ "name": "noop"
747
+ }
748
+ }
749
+ },
750
+ {
751
+ "id": "openLabel",
752
+ "component": "Text",
753
+ "text": "Open"
754
+ },
755
+ {
756
+ "id": "body",
757
+ "component": "Text",
758
+ "text": "Inside the modal"
759
+ }
760
+ ],
761
+ "expected": {
762
+ "root": {
763
+ "id": "root",
764
+ "component": "Dialog",
765
+ "props": {
766
+ "open": false
767
+ },
768
+ "children": [
769
+ {
770
+ "id": "body",
771
+ "component": "Text",
772
+ "props": {
773
+ "text": "Inside the modal",
774
+ "variant": "body"
775
+ },
776
+ "children": []
777
+ }
778
+ ],
779
+ "slots": {
780
+ "trigger": {
781
+ "id": "open",
782
+ "component": "Button",
783
+ "props": {
784
+ "variant": "secondary",
785
+ "label": "Open"
786
+ },
787
+ "children": [],
788
+ "on": {
789
+ "press": {
790
+ "event": {
791
+ "name": "noop"
792
+ }
793
+ }
794
+ }
795
+ }
796
+ }
797
+ },
798
+ "issues": []
799
+ }
800
+ },
801
+ {
802
+ "name": "Button: a Text child is the label, an Icon child the icon, another child nests; variants map; the action rides as press",
803
+ "components": [
804
+ {
805
+ "id": "root",
806
+ "component": "Row",
807
+ "children": [
808
+ "b1",
809
+ "b2",
810
+ "b3",
811
+ "b4"
812
+ ]
813
+ },
814
+ {
815
+ "id": "b1",
816
+ "component": "Button",
817
+ "child": "b1l",
818
+ "variant": "primary",
819
+ "action": {
820
+ "event": {
821
+ "name": "submit",
822
+ "context": {
823
+ "form": "login"
824
+ }
825
+ }
826
+ }
827
+ },
828
+ {
829
+ "id": "b1l",
830
+ "component": "Text",
831
+ "text": "Sign in"
832
+ },
833
+ {
834
+ "id": "b2",
835
+ "component": "Button",
836
+ "child": "b2i",
837
+ "variant": "borderless",
838
+ "action": {
839
+ "function": {
840
+ "call": "openUrl",
841
+ "args": {
842
+ "url": "https://example.com"
843
+ }
844
+ }
845
+ }
846
+ },
847
+ {
848
+ "id": "b2i",
849
+ "component": "Icon",
850
+ "name": "settings"
851
+ },
852
+ {
853
+ "id": "b3",
854
+ "component": "Button",
855
+ "child": "b3c",
856
+ "action": {
857
+ "event": {
858
+ "name": "more"
859
+ }
860
+ }
861
+ },
862
+ {
863
+ "id": "b3c",
864
+ "component": "Row",
865
+ "children": [
866
+ "b3t"
867
+ ]
868
+ },
869
+ {
870
+ "id": "b3t",
871
+ "component": "Text",
872
+ "text": "Nested"
873
+ },
874
+ {
875
+ "id": "b4",
876
+ "component": "Button",
877
+ "child": "b4l",
878
+ "variant": "default",
879
+ "action": {
880
+ "event": {
881
+ "name": "cancel"
882
+ }
883
+ }
884
+ },
885
+ {
886
+ "id": "b4l",
887
+ "component": "Text",
888
+ "text": {
889
+ "path": "/labels/cancel"
890
+ }
891
+ }
892
+ ],
893
+ "expected": {
894
+ "root": {
895
+ "id": "root",
896
+ "component": "Box",
897
+ "props": {},
898
+ "children": [
899
+ {
900
+ "id": "b1",
901
+ "component": "Button",
902
+ "props": {
903
+ "variant": "default",
904
+ "label": "Sign in"
905
+ },
906
+ "children": [],
907
+ "on": {
908
+ "press": {
909
+ "event": {
910
+ "name": "submit",
911
+ "context": {
912
+ "form": "login"
913
+ }
914
+ }
915
+ }
916
+ }
917
+ },
918
+ {
919
+ "id": "b2",
920
+ "component": "Button",
921
+ "props": {
922
+ "variant": "ghost",
923
+ "icon": "nav-settings",
924
+ "size": "icon"
925
+ },
926
+ "children": [],
927
+ "on": {
928
+ "press": {
929
+ "function": {
930
+ "call": "openUrl",
931
+ "args": {
932
+ "url": "https://example.com"
933
+ }
934
+ }
935
+ }
936
+ }
937
+ },
938
+ {
939
+ "id": "b3",
940
+ "component": "Button",
941
+ "props": {
942
+ "variant": "secondary"
943
+ },
944
+ "children": [
945
+ {
946
+ "id": "b3c",
947
+ "component": "Box",
948
+ "props": {},
949
+ "children": [
950
+ {
951
+ "id": "b3t",
952
+ "component": "Text",
953
+ "props": {
954
+ "text": "Nested",
955
+ "variant": "body"
956
+ },
957
+ "children": []
958
+ }
959
+ ],
960
+ "style": {
961
+ "display": "flex",
962
+ "flexDirection": "row",
963
+ "flexWrap": "nowrap",
964
+ "gap": "$spacing.sm",
965
+ "alignItems": "stretch",
966
+ "justifyContent": "start"
967
+ },
968
+ "recipe": {
969
+ "macro": "Stack",
970
+ "part": "root",
971
+ "props": {}
972
+ }
973
+ }
974
+ ],
975
+ "on": {
976
+ "press": {
977
+ "event": {
978
+ "name": "more"
979
+ }
980
+ }
981
+ }
982
+ },
983
+ {
984
+ "id": "b4",
985
+ "component": "Button",
986
+ "props": {
987
+ "variant": "secondary",
988
+ "label": {
989
+ "path": "/labels/cancel"
990
+ }
991
+ },
992
+ "children": [],
993
+ "on": {
994
+ "press": {
995
+ "event": {
996
+ "name": "cancel"
997
+ }
998
+ }
999
+ }
1000
+ }
1001
+ ],
1002
+ "style": {
1003
+ "display": "flex",
1004
+ "flexDirection": "row",
1005
+ "flexWrap": "nowrap",
1006
+ "gap": "$spacing.sm",
1007
+ "alignItems": "stretch",
1008
+ "justifyContent": "start"
1009
+ },
1010
+ "recipe": {
1011
+ "macro": "Stack",
1012
+ "part": "root",
1013
+ "props": {}
1014
+ }
1015
+ },
1016
+ "issues": []
1017
+ }
1018
+ },
1019
+ {
1020
+ "name": "TextField: the four variants, a regex, checks and a bound value",
1021
+ "components": [
1022
+ {
1023
+ "id": "root",
1024
+ "component": "Column",
1025
+ "children": [
1026
+ "short",
1027
+ "long",
1028
+ "num",
1029
+ "pw",
1030
+ "rx"
1031
+ ]
1032
+ },
1033
+ {
1034
+ "id": "short",
1035
+ "component": "TextField",
1036
+ "label": "Name"
1037
+ },
1038
+ {
1039
+ "id": "long",
1040
+ "component": "TextField",
1041
+ "label": "Notes",
1042
+ "variant": "longText",
1043
+ "value": {
1044
+ "path": "/notes"
1045
+ }
1046
+ },
1047
+ {
1048
+ "id": "num",
1049
+ "component": "TextField",
1050
+ "label": "Age",
1051
+ "variant": "number",
1052
+ "checks": [
1053
+ {
1054
+ "condition": {
1055
+ "call": "numeric",
1056
+ "args": {
1057
+ "value": {
1058
+ "path": "/age"
1059
+ },
1060
+ "min": 0
1061
+ }
1062
+ },
1063
+ "message": "Not negative"
1064
+ }
1065
+ ]
1066
+ },
1067
+ {
1068
+ "id": "pw",
1069
+ "component": "TextField",
1070
+ "label": "Password",
1071
+ "variant": "obscured"
1072
+ },
1073
+ {
1074
+ "id": "rx",
1075
+ "component": "TextField",
1076
+ "label": "Code",
1077
+ "value": {
1078
+ "path": "/code"
1079
+ },
1080
+ "validationRegexp": "^[A-Z]{3}$"
1081
+ }
1082
+ ],
1083
+ "expected": {
1084
+ "root": {
1085
+ "id": "root",
1086
+ "component": "Box",
1087
+ "props": {},
1088
+ "children": [
1089
+ {
1090
+ "id": "short",
1091
+ "component": "Input",
1092
+ "props": {
1093
+ "label": "Name",
1094
+ "name": "short",
1095
+ "type": "text"
1096
+ },
1097
+ "children": []
1098
+ },
1099
+ {
1100
+ "id": "long",
1101
+ "component": "Textarea",
1102
+ "props": {
1103
+ "label": "Notes",
1104
+ "value": {
1105
+ "path": "/notes"
1106
+ },
1107
+ "name": "long"
1108
+ },
1109
+ "children": []
1110
+ },
1111
+ {
1112
+ "id": "num",
1113
+ "component": "Input",
1114
+ "props": {
1115
+ "label": "Age",
1116
+ "checks": [
1117
+ {
1118
+ "condition": {
1119
+ "call": "numeric",
1120
+ "args": {
1121
+ "value": {
1122
+ "path": "/age"
1123
+ },
1124
+ "min": 0
1125
+ }
1126
+ },
1127
+ "message": "Not negative"
1128
+ }
1129
+ ],
1130
+ "name": "num",
1131
+ "type": "number"
1132
+ },
1133
+ "children": []
1134
+ },
1135
+ {
1136
+ "id": "pw",
1137
+ "component": "Input",
1138
+ "props": {
1139
+ "label": "Password",
1140
+ "name": "pw",
1141
+ "type": "password"
1142
+ },
1143
+ "children": []
1144
+ },
1145
+ {
1146
+ "id": "rx",
1147
+ "component": "Input",
1148
+ "props": {
1149
+ "label": "Code",
1150
+ "value": {
1151
+ "path": "/code"
1152
+ },
1153
+ "name": "rx",
1154
+ "type": "text",
1155
+ "checks": [
1156
+ {
1157
+ "condition": {
1158
+ "call": "regex",
1159
+ "args": {
1160
+ "value": {
1161
+ "path": "/code"
1162
+ },
1163
+ "pattern": "^[A-Z]{3}$"
1164
+ }
1165
+ },
1166
+ "message": "Invalid value"
1167
+ }
1168
+ ]
1169
+ },
1170
+ "children": []
1171
+ }
1172
+ ],
1173
+ "style": {
1174
+ "display": "flex",
1175
+ "flexDirection": "column",
1176
+ "flexWrap": "nowrap",
1177
+ "gap": "$spacing.sm",
1178
+ "alignItems": "stretch",
1179
+ "justifyContent": "start"
1180
+ },
1181
+ "recipe": {
1182
+ "macro": "Stack",
1183
+ "part": "root",
1184
+ "props": {}
1185
+ }
1186
+ },
1187
+ "issues": []
1188
+ }
1189
+ },
1190
+ {
1191
+ "name": "CheckBox, Slider, DateTimeInput (time ignored) take their ids as names",
1192
+ "components": [
1193
+ {
1194
+ "id": "root",
1195
+ "component": "Column",
1196
+ "children": [
1197
+ "agree",
1198
+ "vol",
1199
+ "due"
1200
+ ]
1201
+ },
1202
+ {
1203
+ "id": "agree",
1204
+ "component": "CheckBox",
1205
+ "label": "I agree",
1206
+ "value": {
1207
+ "path": "/agree"
1208
+ }
1209
+ },
1210
+ {
1211
+ "id": "vol",
1212
+ "component": "Slider",
1213
+ "label": "Volume",
1214
+ "max": 100,
1215
+ "value": 40
1216
+ },
1217
+ {
1218
+ "id": "due",
1219
+ "component": "DateTimeInput",
1220
+ "label": "Due",
1221
+ "value": "",
1222
+ "enableDate": true,
1223
+ "enableTime": true,
1224
+ "min": "2026-01-01"
1225
+ }
1226
+ ],
1227
+ "expected": {
1228
+ "root": {
1229
+ "id": "root",
1230
+ "component": "Box",
1231
+ "props": {},
1232
+ "children": [
1233
+ {
1234
+ "id": "agree",
1235
+ "component": "Checkbox",
1236
+ "props": {
1237
+ "label": "I agree",
1238
+ "checked": {
1239
+ "path": "/agree"
1240
+ },
1241
+ "name": "agree"
1242
+ },
1243
+ "children": []
1244
+ },
1245
+ {
1246
+ "id": "vol",
1247
+ "component": "Slider",
1248
+ "props": {
1249
+ "label": "Volume",
1250
+ "min": 0,
1251
+ "max": 100,
1252
+ "value": 40
1253
+ },
1254
+ "children": []
1255
+ },
1256
+ {
1257
+ "id": "due",
1258
+ "component": "DatePicker",
1259
+ "props": {
1260
+ "label": "Due",
1261
+ "value": "",
1262
+ "min": "2026-01-01",
1263
+ "name": "due"
1264
+ },
1265
+ "children": []
1266
+ }
1267
+ ],
1268
+ "style": {
1269
+ "display": "flex",
1270
+ "flexDirection": "column",
1271
+ "flexWrap": "nowrap",
1272
+ "gap": "$spacing.sm",
1273
+ "alignItems": "stretch",
1274
+ "justifyContent": "start"
1275
+ },
1276
+ "recipe": {
1277
+ "macro": "Stack",
1278
+ "part": "root",
1279
+ "props": {}
1280
+ }
1281
+ },
1282
+ "issues": []
1283
+ }
1284
+ },
1285
+ {
1286
+ "name": "ChoicePicker: radio, chips (single and multiple), multiple checkboxes, filterable",
1287
+ "components": [
1288
+ {
1289
+ "id": "root",
1290
+ "component": "Column",
1291
+ "children": [
1292
+ "radio",
1293
+ "chips1",
1294
+ "chipsN",
1295
+ "multi",
1296
+ "filter"
1297
+ ]
1298
+ },
1299
+ {
1300
+ "id": "radio",
1301
+ "component": "ChoicePicker",
1302
+ "label": "Plan",
1303
+ "options": [
1304
+ {
1305
+ "label": "Free",
1306
+ "value": "free"
1307
+ },
1308
+ {
1309
+ "label": "Team",
1310
+ "value": "team"
1311
+ }
1312
+ ],
1313
+ "value": [
1314
+ "free"
1315
+ ]
1316
+ },
1317
+ {
1318
+ "id": "chips1",
1319
+ "component": "ChoicePicker",
1320
+ "options": [
1321
+ {
1322
+ "label": "A",
1323
+ "value": "a"
1324
+ },
1325
+ {
1326
+ "label": "B",
1327
+ "value": "b"
1328
+ }
1329
+ ],
1330
+ "value": [
1331
+ "b"
1332
+ ],
1333
+ "displayStyle": "chips"
1334
+ },
1335
+ {
1336
+ "id": "chipsN",
1337
+ "component": "ChoicePicker",
1338
+ "variant": "multipleSelection",
1339
+ "options": [
1340
+ {
1341
+ "label": "A",
1342
+ "value": "a"
1343
+ },
1344
+ {
1345
+ "label": "B",
1346
+ "value": "b"
1347
+ }
1348
+ ],
1349
+ "value": [
1350
+ "a",
1351
+ "b"
1352
+ ],
1353
+ "displayStyle": "chips"
1354
+ },
1355
+ {
1356
+ "id": "multi",
1357
+ "component": "ChoicePicker",
1358
+ "variant": "multipleSelection",
1359
+ "label": "Labels",
1360
+ "options": [
1361
+ {
1362
+ "label": "Bug",
1363
+ "value": "bug"
1364
+ }
1365
+ ],
1366
+ "value": {
1367
+ "path": "/labels"
1368
+ }
1369
+ },
1370
+ {
1371
+ "id": "filter",
1372
+ "component": "ChoicePicker",
1373
+ "label": "Member",
1374
+ "options": [
1375
+ {
1376
+ "label": "Alex",
1377
+ "value": "alex"
1378
+ }
1379
+ ],
1380
+ "value": [],
1381
+ "filterable": true
1382
+ }
1383
+ ],
1384
+ "expected": {
1385
+ "root": {
1386
+ "id": "root",
1387
+ "component": "Box",
1388
+ "props": {},
1389
+ "children": [
1390
+ {
1391
+ "id": "radio",
1392
+ "component": "Radio",
1393
+ "props": {
1394
+ "label": "Plan",
1395
+ "options": [
1396
+ {
1397
+ "label": "Free",
1398
+ "value": "free"
1399
+ },
1400
+ {
1401
+ "label": "Team",
1402
+ "value": "team"
1403
+ }
1404
+ ],
1405
+ "name": "radio",
1406
+ "value": "free"
1407
+ },
1408
+ "children": []
1409
+ },
1410
+ {
1411
+ "id": "chips1",
1412
+ "component": "Segmented",
1413
+ "props": {
1414
+ "items": [
1415
+ {
1416
+ "label": "A",
1417
+ "value": "a"
1418
+ },
1419
+ {
1420
+ "label": "B",
1421
+ "value": "b"
1422
+ }
1423
+ ],
1424
+ "type": "single",
1425
+ "variant": "outline",
1426
+ "value": "b"
1427
+ },
1428
+ "children": []
1429
+ },
1430
+ {
1431
+ "id": "chipsN",
1432
+ "component": "Segmented",
1433
+ "props": {
1434
+ "items": [
1435
+ {
1436
+ "label": "A",
1437
+ "value": "a"
1438
+ },
1439
+ {
1440
+ "label": "B",
1441
+ "value": "b"
1442
+ }
1443
+ ],
1444
+ "type": "multiple",
1445
+ "variant": "outline",
1446
+ "value": "a,b"
1447
+ },
1448
+ "children": []
1449
+ },
1450
+ {
1451
+ "id": "multi",
1452
+ "component": "Select",
1453
+ "props": {
1454
+ "label": "Labels",
1455
+ "options": [
1456
+ {
1457
+ "label": "Bug",
1458
+ "value": "bug"
1459
+ }
1460
+ ],
1461
+ "name": "multi",
1462
+ "value": {
1463
+ "path": "/labels"
1464
+ },
1465
+ "multiple": true
1466
+ },
1467
+ "children": []
1468
+ },
1469
+ {
1470
+ "id": "filter",
1471
+ "component": "Select",
1472
+ "props": {
1473
+ "label": "Member",
1474
+ "options": [
1475
+ {
1476
+ "label": "Alex",
1477
+ "value": "alex"
1478
+ }
1479
+ ],
1480
+ "name": "filter",
1481
+ "value": "",
1482
+ "searchable": true,
1483
+ "multiple": false
1484
+ },
1485
+ "children": []
1486
+ }
1487
+ ],
1488
+ "style": {
1489
+ "display": "flex",
1490
+ "flexDirection": "column",
1491
+ "flexWrap": "nowrap",
1492
+ "gap": "$spacing.sm",
1493
+ "alignItems": "stretch",
1494
+ "justifyContent": "start"
1495
+ },
1496
+ "recipe": {
1497
+ "macro": "Stack",
1498
+ "part": "root",
1499
+ "props": {}
1500
+ }
1501
+ },
1502
+ "issues": []
1503
+ }
1504
+ },
1505
+ {
1506
+ "name": "An unmapped component becomes the Unknown placeholder, never an error",
1507
+ "components": [
1508
+ {
1509
+ "id": "root",
1510
+ "component": "Column",
1511
+ "children": [
1512
+ "g",
1513
+ "t"
1514
+ ]
1515
+ },
1516
+ {
1517
+ "id": "g",
1518
+ "component": "Gauge",
1519
+ "value": 3
1520
+ },
1521
+ {
1522
+ "id": "t",
1523
+ "component": "Text",
1524
+ "text": "Still rendered"
1525
+ }
1526
+ ],
1527
+ "expected": {
1528
+ "root": {
1529
+ "id": "root",
1530
+ "component": "Box",
1531
+ "props": {},
1532
+ "children": [
1533
+ {
1534
+ "id": "g",
1535
+ "component": "Unknown",
1536
+ "props": {
1537
+ "component": "Gauge",
1538
+ "catalogId": "https://a2ui.org/specification/v0_9/basic_catalog.json"
1539
+ },
1540
+ "children": []
1541
+ },
1542
+ {
1543
+ "id": "t",
1544
+ "component": "Text",
1545
+ "props": {
1546
+ "text": "Still rendered",
1547
+ "variant": "body"
1548
+ },
1549
+ "children": []
1550
+ }
1551
+ ],
1552
+ "style": {
1553
+ "display": "flex",
1554
+ "flexDirection": "column",
1555
+ "flexWrap": "nowrap",
1556
+ "gap": "$spacing.sm",
1557
+ "alignItems": "stretch",
1558
+ "justifyContent": "start"
1559
+ },
1560
+ "recipe": {
1561
+ "macro": "Stack",
1562
+ "part": "root",
1563
+ "props": {}
1564
+ }
1565
+ },
1566
+ "issues": [
1567
+ {
1568
+ "id": "g",
1569
+ "message": "basic component Gauge has no mapping"
1570
+ }
1571
+ ]
1572
+ }
1573
+ },
1574
+ {
1575
+ "name": "A missing reference and a cycle become placeholders with issues",
1576
+ "components": [
1577
+ {
1578
+ "id": "root",
1579
+ "component": "Column",
1580
+ "children": [
1581
+ "nope",
1582
+ "a"
1583
+ ]
1584
+ },
1585
+ {
1586
+ "id": "a",
1587
+ "component": "Row",
1588
+ "children": [
1589
+ "b"
1590
+ ]
1591
+ },
1592
+ {
1593
+ "id": "b",
1594
+ "component": "Row",
1595
+ "children": [
1596
+ "a"
1597
+ ]
1598
+ }
1599
+ ],
1600
+ "expected": {
1601
+ "root": {
1602
+ "id": "root",
1603
+ "component": "Box",
1604
+ "props": {},
1605
+ "children": [
1606
+ {
1607
+ "id": "nope",
1608
+ "component": "Unknown",
1609
+ "props": {
1610
+ "component": "#nope",
1611
+ "catalogId": "https://a2ui.org/specification/v0_9/basic_catalog.json"
1612
+ },
1613
+ "children": []
1614
+ },
1615
+ {
1616
+ "id": "a",
1617
+ "component": "Box",
1618
+ "props": {},
1619
+ "children": [
1620
+ {
1621
+ "id": "b",
1622
+ "component": "Box",
1623
+ "props": {},
1624
+ "children": [
1625
+ {
1626
+ "id": "a",
1627
+ "component": "Unknown",
1628
+ "props": {
1629
+ "component": "Row",
1630
+ "catalogId": "https://a2ui.org/specification/v0_9/basic_catalog.json"
1631
+ },
1632
+ "children": []
1633
+ }
1634
+ ],
1635
+ "style": {
1636
+ "display": "flex",
1637
+ "flexDirection": "row",
1638
+ "flexWrap": "nowrap",
1639
+ "gap": "$spacing.sm",
1640
+ "alignItems": "stretch",
1641
+ "justifyContent": "start"
1642
+ },
1643
+ "recipe": {
1644
+ "macro": "Stack",
1645
+ "part": "root",
1646
+ "props": {}
1647
+ }
1648
+ }
1649
+ ],
1650
+ "style": {
1651
+ "display": "flex",
1652
+ "flexDirection": "row",
1653
+ "flexWrap": "nowrap",
1654
+ "gap": "$spacing.sm",
1655
+ "alignItems": "stretch",
1656
+ "justifyContent": "start"
1657
+ },
1658
+ "recipe": {
1659
+ "macro": "Stack",
1660
+ "part": "root",
1661
+ "props": {}
1662
+ }
1663
+ }
1664
+ ],
1665
+ "style": {
1666
+ "display": "flex",
1667
+ "flexDirection": "column",
1668
+ "flexWrap": "nowrap",
1669
+ "gap": "$spacing.sm",
1670
+ "alignItems": "stretch",
1671
+ "justifyContent": "start"
1672
+ },
1673
+ "recipe": {
1674
+ "macro": "Stack",
1675
+ "part": "root",
1676
+ "props": {}
1677
+ }
1678
+ },
1679
+ "issues": [
1680
+ {
1681
+ "id": "nope",
1682
+ "message": "no component with this id"
1683
+ },
1684
+ {
1685
+ "id": "a",
1686
+ "message": "cycle through this id"
1687
+ }
1688
+ ]
1689
+ }
1690
+ }
1691
+ ]
1692
+ }