@easyops-cn/a2ui-react 0.0.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 (161) hide show
  1. package/.claude/commands/speckit.analyze.md +184 -0
  2. package/.claude/commands/speckit.checklist.md +294 -0
  3. package/.claude/commands/speckit.clarify.md +181 -0
  4. package/.claude/commands/speckit.constitution.md +82 -0
  5. package/.claude/commands/speckit.implement.md +135 -0
  6. package/.claude/commands/speckit.plan.md +89 -0
  7. package/.claude/commands/speckit.specify.md +256 -0
  8. package/.claude/commands/speckit.tasks.md +137 -0
  9. package/.claude/commands/speckit.taskstoissues.md +30 -0
  10. package/.github/workflows/deploy.yml +69 -0
  11. package/.husky/pre-commit +1 -0
  12. package/.prettierignore +4 -0
  13. package/.prettierrc +7 -0
  14. package/.specify/memory/constitution.md +73 -0
  15. package/.specify/scripts/bash/check-prerequisites.sh +166 -0
  16. package/.specify/scripts/bash/common.sh +156 -0
  17. package/.specify/scripts/bash/create-new-feature.sh +297 -0
  18. package/.specify/scripts/bash/setup-plan.sh +61 -0
  19. package/.specify/scripts/bash/update-agent-context.sh +799 -0
  20. package/.specify/templates/agent-file-template.md +28 -0
  21. package/.specify/templates/checklist-template.md +40 -0
  22. package/.specify/templates/plan-template.md +105 -0
  23. package/.specify/templates/spec-template.md +115 -0
  24. package/.specify/templates/tasks-template.md +250 -0
  25. package/CLAUDE.md +105 -0
  26. package/CONTRIBUTING.md +97 -0
  27. package/README.md +126 -0
  28. package/components.json +21 -0
  29. package/eslint.config.js +25 -0
  30. package/netlify.toml +50 -0
  31. package/package.json +94 -0
  32. package/playground/README.md +75 -0
  33. package/playground/index.html +22 -0
  34. package/playground/package.json +32 -0
  35. package/playground/public/favicon.svg +8 -0
  36. package/playground/src/App.css +256 -0
  37. package/playground/src/App.tsx +115 -0
  38. package/playground/src/assets/react.svg +1 -0
  39. package/playground/src/components/ErrorDisplay.tsx +13 -0
  40. package/playground/src/components/ExampleSelector.tsx +64 -0
  41. package/playground/src/components/Header.tsx +47 -0
  42. package/playground/src/components/JsonEditor.tsx +32 -0
  43. package/playground/src/components/Preview.tsx +78 -0
  44. package/playground/src/components/ThemeToggle.tsx +19 -0
  45. package/playground/src/data/examples.ts +1571 -0
  46. package/playground/src/hooks/useTheme.ts +55 -0
  47. package/playground/src/index.css +220 -0
  48. package/playground/src/main.tsx +10 -0
  49. package/playground/tsconfig.app.json +34 -0
  50. package/playground/tsconfig.json +13 -0
  51. package/playground/tsconfig.node.json +26 -0
  52. package/playground/vite.config.ts +31 -0
  53. package/specs/001-a2ui-renderer/checklists/requirements.md +41 -0
  54. package/specs/001-a2ui-renderer/data-model.md +140 -0
  55. package/specs/001-a2ui-renderer/plan.md +123 -0
  56. package/specs/001-a2ui-renderer/quickstart.md +141 -0
  57. package/specs/001-a2ui-renderer/research.md +140 -0
  58. package/specs/001-a2ui-renderer/spec.md +165 -0
  59. package/specs/001-a2ui-renderer/tasks.md +310 -0
  60. package/specs/002-playground/checklists/requirements.md +37 -0
  61. package/specs/002-playground/contracts/components.md +120 -0
  62. package/specs/002-playground/data-model.md +149 -0
  63. package/specs/002-playground/plan.md +73 -0
  64. package/specs/002-playground/quickstart.md +158 -0
  65. package/specs/002-playground/research.md +117 -0
  66. package/specs/002-playground/spec.md +109 -0
  67. package/specs/002-playground/tasks.md +224 -0
  68. package/src/0.8/A2UIRender.test.tsx +793 -0
  69. package/src/0.8/A2UIRender.tsx +142 -0
  70. package/src/0.8/components/ComponentRenderer.test.tsx +373 -0
  71. package/src/0.8/components/ComponentRenderer.tsx +163 -0
  72. package/src/0.8/components/UnknownComponent.tsx +49 -0
  73. package/src/0.8/components/display/AudioPlayerComponent.tsx +37 -0
  74. package/src/0.8/components/display/DividerComponent.tsx +23 -0
  75. package/src/0.8/components/display/IconComponent.tsx +137 -0
  76. package/src/0.8/components/display/ImageComponent.tsx +57 -0
  77. package/src/0.8/components/display/TextComponent.tsx +56 -0
  78. package/src/0.8/components/display/VideoComponent.tsx +31 -0
  79. package/src/0.8/components/display/display.test.tsx +660 -0
  80. package/src/0.8/components/display/index.ts +10 -0
  81. package/src/0.8/components/index.ts +14 -0
  82. package/src/0.8/components/interactive/ButtonComponent.tsx +44 -0
  83. package/src/0.8/components/interactive/CheckBoxComponent.tsx +45 -0
  84. package/src/0.8/components/interactive/DateTimeInputComponent.tsx +176 -0
  85. package/src/0.8/components/interactive/MultipleChoiceComponent.tsx +157 -0
  86. package/src/0.8/components/interactive/SliderComponent.tsx +53 -0
  87. package/src/0.8/components/interactive/TextFieldComponent.tsx +65 -0
  88. package/src/0.8/components/interactive/index.ts +10 -0
  89. package/src/0.8/components/interactive/interactive.test.tsx +618 -0
  90. package/src/0.8/components/layout/CardComponent.tsx +30 -0
  91. package/src/0.8/components/layout/ColumnComponent.tsx +93 -0
  92. package/src/0.8/components/layout/ListComponent.tsx +81 -0
  93. package/src/0.8/components/layout/ModalComponent.tsx +41 -0
  94. package/src/0.8/components/layout/RowComponent.tsx +94 -0
  95. package/src/0.8/components/layout/TabsComponent.tsx +59 -0
  96. package/src/0.8/components/layout/index.ts +10 -0
  97. package/src/0.8/components/layout/layout.test.tsx +558 -0
  98. package/src/0.8/contexts/A2UIProvider.test.tsx +226 -0
  99. package/src/0.8/contexts/A2UIProvider.tsx +54 -0
  100. package/src/0.8/contexts/ActionContext.test.tsx +242 -0
  101. package/src/0.8/contexts/ActionContext.tsx +105 -0
  102. package/src/0.8/contexts/ComponentsMapContext.tsx +125 -0
  103. package/src/0.8/contexts/DataModelContext.test.tsx +335 -0
  104. package/src/0.8/contexts/DataModelContext.tsx +184 -0
  105. package/src/0.8/contexts/SurfaceContext.test.tsx +339 -0
  106. package/src/0.8/contexts/SurfaceContext.tsx +197 -0
  107. package/src/0.8/hooks/useA2UIMessageHandler.test.tsx +399 -0
  108. package/src/0.8/hooks/useA2UIMessageHandler.ts +123 -0
  109. package/src/0.8/hooks/useComponent.test.tsx +148 -0
  110. package/src/0.8/hooks/useComponent.ts +39 -0
  111. package/src/0.8/hooks/useDataBinding.test.tsx +334 -0
  112. package/src/0.8/hooks/useDataBinding.ts +99 -0
  113. package/src/0.8/hooks/useDispatchAction.test.tsx +83 -0
  114. package/src/0.8/hooks/useDispatchAction.ts +35 -0
  115. package/src/0.8/hooks/useSurface.test.tsx +114 -0
  116. package/src/0.8/hooks/useSurface.ts +34 -0
  117. package/src/0.8/index.ts +38 -0
  118. package/src/0.8/schemas/client_to_server.json +50 -0
  119. package/src/0.8/schemas/server_to_client.json +148 -0
  120. package/src/0.8/schemas/standard_catalog_definition.json +661 -0
  121. package/src/0.8/types/index.ts +448 -0
  122. package/src/0.8/utils/dataBinding.test.ts +443 -0
  123. package/src/0.8/utils/dataBinding.ts +212 -0
  124. package/src/0.8/utils/pathUtils.test.ts +353 -0
  125. package/src/0.8/utils/pathUtils.ts +200 -0
  126. package/src/components/ui/button.tsx +62 -0
  127. package/src/components/ui/calendar.tsx +220 -0
  128. package/src/components/ui/card.tsx +92 -0
  129. package/src/components/ui/checkbox.tsx +30 -0
  130. package/src/components/ui/dialog.tsx +141 -0
  131. package/src/components/ui/input.tsx +21 -0
  132. package/src/components/ui/label.tsx +22 -0
  133. package/src/components/ui/native-select.tsx +53 -0
  134. package/src/components/ui/popover.tsx +46 -0
  135. package/src/components/ui/select.tsx +188 -0
  136. package/src/components/ui/separator.tsx +26 -0
  137. package/src/components/ui/slider.tsx +61 -0
  138. package/src/components/ui/tabs.tsx +64 -0
  139. package/src/components/ui/textarea.tsx +18 -0
  140. package/src/index.ts +1 -0
  141. package/src/lib/utils.ts +6 -0
  142. package/tsconfig.json +28 -0
  143. package/vite.config.ts +29 -0
  144. package/vitest.config.ts +22 -0
  145. package/vitest.setup.ts +8 -0
  146. package/website/README.md +4 -0
  147. package/website/assets/favicon.svg +8 -0
  148. package/website/content/.gitkeep +0 -0
  149. package/website/content/index.md +122 -0
  150. package/website/global.d.ts +9 -0
  151. package/website/package.json +17 -0
  152. package/website/plain.config.js +28 -0
  153. package/website/serve.json +6 -0
  154. package/website/src/client/color-mode-switch.css +47 -0
  155. package/website/src/client/index.js +61 -0
  156. package/website/src/client/moon.svg +1 -0
  157. package/website/src/client/sun.svg +1 -0
  158. package/website/src/components/Footer.jsx +9 -0
  159. package/website/src/components/Header.jsx +44 -0
  160. package/website/src/components/Page.jsx +28 -0
  161. package/website/src/global.css +423 -0
@@ -0,0 +1,661 @@
1
+ {
2
+ "components": {
3
+ "Text": {
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "properties": {
7
+ "text": {
8
+ "type": "object",
9
+ "description": "The text content to display. This can be a literal string or a reference to a value in the data model ('path', e.g., '/doc/title'). While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation.",
10
+ "additionalProperties": false,
11
+ "properties": {
12
+ "literalString": {
13
+ "type": "string"
14
+ },
15
+ "path": {
16
+ "type": "string"
17
+ }
18
+ }
19
+ },
20
+ "usageHint": {
21
+ "type": "string",
22
+ "description": "A hint for the base text style. One of:\n- `h1`: Largest heading.\n- `h2`: Second largest heading.\n- `h3`: Third largest heading.\n- `h4`: Fourth largest heading.\n- `h5`: Fifth largest heading.\n- `caption`: Small text for captions.\n- `body`: Standard body text.",
23
+ "enum": ["h1", "h2", "h3", "h4", "h5", "caption", "body"]
24
+ }
25
+ },
26
+ "required": ["text"]
27
+ },
28
+ "Image": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "properties": {
32
+ "url": {
33
+ "type": "object",
34
+ "description": "The URL of the image to display. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/thumbnail/url').",
35
+ "additionalProperties": false,
36
+ "properties": {
37
+ "literalString": {
38
+ "type": "string"
39
+ },
40
+ "path": {
41
+ "type": "string"
42
+ }
43
+ }
44
+ },
45
+ "fit": {
46
+ "type": "string",
47
+ "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.",
48
+ "enum": ["contain", "cover", "fill", "none", "scale-down"]
49
+ },
50
+ "usageHint": {
51
+ "type": "string",
52
+ "description": "A hint for the image size and style. One of:\n- `icon`: Small square icon.\n- `avatar`: Circular avatar image.\n- `smallFeature`: Small feature image.\n- `mediumFeature`: Medium feature image.\n- `largeFeature`: Large feature image.\n- `header`: Full-width, full bleed, header image.",
53
+ "enum": [
54
+ "icon",
55
+ "avatar",
56
+ "smallFeature",
57
+ "mediumFeature",
58
+ "largeFeature",
59
+ "header"
60
+ ]
61
+ }
62
+ },
63
+ "required": ["url"]
64
+ },
65
+ "Icon": {
66
+ "type": "object",
67
+ "additionalProperties": false,
68
+ "properties": {
69
+ "name": {
70
+ "type": "object",
71
+ "description": "The name of the icon to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/form/submit').",
72
+ "additionalProperties": false,
73
+ "properties": {
74
+ "literalString": {
75
+ "type": "string",
76
+ "enum": [
77
+ "accountCircle",
78
+ "add",
79
+ "arrowBack",
80
+ "arrowForward",
81
+ "attachFile",
82
+ "calendarToday",
83
+ "call",
84
+ "camera",
85
+ "check",
86
+ "close",
87
+ "delete",
88
+ "download",
89
+ "edit",
90
+ "event",
91
+ "error",
92
+ "favorite",
93
+ "favoriteOff",
94
+ "folder",
95
+ "help",
96
+ "home",
97
+ "info",
98
+ "locationOn",
99
+ "lock",
100
+ "lockOpen",
101
+ "mail",
102
+ "menu",
103
+ "moreVert",
104
+ "moreHoriz",
105
+ "notificationsOff",
106
+ "notifications",
107
+ "payment",
108
+ "person",
109
+ "phone",
110
+ "photo",
111
+ "print",
112
+ "refresh",
113
+ "search",
114
+ "send",
115
+ "settings",
116
+ "share",
117
+ "shoppingCart",
118
+ "star",
119
+ "starHalf",
120
+ "starOff",
121
+ "upload",
122
+ "visibility",
123
+ "visibilityOff",
124
+ "warning"
125
+ ]
126
+ },
127
+ "path": {
128
+ "type": "string"
129
+ }
130
+ }
131
+ }
132
+ },
133
+ "required": ["name"]
134
+ },
135
+ "Video": {
136
+ "type": "object",
137
+ "additionalProperties": false,
138
+ "properties": {
139
+ "url": {
140
+ "type": "object",
141
+ "description": "The URL of the video to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/video/url').",
142
+ "additionalProperties": false,
143
+ "properties": {
144
+ "literalString": {
145
+ "type": "string"
146
+ },
147
+ "path": {
148
+ "type": "string"
149
+ }
150
+ }
151
+ }
152
+ },
153
+ "required": ["url"]
154
+ },
155
+ "AudioPlayer": {
156
+ "type": "object",
157
+ "additionalProperties": false,
158
+ "properties": {
159
+ "url": {
160
+ "type": "object",
161
+ "description": "The URL of the audio to be played. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/song/url').",
162
+ "additionalProperties": false,
163
+ "properties": {
164
+ "literalString": {
165
+ "type": "string"
166
+ },
167
+ "path": {
168
+ "type": "string"
169
+ }
170
+ }
171
+ },
172
+ "description": {
173
+ "type": "object",
174
+ "description": "A description of the audio, such as a title or summary. This can be a literal string or a reference to a value in the data model ('path', e.g. '/song/title').",
175
+ "additionalProperties": false,
176
+ "properties": {
177
+ "literalString": {
178
+ "type": "string"
179
+ },
180
+ "path": {
181
+ "type": "string"
182
+ }
183
+ }
184
+ }
185
+ },
186
+ "required": ["url"]
187
+ },
188
+ "Row": {
189
+ "type": "object",
190
+ "additionalProperties": false,
191
+ "properties": {
192
+ "children": {
193
+ "type": "object",
194
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
195
+ "additionalProperties": false,
196
+ "properties": {
197
+ "explicitList": {
198
+ "type": "array",
199
+ "items": {
200
+ "type": "string"
201
+ }
202
+ },
203
+ "template": {
204
+ "type": "object",
205
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
206
+ "additionalProperties": false,
207
+ "properties": {
208
+ "componentId": {
209
+ "type": "string"
210
+ },
211
+ "dataBinding": {
212
+ "type": "string"
213
+ }
214
+ },
215
+ "required": ["componentId", "dataBinding"]
216
+ }
217
+ }
218
+ },
219
+ "distribution": {
220
+ "type": "string",
221
+ "description": "Defines the arrangement of children along the main axis (horizontally). This corresponds to the CSS 'justify-content' property.",
222
+ "enum": [
223
+ "center",
224
+ "end",
225
+ "spaceAround",
226
+ "spaceBetween",
227
+ "spaceEvenly",
228
+ "start"
229
+ ]
230
+ },
231
+ "alignment": {
232
+ "type": "string",
233
+ "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.",
234
+ "enum": ["start", "center", "end", "stretch"]
235
+ }
236
+ },
237
+ "required": ["children"]
238
+ },
239
+ "Column": {
240
+ "type": "object",
241
+ "additionalProperties": false,
242
+ "properties": {
243
+ "children": {
244
+ "type": "object",
245
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
246
+ "additionalProperties": false,
247
+ "properties": {
248
+ "explicitList": {
249
+ "type": "array",
250
+ "items": {
251
+ "type": "string"
252
+ }
253
+ },
254
+ "template": {
255
+ "type": "object",
256
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
257
+ "additionalProperties": false,
258
+ "properties": {
259
+ "componentId": {
260
+ "type": "string"
261
+ },
262
+ "dataBinding": {
263
+ "type": "string"
264
+ }
265
+ },
266
+ "required": ["componentId", "dataBinding"]
267
+ }
268
+ }
269
+ },
270
+ "distribution": {
271
+ "type": "string",
272
+ "description": "Defines the arrangement of children along the main axis (vertically). This corresponds to the CSS 'justify-content' property.",
273
+ "enum": [
274
+ "start",
275
+ "center",
276
+ "end",
277
+ "spaceBetween",
278
+ "spaceAround",
279
+ "spaceEvenly"
280
+ ]
281
+ },
282
+ "alignment": {
283
+ "type": "string",
284
+ "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.",
285
+ "enum": ["center", "end", "start", "stretch"]
286
+ }
287
+ },
288
+ "required": ["children"]
289
+ },
290
+ "List": {
291
+ "type": "object",
292
+ "additionalProperties": false,
293
+ "properties": {
294
+ "children": {
295
+ "type": "object",
296
+ "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.",
297
+ "additionalProperties": false,
298
+ "properties": {
299
+ "explicitList": {
300
+ "type": "array",
301
+ "items": {
302
+ "type": "string"
303
+ }
304
+ },
305
+ "template": {
306
+ "type": "object",
307
+ "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.",
308
+ "additionalProperties": false,
309
+ "properties": {
310
+ "componentId": {
311
+ "type": "string"
312
+ },
313
+ "dataBinding": {
314
+ "type": "string"
315
+ }
316
+ },
317
+ "required": ["componentId", "dataBinding"]
318
+ }
319
+ }
320
+ },
321
+ "direction": {
322
+ "type": "string",
323
+ "description": "The direction in which the list items are laid out.",
324
+ "enum": ["vertical", "horizontal"]
325
+ },
326
+ "alignment": {
327
+ "type": "string",
328
+ "description": "Defines the alignment of children along the cross axis.",
329
+ "enum": ["start", "center", "end", "stretch"]
330
+ }
331
+ },
332
+ "required": ["children"]
333
+ },
334
+ "Card": {
335
+ "type": "object",
336
+ "additionalProperties": false,
337
+ "properties": {
338
+ "child": {
339
+ "type": "string",
340
+ "description": "The ID of the component to be rendered inside the card."
341
+ }
342
+ },
343
+ "required": ["child"]
344
+ },
345
+ "Tabs": {
346
+ "type": "object",
347
+ "additionalProperties": false,
348
+ "properties": {
349
+ "tabItems": {
350
+ "type": "array",
351
+ "description": "An array of objects, where each object defines a tab with a title and a child component.",
352
+ "items": {
353
+ "type": "object",
354
+ "additionalProperties": false,
355
+ "properties": {
356
+ "title": {
357
+ "type": "object",
358
+ "description": "The tab title. Defines the value as either a literal value or a path to data model value (e.g. '/options/title').",
359
+ "additionalProperties": false,
360
+ "properties": {
361
+ "literalString": {
362
+ "type": "string"
363
+ },
364
+ "path": {
365
+ "type": "string"
366
+ }
367
+ }
368
+ },
369
+ "child": {
370
+ "type": "string"
371
+ }
372
+ },
373
+ "required": ["title", "child"]
374
+ }
375
+ }
376
+ },
377
+ "required": ["tabItems"]
378
+ },
379
+ "Divider": {
380
+ "type": "object",
381
+ "additionalProperties": false,
382
+ "properties": {
383
+ "axis": {
384
+ "type": "string",
385
+ "description": "The orientation of the divider.",
386
+ "enum": ["horizontal", "vertical"]
387
+ }
388
+ }
389
+ },
390
+ "Modal": {
391
+ "type": "object",
392
+ "additionalProperties": false,
393
+ "properties": {
394
+ "entryPointChild": {
395
+ "type": "string",
396
+ "description": "The ID of the component that opens the modal when interacted with (e.g., a button)."
397
+ },
398
+ "contentChild": {
399
+ "type": "string",
400
+ "description": "The ID of the component to be displayed inside the modal."
401
+ }
402
+ },
403
+ "required": ["entryPointChild", "contentChild"]
404
+ },
405
+ "Button": {
406
+ "type": "object",
407
+ "additionalProperties": false,
408
+ "properties": {
409
+ "child": {
410
+ "type": "string",
411
+ "description": "The ID of the component to display in the button, typically a Text component."
412
+ },
413
+ "primary": {
414
+ "type": "boolean",
415
+ "description": "Indicates if this button should be styled as the primary action."
416
+ },
417
+ "action": {
418
+ "type": "object",
419
+ "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.",
420
+ "additionalProperties": false,
421
+ "properties": {
422
+ "name": {
423
+ "type": "string"
424
+ },
425
+ "context": {
426
+ "type": "array",
427
+ "items": {
428
+ "type": "object",
429
+ "additionalProperties": false,
430
+ "properties": {
431
+ "key": {
432
+ "type": "string"
433
+ },
434
+ "value": {
435
+ "type": "object",
436
+ "description": "Defines the value to be included in the context as either a literal value or a path to a data model value (e.g. '/user/name').",
437
+ "additionalProperties": false,
438
+ "properties": {
439
+ "path": {
440
+ "type": "string"
441
+ },
442
+ "literalString": {
443
+ "type": "string"
444
+ },
445
+ "literalNumber": {
446
+ "type": "number"
447
+ },
448
+ "literalBoolean": {
449
+ "type": "boolean"
450
+ }
451
+ }
452
+ }
453
+ },
454
+ "required": ["key", "value"]
455
+ }
456
+ }
457
+ },
458
+ "required": ["name"]
459
+ }
460
+ },
461
+ "required": ["child", "action"]
462
+ },
463
+ "CheckBox": {
464
+ "type": "object",
465
+ "additionalProperties": false,
466
+ "properties": {
467
+ "label": {
468
+ "type": "object",
469
+ "description": "The text to display next to the checkbox. Defines the value as either a literal value or a path to data model ('path', e.g. '/option/label').",
470
+ "additionalProperties": false,
471
+ "properties": {
472
+ "literalString": {
473
+ "type": "string"
474
+ },
475
+ "path": {
476
+ "type": "string"
477
+ }
478
+ }
479
+ },
480
+ "value": {
481
+ "type": "object",
482
+ "description": "The current state of the checkbox (true for checked, false for unchecked). This can be a literal boolean ('literalBoolean') or a reference to a value in the data model ('path', e.g. '/filter/open').",
483
+ "additionalProperties": false,
484
+ "properties": {
485
+ "literalBoolean": {
486
+ "type": "boolean"
487
+ },
488
+ "path": {
489
+ "type": "string"
490
+ }
491
+ }
492
+ }
493
+ },
494
+ "required": ["label", "value"]
495
+ },
496
+ "TextField": {
497
+ "type": "object",
498
+ "additionalProperties": false,
499
+ "properties": {
500
+ "label": {
501
+ "type": "object",
502
+ "description": "The text label for the input field. This can be a literal string or a reference to a value in the data model ('path, e.g. '/user/name').",
503
+ "additionalProperties": false,
504
+ "properties": {
505
+ "literalString": {
506
+ "type": "string"
507
+ },
508
+ "path": {
509
+ "type": "string"
510
+ }
511
+ }
512
+ },
513
+ "text": {
514
+ "type": "object",
515
+ "description": "The value of the text field. This can be a literal string or a reference to a value in the data model ('path', e.g. '/user/name').",
516
+ "additionalProperties": false,
517
+ "properties": {
518
+ "literalString": {
519
+ "type": "string"
520
+ },
521
+ "path": {
522
+ "type": "string"
523
+ }
524
+ }
525
+ },
526
+ "textFieldType": {
527
+ "type": "string",
528
+ "description": "The type of input field to display.",
529
+ "enum": ["date", "longText", "number", "shortText", "obscured"]
530
+ },
531
+ "validationRegexp": {
532
+ "type": "string",
533
+ "description": "A regular expression used for client-side validation of the input."
534
+ }
535
+ },
536
+ "required": ["label"]
537
+ },
538
+ "DateTimeInput": {
539
+ "type": "object",
540
+ "additionalProperties": false,
541
+ "properties": {
542
+ "value": {
543
+ "type": "object",
544
+ "description": "The selected date and/or time value in ISO 8601 format. This can be a literal string ('literalString') or a reference to a value in the data model ('path', e.g. '/user/dob').",
545
+ "additionalProperties": false,
546
+ "properties": {
547
+ "literalString": {
548
+ "type": "string"
549
+ },
550
+ "path": {
551
+ "type": "string"
552
+ }
553
+ }
554
+ },
555
+ "enableDate": {
556
+ "type": "boolean",
557
+ "description": "If true, allows the user to select a date."
558
+ },
559
+ "enableTime": {
560
+ "type": "boolean",
561
+ "description": "If true, allows the user to select a time."
562
+ }
563
+ },
564
+ "required": ["value"]
565
+ },
566
+ "MultipleChoice": {
567
+ "type": "object",
568
+ "additionalProperties": false,
569
+ "properties": {
570
+ "selections": {
571
+ "type": "object",
572
+ "description": "The currently selected values for the component. This can be a literal array of strings or a path to an array in the data model('path', e.g. '/hotel/options').",
573
+ "additionalProperties": false,
574
+ "properties": {
575
+ "literalArray": {
576
+ "type": "array",
577
+ "items": {
578
+ "type": "string"
579
+ }
580
+ },
581
+ "path": {
582
+ "type": "string"
583
+ }
584
+ }
585
+ },
586
+ "options": {
587
+ "type": "array",
588
+ "description": "An array of available options for the user to choose from.",
589
+ "items": {
590
+ "type": "object",
591
+ "additionalProperties": false,
592
+ "properties": {
593
+ "label": {
594
+ "type": "object",
595
+ "description": "The text to display for this option. This can be a literal string or a reference to a value in the data model (e.g. '/option/label').",
596
+ "additionalProperties": false,
597
+ "properties": {
598
+ "literalString": {
599
+ "type": "string"
600
+ },
601
+ "path": {
602
+ "type": "string"
603
+ }
604
+ }
605
+ },
606
+ "value": {
607
+ "type": "string",
608
+ "description": "The value to be associated with this option when selected."
609
+ }
610
+ },
611
+ "required": ["label", "value"]
612
+ }
613
+ },
614
+ "maxAllowedSelections": {
615
+ "type": "integer",
616
+ "description": "The maximum number of options that the user is allowed to select."
617
+ }
618
+ },
619
+ "required": ["selections", "options"]
620
+ },
621
+ "Slider": {
622
+ "type": "object",
623
+ "additionalProperties": false,
624
+ "properties": {
625
+ "value": {
626
+ "type": "object",
627
+ "description": "The current value of the slider. This can be a literal number ('literalNumber') or a reference to a value in the data model ('path', e.g. '/restaurant/cost').",
628
+ "additionalProperties": false,
629
+ "properties": {
630
+ "literalNumber": {
631
+ "type": "number"
632
+ },
633
+ "path": {
634
+ "type": "string"
635
+ }
636
+ }
637
+ },
638
+ "minValue": {
639
+ "type": "number",
640
+ "description": "The minimum value of the slider."
641
+ },
642
+ "maxValue": {
643
+ "type": "number",
644
+ "description": "The maximum value of the slider."
645
+ }
646
+ },
647
+ "required": ["value"]
648
+ }
649
+ },
650
+ "styles": {
651
+ "font": {
652
+ "type": "string",
653
+ "description": "The primary font for the UI."
654
+ },
655
+ "primaryColor": {
656
+ "type": "string",
657
+ "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').",
658
+ "pattern": "^#[0-9a-fA-F]{6}$"
659
+ }
660
+ }
661
+ }