mlola-ui 1.9.2 → 1.10.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.
@@ -0,0 +1,1650 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ui.mlola.com/a2ui/catalog/v1",
4
+ "title": "Mlola Render catalog",
5
+ "description": "Mlola UI components for interfaces an agent composes at runtime. Every component is accessible by construction and follows the surface's theme; an agent picks named values (tone, variant, size) and never writes a color, size or class. Generated from Mlola UI 1.10.0; check messages with `npx mlola-ui render check` or the check_render MCP tool, which also hold what a schema cannot (one root, no loops, heading order, values in range).",
6
+ "catalogId": "https://ui.mlola.com/a2ui/catalog/v1",
7
+ "components": {
8
+ "Stack": {
9
+ "type": "object",
10
+ "description": "Places its children in a column with the theme's spacing. Use it as the root of most surfaces.",
11
+ "allOf": [
12
+ {
13
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
14
+ },
15
+ {
16
+ "type": "object",
17
+ "properties": {
18
+ "component": {
19
+ "const": "Stack"
20
+ },
21
+ "children": {
22
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
23
+ "description": "The components inside, top to bottom."
24
+ }
25
+ },
26
+ "required": [
27
+ "component",
28
+ "children"
29
+ ]
30
+ }
31
+ ],
32
+ "unevaluatedProperties": false
33
+ },
34
+ "Row": {
35
+ "type": "object",
36
+ "description": "Places its children side by side and wraps them on a narrow screen. Use it for a row of buttons or badges.",
37
+ "allOf": [
38
+ {
39
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
40
+ },
41
+ {
42
+ "type": "object",
43
+ "properties": {
44
+ "component": {
45
+ "const": "Row"
46
+ },
47
+ "children": {
48
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
49
+ "description": "The components inside, start to end."
50
+ }
51
+ },
52
+ "required": [
53
+ "component",
54
+ "children"
55
+ ]
56
+ }
57
+ ],
58
+ "unevaluatedProperties": false
59
+ },
60
+ "Grid": {
61
+ "type": "object",
62
+ "description": "Places its children in equal columns that collapse to one column on a phone.",
63
+ "allOf": [
64
+ {
65
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
66
+ },
67
+ {
68
+ "type": "object",
69
+ "properties": {
70
+ "component": {
71
+ "const": "Grid"
72
+ },
73
+ "children": {
74
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
75
+ "description": "The components inside, in reading order."
76
+ },
77
+ "columns": {
78
+ "type": "string",
79
+ "enum": [
80
+ "1",
81
+ "2",
82
+ "3",
83
+ "4",
84
+ "6"
85
+ ],
86
+ "description": "How many columns on a wide screen. Leave it out to fit as many as the width allows."
87
+ }
88
+ },
89
+ "required": [
90
+ "component",
91
+ "children"
92
+ ]
93
+ }
94
+ ],
95
+ "unevaluatedProperties": false
96
+ },
97
+ "Heading": {
98
+ "type": "object",
99
+ "description": "A heading. Levels follow the page outline: never skip a level going deeper.",
100
+ "allOf": [
101
+ {
102
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
103
+ },
104
+ {
105
+ "type": "object",
106
+ "properties": {
107
+ "component": {
108
+ "const": "Heading"
109
+ },
110
+ "text": {
111
+ "oneOf": [
112
+ {
113
+ "type": "string",
114
+ "maxLength": 120
115
+ },
116
+ {
117
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
118
+ }
119
+ ],
120
+ "description": "The heading's words."
121
+ },
122
+ "level": {
123
+ "type": "integer",
124
+ "minimum": 1,
125
+ "maximum": 6,
126
+ "default": 2,
127
+ "description": "The outline level, 1 to 6. Inside a chat a surface usually starts at 2."
128
+ }
129
+ },
130
+ "required": [
131
+ "component",
132
+ "text"
133
+ ]
134
+ }
135
+ ],
136
+ "unevaluatedProperties": false
137
+ },
138
+ "Text": {
139
+ "type": "object",
140
+ "description": "A paragraph of plain text.",
141
+ "allOf": [
142
+ {
143
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
144
+ },
145
+ {
146
+ "type": "object",
147
+ "properties": {
148
+ "component": {
149
+ "const": "Text"
150
+ },
151
+ "text": {
152
+ "$ref": "#/$defs/DynamicString",
153
+ "description": "The words. Line breaks are kept; markup is shown as text."
154
+ }
155
+ },
156
+ "required": [
157
+ "component",
158
+ "text"
159
+ ]
160
+ }
161
+ ],
162
+ "unevaluatedProperties": false
163
+ },
164
+ "Card": {
165
+ "type": "object",
166
+ "description": "Groups related content on a surface of its own.",
167
+ "allOf": [
168
+ {
169
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
170
+ },
171
+ {
172
+ "type": "object",
173
+ "properties": {
174
+ "component": {
175
+ "const": "Card"
176
+ },
177
+ "children": {
178
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
179
+ "description": "The card's content."
180
+ },
181
+ "variant": {
182
+ "type": "string",
183
+ "enum": [
184
+ "default",
185
+ "elevated",
186
+ "glass",
187
+ "specular"
188
+ ],
189
+ "default": "default",
190
+ "description": "How the card stands off the page."
191
+ }
192
+ },
193
+ "required": [
194
+ "component",
195
+ "children"
196
+ ]
197
+ }
198
+ ],
199
+ "unevaluatedProperties": false
200
+ },
201
+ "Alert": {
202
+ "type": "object",
203
+ "description": "A message about the surface: a confirmation, a warning or an error. Warnings and errors interrupt a screen reader; calmer tones are announced politely.",
204
+ "allOf": [
205
+ {
206
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
207
+ },
208
+ {
209
+ "type": "object",
210
+ "properties": {
211
+ "component": {
212
+ "const": "Alert"
213
+ },
214
+ "title": {
215
+ "oneOf": [
216
+ {
217
+ "type": "string",
218
+ "maxLength": 120
219
+ },
220
+ {
221
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
222
+ }
223
+ ],
224
+ "description": "A short summary, read first."
225
+ },
226
+ "text": {
227
+ "$ref": "#/$defs/DynamicString",
228
+ "description": "What happened and what to do about it."
229
+ },
230
+ "tone": {
231
+ "type": "string",
232
+ "enum": [
233
+ "neutral",
234
+ "info",
235
+ "success",
236
+ "warning",
237
+ "danger"
238
+ ],
239
+ "default": "neutral",
240
+ "description": "What the message means."
241
+ },
242
+ "variant": {
243
+ "type": "string",
244
+ "enum": [
245
+ "card",
246
+ "soft"
247
+ ],
248
+ "default": "card",
249
+ "description": "A card, or a tinted band across the surface."
250
+ }
251
+ },
252
+ "required": [
253
+ "component",
254
+ "text"
255
+ ]
256
+ }
257
+ ],
258
+ "unevaluatedProperties": false
259
+ },
260
+ "EmptyState": {
261
+ "type": "object",
262
+ "description": "Says that there is nothing here yet and what to do next.",
263
+ "allOf": [
264
+ {
265
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
266
+ },
267
+ {
268
+ "type": "object",
269
+ "properties": {
270
+ "component": {
271
+ "const": "EmptyState"
272
+ },
273
+ "title": {
274
+ "oneOf": [
275
+ {
276
+ "type": "string",
277
+ "maxLength": 120
278
+ },
279
+ {
280
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
281
+ }
282
+ ],
283
+ "description": "What is empty, in a few words."
284
+ },
285
+ "description": {
286
+ "$ref": "#/$defs/DynamicString",
287
+ "description": "What to do next."
288
+ },
289
+ "children": {
290
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
291
+ "description": "Actions, usually one or two Buttons."
292
+ },
293
+ "size": {
294
+ "type": "string",
295
+ "enum": [
296
+ "inline",
297
+ "page"
298
+ ],
299
+ "default": "inline",
300
+ "description": "inline inside a surface, page when it fills one."
301
+ }
302
+ },
303
+ "required": [
304
+ "component",
305
+ "title"
306
+ ]
307
+ }
308
+ ],
309
+ "unevaluatedProperties": false
310
+ },
311
+ "Tabs": {
312
+ "type": "object",
313
+ "description": "Shows one panel at a time, chosen from a row of tabs. Its children are Tab components.",
314
+ "allOf": [
315
+ {
316
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
317
+ },
318
+ {
319
+ "type": "object",
320
+ "properties": {
321
+ "component": {
322
+ "const": "Tabs"
323
+ },
324
+ "label": {
325
+ "oneOf": [
326
+ {
327
+ "type": "string",
328
+ "maxLength": 120
329
+ },
330
+ {
331
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
332
+ }
333
+ ],
334
+ "description": "What the tabs choose between, for a screen reader."
335
+ },
336
+ "children": {
337
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
338
+ "description": "The Tab components, in order."
339
+ },
340
+ "variant": {
341
+ "type": "string",
342
+ "enum": [
343
+ "default",
344
+ "pills",
345
+ "enclosed"
346
+ ],
347
+ "default": "default",
348
+ "description": "The look of the tab row."
349
+ }
350
+ },
351
+ "required": [
352
+ "component",
353
+ "label",
354
+ "children"
355
+ ]
356
+ }
357
+ ],
358
+ "unevaluatedProperties": false
359
+ },
360
+ "Tab": {
361
+ "type": "object",
362
+ "description": "One tab of a Tabs: its name and its panel.",
363
+ "allOf": [
364
+ {
365
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
366
+ },
367
+ {
368
+ "type": "object",
369
+ "properties": {
370
+ "component": {
371
+ "const": "Tab"
372
+ },
373
+ "label": {
374
+ "oneOf": [
375
+ {
376
+ "type": "string",
377
+ "maxLength": 120
378
+ },
379
+ {
380
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
381
+ }
382
+ ],
383
+ "description": "The tab's name."
384
+ },
385
+ "children": {
386
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
387
+ "description": "What the panel shows."
388
+ }
389
+ },
390
+ "required": [
391
+ "component",
392
+ "label",
393
+ "children"
394
+ ]
395
+ }
396
+ ],
397
+ "unevaluatedProperties": false
398
+ },
399
+ "Accordion": {
400
+ "type": "object",
401
+ "description": "A list of sections that open and close. Its children are AccordionItem components.",
402
+ "allOf": [
403
+ {
404
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
405
+ },
406
+ {
407
+ "type": "object",
408
+ "properties": {
409
+ "component": {
410
+ "const": "Accordion"
411
+ },
412
+ "children": {
413
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
414
+ "description": "The AccordionItem components, in order."
415
+ },
416
+ "type": {
417
+ "type": "string",
418
+ "enum": [
419
+ "single",
420
+ "multiple"
421
+ ],
422
+ "default": "single",
423
+ "description": "single keeps one section open at a time; multiple lets several stay open."
424
+ }
425
+ },
426
+ "required": [
427
+ "component",
428
+ "children"
429
+ ]
430
+ }
431
+ ],
432
+ "unevaluatedProperties": false
433
+ },
434
+ "AccordionItem": {
435
+ "type": "object",
436
+ "description": "One section of an Accordion: its title and its content.",
437
+ "allOf": [
438
+ {
439
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
440
+ },
441
+ {
442
+ "type": "object",
443
+ "properties": {
444
+ "component": {
445
+ "const": "AccordionItem"
446
+ },
447
+ "title": {
448
+ "oneOf": [
449
+ {
450
+ "type": "string",
451
+ "maxLength": 120
452
+ },
453
+ {
454
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
455
+ }
456
+ ],
457
+ "description": "The section's title, which opens and closes it."
458
+ },
459
+ "children": {
460
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ChildList",
461
+ "description": "The section's content."
462
+ }
463
+ },
464
+ "required": [
465
+ "component",
466
+ "title",
467
+ "children"
468
+ ]
469
+ }
470
+ ],
471
+ "unevaluatedProperties": false
472
+ },
473
+ "Input": {
474
+ "type": "object",
475
+ "description": "A one-line text field with its label.",
476
+ "allOf": [
477
+ {
478
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
479
+ },
480
+ {
481
+ "type": "object",
482
+ "properties": {
483
+ "component": {
484
+ "const": "Input"
485
+ },
486
+ "label": {
487
+ "oneOf": [
488
+ {
489
+ "type": "string",
490
+ "maxLength": 120
491
+ },
492
+ {
493
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
494
+ }
495
+ ],
496
+ "description": "The field's name, shown above it and read by a screen reader."
497
+ },
498
+ "value": {
499
+ "$ref": "#/$defs/DynamicString",
500
+ "description": "Bind it to the data model ({\"path\": \"/form/email\"}) so the value comes back with the action."
501
+ },
502
+ "type": {
503
+ "type": "string",
504
+ "enum": [
505
+ "text",
506
+ "email",
507
+ "password",
508
+ "url",
509
+ "tel",
510
+ "search"
511
+ ],
512
+ "default": "text",
513
+ "description": "The kind of text, which picks the phone keyboard and the browser's checks."
514
+ },
515
+ "placeholder": {
516
+ "oneOf": [
517
+ {
518
+ "type": "string",
519
+ "maxLength": 120
520
+ },
521
+ {
522
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
523
+ }
524
+ ],
525
+ "description": "An example of what to type. Never a replacement for the label."
526
+ },
527
+ "hint": {
528
+ "oneOf": [
529
+ {
530
+ "type": "string",
531
+ "maxLength": 120
532
+ },
533
+ {
534
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
535
+ }
536
+ ],
537
+ "description": "Help shown under the field."
538
+ },
539
+ "required": {
540
+ "$ref": "#/$defs/DynamicBoolean",
541
+ "description": "The form cannot be sent without it."
542
+ },
543
+ "disabled": {
544
+ "$ref": "#/$defs/DynamicBoolean",
545
+ "description": "Shows the control but does not let it change."
546
+ },
547
+ "size": {
548
+ "type": "string",
549
+ "enum": [
550
+ "sm",
551
+ "md",
552
+ "lg"
553
+ ],
554
+ "default": "md",
555
+ "description": "The control size from the density scale."
556
+ },
557
+ "variant": {
558
+ "type": "string",
559
+ "enum": [
560
+ "default",
561
+ "filled",
562
+ "subtle"
563
+ ],
564
+ "default": "default",
565
+ "description": "How the field sits on its surface."
566
+ }
567
+ },
568
+ "required": [
569
+ "component",
570
+ "label"
571
+ ]
572
+ }
573
+ ],
574
+ "unevaluatedProperties": false
575
+ },
576
+ "Textarea": {
577
+ "type": "object",
578
+ "description": "A text field for several lines, with its label.",
579
+ "allOf": [
580
+ {
581
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
582
+ },
583
+ {
584
+ "type": "object",
585
+ "properties": {
586
+ "component": {
587
+ "const": "Textarea"
588
+ },
589
+ "label": {
590
+ "oneOf": [
591
+ {
592
+ "type": "string",
593
+ "maxLength": 120
594
+ },
595
+ {
596
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
597
+ }
598
+ ],
599
+ "description": "The field's name."
600
+ },
601
+ "value": {
602
+ "$ref": "#/$defs/DynamicString",
603
+ "description": "Bind it to the data model so the value comes back with the action."
604
+ },
605
+ "placeholder": {
606
+ "oneOf": [
607
+ {
608
+ "type": "string",
609
+ "maxLength": 120
610
+ },
611
+ {
612
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
613
+ }
614
+ ],
615
+ "description": "An example of what to type. Never the only label."
616
+ },
617
+ "hint": {
618
+ "oneOf": [
619
+ {
620
+ "type": "string",
621
+ "maxLength": 120
622
+ },
623
+ {
624
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
625
+ }
626
+ ],
627
+ "description": "A short help line under the field."
628
+ },
629
+ "rows": {
630
+ "type": "integer",
631
+ "minimum": 2,
632
+ "maximum": 12,
633
+ "default": 4,
634
+ "description": "How many lines show before it scrolls."
635
+ },
636
+ "required": {
637
+ "$ref": "#/$defs/DynamicBoolean",
638
+ "description": "The person must fill it in before the action is sent; a screen reader says so."
639
+ },
640
+ "disabled": {
641
+ "$ref": "#/$defs/DynamicBoolean",
642
+ "description": "Shows the control but does not let it change."
643
+ }
644
+ },
645
+ "required": [
646
+ "component",
647
+ "label"
648
+ ]
649
+ }
650
+ ],
651
+ "unevaluatedProperties": false
652
+ },
653
+ "Select": {
654
+ "type": "object",
655
+ "description": "Picks one value from a list that opens on demand. Use RadioGroup when there are only two to five options and room to show them.",
656
+ "allOf": [
657
+ {
658
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
659
+ },
660
+ {
661
+ "type": "object",
662
+ "properties": {
663
+ "component": {
664
+ "const": "Select"
665
+ },
666
+ "label": {
667
+ "oneOf": [
668
+ {
669
+ "type": "string",
670
+ "maxLength": 120
671
+ },
672
+ {
673
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
674
+ }
675
+ ],
676
+ "description": "The field's name."
677
+ },
678
+ "options": {
679
+ "oneOf": [
680
+ {
681
+ "type": "array",
682
+ "minItems": 1,
683
+ "maxItems": 100,
684
+ "items": {
685
+ "$ref": "#/$defs/Option"
686
+ }
687
+ },
688
+ {
689
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
690
+ }
691
+ ],
692
+ "description": "The choices, each {\"label\", \"value\"}."
693
+ },
694
+ "value": {
695
+ "$ref": "#/$defs/DynamicString",
696
+ "description": "The chosen option's value. Bind it to the data model."
697
+ },
698
+ "placeholder": {
699
+ "oneOf": [
700
+ {
701
+ "type": "string",
702
+ "maxLength": 120
703
+ },
704
+ {
705
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
706
+ }
707
+ ],
708
+ "description": "Shown while nothing is chosen."
709
+ },
710
+ "required": {
711
+ "$ref": "#/$defs/DynamicBoolean",
712
+ "description": "The person must fill it in before the action is sent; a screen reader says so."
713
+ },
714
+ "disabled": {
715
+ "$ref": "#/$defs/DynamicBoolean",
716
+ "description": "Shows the control but does not let it change."
717
+ },
718
+ "size": {
719
+ "type": "string",
720
+ "enum": [
721
+ "sm",
722
+ "md",
723
+ "lg"
724
+ ],
725
+ "default": "md",
726
+ "description": "The control size from the density scale."
727
+ }
728
+ },
729
+ "required": [
730
+ "component",
731
+ "label",
732
+ "options"
733
+ ]
734
+ }
735
+ ],
736
+ "unevaluatedProperties": false
737
+ },
738
+ "RadioGroup": {
739
+ "type": "object",
740
+ "description": "Picks one value from options that are all visible.",
741
+ "allOf": [
742
+ {
743
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
744
+ },
745
+ {
746
+ "type": "object",
747
+ "properties": {
748
+ "component": {
749
+ "const": "RadioGroup"
750
+ },
751
+ "label": {
752
+ "oneOf": [
753
+ {
754
+ "type": "string",
755
+ "maxLength": 120
756
+ },
757
+ {
758
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
759
+ }
760
+ ],
761
+ "description": "The question the options answer."
762
+ },
763
+ "options": {
764
+ "oneOf": [
765
+ {
766
+ "type": "array",
767
+ "minItems": 2,
768
+ "maxItems": 100,
769
+ "items": {
770
+ "$ref": "#/$defs/Option"
771
+ }
772
+ },
773
+ {
774
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
775
+ }
776
+ ],
777
+ "description": "The choices, each {\"label\", \"value\"}."
778
+ },
779
+ "value": {
780
+ "$ref": "#/$defs/DynamicString",
781
+ "description": "The chosen option's value. Bind it to the data model."
782
+ },
783
+ "orientation": {
784
+ "type": "string",
785
+ "enum": [
786
+ "horizontal",
787
+ "vertical"
788
+ ],
789
+ "default": "vertical",
790
+ "description": "Options stacked or in a row."
791
+ },
792
+ "required": {
793
+ "$ref": "#/$defs/DynamicBoolean",
794
+ "description": "The person must fill it in before the action is sent; a screen reader says so."
795
+ },
796
+ "disabled": {
797
+ "$ref": "#/$defs/DynamicBoolean",
798
+ "description": "Shows the control but does not let it change."
799
+ }
800
+ },
801
+ "required": [
802
+ "component",
803
+ "label",
804
+ "options"
805
+ ]
806
+ }
807
+ ],
808
+ "unevaluatedProperties": false
809
+ },
810
+ "Checkbox": {
811
+ "type": "object",
812
+ "description": "A yes or no choice with its label.",
813
+ "allOf": [
814
+ {
815
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
816
+ },
817
+ {
818
+ "type": "object",
819
+ "properties": {
820
+ "component": {
821
+ "const": "Checkbox"
822
+ },
823
+ "label": {
824
+ "oneOf": [
825
+ {
826
+ "type": "string",
827
+ "maxLength": 120
828
+ },
829
+ {
830
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
831
+ }
832
+ ],
833
+ "description": "What checking it means."
834
+ },
835
+ "checked": {
836
+ "$ref": "#/$defs/DynamicBoolean",
837
+ "description": "Bind it to the data model so the choice comes back with the action."
838
+ },
839
+ "description": {
840
+ "oneOf": [
841
+ {
842
+ "type": "string",
843
+ "maxLength": 120
844
+ },
845
+ {
846
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
847
+ }
848
+ ],
849
+ "description": "More about the choice, under the label."
850
+ },
851
+ "required": {
852
+ "$ref": "#/$defs/DynamicBoolean",
853
+ "description": "The person must fill it in before the action is sent; a screen reader says so."
854
+ },
855
+ "disabled": {
856
+ "$ref": "#/$defs/DynamicBoolean",
857
+ "description": "Shows the control but does not let it change."
858
+ }
859
+ },
860
+ "required": [
861
+ "component",
862
+ "label"
863
+ ]
864
+ }
865
+ ],
866
+ "unevaluatedProperties": false
867
+ },
868
+ "Switch": {
869
+ "type": "object",
870
+ "description": "Turns a setting on or off right away.",
871
+ "allOf": [
872
+ {
873
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
874
+ },
875
+ {
876
+ "type": "object",
877
+ "properties": {
878
+ "component": {
879
+ "const": "Switch"
880
+ },
881
+ "label": {
882
+ "oneOf": [
883
+ {
884
+ "type": "string",
885
+ "maxLength": 120
886
+ },
887
+ {
888
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
889
+ }
890
+ ],
891
+ "description": "The setting it turns on."
892
+ },
893
+ "checked": {
894
+ "$ref": "#/$defs/DynamicBoolean",
895
+ "description": "Bind it to the data model."
896
+ },
897
+ "disabled": {
898
+ "$ref": "#/$defs/DynamicBoolean",
899
+ "description": "Shows the control but does not let it change."
900
+ },
901
+ "size": {
902
+ "type": "string",
903
+ "enum": [
904
+ "sm",
905
+ "md",
906
+ "lg"
907
+ ],
908
+ "default": "md",
909
+ "description": "The control size from the density scale."
910
+ }
911
+ },
912
+ "required": [
913
+ "component",
914
+ "label"
915
+ ]
916
+ }
917
+ ],
918
+ "unevaluatedProperties": false
919
+ },
920
+ "Slider": {
921
+ "type": "object",
922
+ "description": "Picks a number in a range by dragging or with the arrow keys.",
923
+ "allOf": [
924
+ {
925
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
926
+ },
927
+ {
928
+ "type": "object",
929
+ "properties": {
930
+ "component": {
931
+ "const": "Slider"
932
+ },
933
+ "label": {
934
+ "oneOf": [
935
+ {
936
+ "type": "string",
937
+ "maxLength": 120
938
+ },
939
+ {
940
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
941
+ }
942
+ ],
943
+ "description": "What the number is."
944
+ },
945
+ "value": {
946
+ "$ref": "#/$defs/DynamicNumber",
947
+ "description": "Bind it to the data model."
948
+ },
949
+ "min": {
950
+ "type": "number",
951
+ "default": 0,
952
+ "description": "The lowest value."
953
+ },
954
+ "max": {
955
+ "type": "number",
956
+ "default": 100,
957
+ "description": "The highest value."
958
+ },
959
+ "step": {
960
+ "type": "number",
961
+ "default": 1,
962
+ "description": "How far one arrow press moves it."
963
+ },
964
+ "disabled": {
965
+ "$ref": "#/$defs/DynamicBoolean",
966
+ "description": "Shows the control but does not let it change."
967
+ },
968
+ "size": {
969
+ "type": "string",
970
+ "enum": [
971
+ "sm",
972
+ "md"
973
+ ],
974
+ "default": "md",
975
+ "description": "The control size from the density scale."
976
+ }
977
+ },
978
+ "required": [
979
+ "component",
980
+ "label"
981
+ ]
982
+ }
983
+ ],
984
+ "unevaluatedProperties": false
985
+ },
986
+ "DatePicker": {
987
+ "type": "object",
988
+ "description": "A date field that opens a calendar and picks one day. The reader sees the date in their own format; the value is an ISO date.",
989
+ "allOf": [
990
+ {
991
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
992
+ },
993
+ {
994
+ "type": "object",
995
+ "properties": {
996
+ "component": {
997
+ "const": "DatePicker"
998
+ },
999
+ "label": {
1000
+ "oneOf": [
1001
+ {
1002
+ "type": "string",
1003
+ "maxLength": 120
1004
+ },
1005
+ {
1006
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1007
+ }
1008
+ ],
1009
+ "description": "The field's name."
1010
+ },
1011
+ "value": {
1012
+ "oneOf": [
1013
+ {
1014
+ "type": "string",
1015
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
1016
+ },
1017
+ {
1018
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1019
+ }
1020
+ ],
1021
+ "description": "The chosen day as an ISO date, like \"2026-10-12\". Bind it to the data model so it comes back with the action."
1022
+ },
1023
+ "min": {
1024
+ "type": "string",
1025
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
1026
+ "description": "The earliest day that can be picked."
1027
+ },
1028
+ "max": {
1029
+ "type": "string",
1030
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
1031
+ "description": "The latest day that can be picked."
1032
+ },
1033
+ "hint": {
1034
+ "oneOf": [
1035
+ {
1036
+ "type": "string",
1037
+ "maxLength": 120
1038
+ },
1039
+ {
1040
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1041
+ }
1042
+ ],
1043
+ "description": "Help shown under the field."
1044
+ },
1045
+ "required": {
1046
+ "$ref": "#/$defs/DynamicBoolean",
1047
+ "description": "The form cannot be sent without it."
1048
+ },
1049
+ "disabled": {
1050
+ "$ref": "#/$defs/DynamicBoolean",
1051
+ "description": "Shows the control but does not let it change."
1052
+ }
1053
+ },
1054
+ "required": [
1055
+ "component",
1056
+ "label"
1057
+ ]
1058
+ }
1059
+ ],
1060
+ "unevaluatedProperties": false
1061
+ },
1062
+ "Button": {
1063
+ "type": "object",
1064
+ "description": "Sends an action back to the agent. Its text says what happens (\"Create workspace\", not \"Submit\").",
1065
+ "allOf": [
1066
+ {
1067
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
1068
+ },
1069
+ {
1070
+ "type": "object",
1071
+ "properties": {
1072
+ "component": {
1073
+ "const": "Button"
1074
+ },
1075
+ "text": {
1076
+ "oneOf": [
1077
+ {
1078
+ "type": "string",
1079
+ "maxLength": 120
1080
+ },
1081
+ {
1082
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1083
+ }
1084
+ ],
1085
+ "description": "What pressing it does."
1086
+ },
1087
+ "action": {
1088
+ "$ref": "#/$defs/Action",
1089
+ "description": "The event sent when it is pressed."
1090
+ },
1091
+ "variant": {
1092
+ "type": "string",
1093
+ "enum": [
1094
+ "primary",
1095
+ "secondary",
1096
+ "subtle",
1097
+ "danger",
1098
+ "outline",
1099
+ "link"
1100
+ ],
1101
+ "default": "primary",
1102
+ "description": "primary for the main action of a surface, one at most."
1103
+ },
1104
+ "size": {
1105
+ "type": "string",
1106
+ "enum": [
1107
+ "sm",
1108
+ "md",
1109
+ "lg"
1110
+ ],
1111
+ "default": "md",
1112
+ "description": "Icon-only buttons are not in the catalog: every button has words."
1113
+ },
1114
+ "width": {
1115
+ "type": "string",
1116
+ "enum": [
1117
+ "auto",
1118
+ "full"
1119
+ ],
1120
+ "default": "auto",
1121
+ "description": "auto fits the words, full fills the container."
1122
+ },
1123
+ "disabled": {
1124
+ "$ref": "#/$defs/DynamicBoolean",
1125
+ "description": "Shows the control but does not let it change."
1126
+ }
1127
+ },
1128
+ "required": [
1129
+ "component",
1130
+ "text",
1131
+ "action"
1132
+ ]
1133
+ }
1134
+ ],
1135
+ "unevaluatedProperties": false
1136
+ },
1137
+ "Badge": {
1138
+ "type": "object",
1139
+ "description": "A short label for a status or a count.",
1140
+ "allOf": [
1141
+ {
1142
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
1143
+ },
1144
+ {
1145
+ "type": "object",
1146
+ "properties": {
1147
+ "component": {
1148
+ "const": "Badge"
1149
+ },
1150
+ "text": {
1151
+ "oneOf": [
1152
+ {
1153
+ "type": "string",
1154
+ "maxLength": 120
1155
+ },
1156
+ {
1157
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1158
+ }
1159
+ ],
1160
+ "description": "The badge's words, a few at most."
1161
+ },
1162
+ "tone": {
1163
+ "type": "string",
1164
+ "enum": [
1165
+ "neutral",
1166
+ "primary",
1167
+ "info",
1168
+ "success",
1169
+ "warning",
1170
+ "danger"
1171
+ ],
1172
+ "default": "neutral",
1173
+ "description": "What the status means."
1174
+ },
1175
+ "variant": {
1176
+ "type": "string",
1177
+ "enum": [
1178
+ "soft",
1179
+ "solid",
1180
+ "outline"
1181
+ ],
1182
+ "default": "soft",
1183
+ "description": "How strongly the badge stands out."
1184
+ },
1185
+ "size": {
1186
+ "type": "string",
1187
+ "enum": [
1188
+ "sm",
1189
+ "md",
1190
+ "lg"
1191
+ ],
1192
+ "default": "md",
1193
+ "description": "The control size from the density scale."
1194
+ }
1195
+ },
1196
+ "required": [
1197
+ "component",
1198
+ "text"
1199
+ ]
1200
+ }
1201
+ ],
1202
+ "unevaluatedProperties": false
1203
+ },
1204
+ "Progress": {
1205
+ "type": "object",
1206
+ "description": "Shows how far along something is.",
1207
+ "allOf": [
1208
+ {
1209
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
1210
+ },
1211
+ {
1212
+ "type": "object",
1213
+ "properties": {
1214
+ "component": {
1215
+ "const": "Progress"
1216
+ },
1217
+ "label": {
1218
+ "oneOf": [
1219
+ {
1220
+ "type": "string",
1221
+ "maxLength": 120
1222
+ },
1223
+ {
1224
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1225
+ }
1226
+ ],
1227
+ "description": "What is in progress, for a screen reader."
1228
+ },
1229
+ "value": {
1230
+ "$ref": "#/$defs/DynamicNumber",
1231
+ "description": "How far along, from 0 to max."
1232
+ },
1233
+ "max": {
1234
+ "type": "number",
1235
+ "default": 100,
1236
+ "description": "The value that means complete."
1237
+ },
1238
+ "showLabel": {
1239
+ "$ref": "#/$defs/DynamicBoolean",
1240
+ "description": "Shows the percentage beside the bar."
1241
+ },
1242
+ "tone": {
1243
+ "type": "string",
1244
+ "enum": [
1245
+ "primary",
1246
+ "info",
1247
+ "success",
1248
+ "warning",
1249
+ "danger"
1250
+ ],
1251
+ "default": "primary",
1252
+ "description": "What the progress means."
1253
+ },
1254
+ "size": {
1255
+ "type": "string",
1256
+ "enum": [
1257
+ "sm",
1258
+ "md",
1259
+ "lg"
1260
+ ],
1261
+ "default": "md",
1262
+ "description": "The control size from the density scale."
1263
+ }
1264
+ },
1265
+ "required": [
1266
+ "component",
1267
+ "label"
1268
+ ]
1269
+ }
1270
+ ],
1271
+ "unevaluatedProperties": false
1272
+ },
1273
+ "Avatar": {
1274
+ "type": "object",
1275
+ "description": "A person or a team shown by their initials.",
1276
+ "allOf": [
1277
+ {
1278
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
1279
+ },
1280
+ {
1281
+ "type": "object",
1282
+ "properties": {
1283
+ "component": {
1284
+ "const": "Avatar"
1285
+ },
1286
+ "name": {
1287
+ "oneOf": [
1288
+ {
1289
+ "type": "string",
1290
+ "maxLength": 120
1291
+ },
1292
+ {
1293
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1294
+ }
1295
+ ],
1296
+ "description": "The full name: the initials come from it and a screen reader reads it."
1297
+ },
1298
+ "size": {
1299
+ "type": "string",
1300
+ "enum": [
1301
+ "xs",
1302
+ "sm",
1303
+ "md",
1304
+ "lg",
1305
+ "xl"
1306
+ ],
1307
+ "default": "md",
1308
+ "description": "The avatar's size."
1309
+ },
1310
+ "status": {
1311
+ "type": "string",
1312
+ "enum": [
1313
+ "online",
1314
+ "offline",
1315
+ "away",
1316
+ "busy"
1317
+ ],
1318
+ "description": "A presence dot, announced with the name."
1319
+ }
1320
+ },
1321
+ "required": [
1322
+ "component",
1323
+ "name"
1324
+ ]
1325
+ }
1326
+ ],
1327
+ "unevaluatedProperties": false
1328
+ },
1329
+ "Table": {
1330
+ "type": "object",
1331
+ "description": "Rows of data under named columns. Cells hold text and numbers.",
1332
+ "allOf": [
1333
+ {
1334
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/ComponentCommon"
1335
+ },
1336
+ {
1337
+ "type": "object",
1338
+ "properties": {
1339
+ "component": {
1340
+ "const": "Table"
1341
+ },
1342
+ "caption": {
1343
+ "oneOf": [
1344
+ {
1345
+ "type": "string",
1346
+ "maxLength": 120
1347
+ },
1348
+ {
1349
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1350
+ }
1351
+ ],
1352
+ "description": "What the table shows, read first by a screen reader."
1353
+ },
1354
+ "columns": {
1355
+ "type": "array",
1356
+ "minItems": 1,
1357
+ "maxItems": 12,
1358
+ "items": {
1359
+ "type": "object",
1360
+ "properties": {
1361
+ "key": {
1362
+ "type": "string",
1363
+ "pattern": "^[A-Za-z0-9_-]{1,64}$",
1364
+ "description": "The row field this column shows."
1365
+ },
1366
+ "label": {
1367
+ "type": "string",
1368
+ "maxLength": 120,
1369
+ "description": "The column's heading."
1370
+ },
1371
+ "align": {
1372
+ "type": "string",
1373
+ "enum": [
1374
+ "left",
1375
+ "center",
1376
+ "right"
1377
+ ]
1378
+ }
1379
+ },
1380
+ "required": [
1381
+ "key",
1382
+ "label"
1383
+ ],
1384
+ "additionalProperties": false
1385
+ },
1386
+ "description": "Each {\"key\", \"label\", \"align\"?}: key names the row field the column shows."
1387
+ },
1388
+ "rows": {
1389
+ "oneOf": [
1390
+ {
1391
+ "type": "array",
1392
+ "maxItems": 500,
1393
+ "items": {
1394
+ "type": "object",
1395
+ "additionalProperties": {
1396
+ "type": [
1397
+ "string",
1398
+ "number",
1399
+ "boolean",
1400
+ "null"
1401
+ ]
1402
+ }
1403
+ }
1404
+ },
1405
+ {
1406
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1407
+ }
1408
+ ],
1409
+ "description": "An array of objects keyed by column key, or a path to one in the data model."
1410
+ },
1411
+ "size": {
1412
+ "type": "string",
1413
+ "enum": [
1414
+ "sm",
1415
+ "md"
1416
+ ],
1417
+ "default": "md",
1418
+ "description": "Row density."
1419
+ }
1420
+ },
1421
+ "required": [
1422
+ "component",
1423
+ "caption",
1424
+ "columns",
1425
+ "rows"
1426
+ ]
1427
+ }
1428
+ ],
1429
+ "unevaluatedProperties": false
1430
+ }
1431
+ },
1432
+ "functions": {},
1433
+ "$defs": {
1434
+ "DynamicString": {
1435
+ "oneOf": [
1436
+ {
1437
+ "type": "string"
1438
+ },
1439
+ {
1440
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1441
+ }
1442
+ ]
1443
+ },
1444
+ "DynamicNumber": {
1445
+ "oneOf": [
1446
+ {
1447
+ "type": "number"
1448
+ },
1449
+ {
1450
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1451
+ }
1452
+ ]
1453
+ },
1454
+ "DynamicBoolean": {
1455
+ "oneOf": [
1456
+ {
1457
+ "type": "boolean"
1458
+ },
1459
+ {
1460
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1461
+ }
1462
+ ]
1463
+ },
1464
+ "Action": {
1465
+ "type": "object",
1466
+ "description": "What a press sends back to the agent: an event with a name and the values it needs.",
1467
+ "properties": {
1468
+ "event": {
1469
+ "type": "object",
1470
+ "properties": {
1471
+ "name": {
1472
+ "type": "string",
1473
+ "pattern": "^[A-Za-z][A-Za-z0-9_.:-]{0,63}$"
1474
+ },
1475
+ "context": {
1476
+ "type": "object",
1477
+ "maxProperties": 32,
1478
+ "additionalProperties": {
1479
+ "oneOf": [
1480
+ {
1481
+ "type": [
1482
+ "string",
1483
+ "number",
1484
+ "boolean",
1485
+ "null"
1486
+ ]
1487
+ },
1488
+ {
1489
+ "type": "array",
1490
+ "items": {
1491
+ "type": [
1492
+ "string",
1493
+ "number",
1494
+ "boolean",
1495
+ "null"
1496
+ ]
1497
+ }
1498
+ },
1499
+ {
1500
+ "$ref": "https://a2ui.org/specification/v0_9/common_types.json#/$defs/DataBinding"
1501
+ }
1502
+ ]
1503
+ }
1504
+ }
1505
+ },
1506
+ "required": [
1507
+ "name"
1508
+ ],
1509
+ "additionalProperties": false
1510
+ }
1511
+ },
1512
+ "required": [
1513
+ "event"
1514
+ ],
1515
+ "additionalProperties": false
1516
+ },
1517
+ "Option": {
1518
+ "type": "object",
1519
+ "properties": {
1520
+ "label": {
1521
+ "type": "string",
1522
+ "minLength": 1,
1523
+ "maxLength": 120
1524
+ },
1525
+ "value": {
1526
+ "type": "string",
1527
+ "minLength": 1,
1528
+ "maxLength": 120
1529
+ }
1530
+ },
1531
+ "required": [
1532
+ "label",
1533
+ "value"
1534
+ ],
1535
+ "additionalProperties": false
1536
+ },
1537
+ "theme": {
1538
+ "type": "object",
1539
+ "description": "The surface's look, by name. Colors, type and shape come from the theme and are never set one by one.",
1540
+ "properties": {
1541
+ "name": {
1542
+ "type": "string",
1543
+ "enum": [
1544
+ "graphite",
1545
+ "atelier",
1546
+ "machined",
1547
+ "aerogel",
1548
+ "nordic"
1549
+ ],
1550
+ "default": "graphite"
1551
+ },
1552
+ "mode": {
1553
+ "type": "string",
1554
+ "enum": [
1555
+ "light",
1556
+ "dark",
1557
+ "system"
1558
+ ],
1559
+ "default": "system"
1560
+ }
1561
+ },
1562
+ "additionalProperties": false
1563
+ },
1564
+ "anyComponent": {
1565
+ "oneOf": [
1566
+ {
1567
+ "$ref": "#/components/Stack"
1568
+ },
1569
+ {
1570
+ "$ref": "#/components/Row"
1571
+ },
1572
+ {
1573
+ "$ref": "#/components/Grid"
1574
+ },
1575
+ {
1576
+ "$ref": "#/components/Heading"
1577
+ },
1578
+ {
1579
+ "$ref": "#/components/Text"
1580
+ },
1581
+ {
1582
+ "$ref": "#/components/Card"
1583
+ },
1584
+ {
1585
+ "$ref": "#/components/Alert"
1586
+ },
1587
+ {
1588
+ "$ref": "#/components/EmptyState"
1589
+ },
1590
+ {
1591
+ "$ref": "#/components/Tabs"
1592
+ },
1593
+ {
1594
+ "$ref": "#/components/Tab"
1595
+ },
1596
+ {
1597
+ "$ref": "#/components/Accordion"
1598
+ },
1599
+ {
1600
+ "$ref": "#/components/AccordionItem"
1601
+ },
1602
+ {
1603
+ "$ref": "#/components/Input"
1604
+ },
1605
+ {
1606
+ "$ref": "#/components/Textarea"
1607
+ },
1608
+ {
1609
+ "$ref": "#/components/Select"
1610
+ },
1611
+ {
1612
+ "$ref": "#/components/RadioGroup"
1613
+ },
1614
+ {
1615
+ "$ref": "#/components/Checkbox"
1616
+ },
1617
+ {
1618
+ "$ref": "#/components/Switch"
1619
+ },
1620
+ {
1621
+ "$ref": "#/components/Slider"
1622
+ },
1623
+ {
1624
+ "$ref": "#/components/DatePicker"
1625
+ },
1626
+ {
1627
+ "$ref": "#/components/Button"
1628
+ },
1629
+ {
1630
+ "$ref": "#/components/Badge"
1631
+ },
1632
+ {
1633
+ "$ref": "#/components/Progress"
1634
+ },
1635
+ {
1636
+ "$ref": "#/components/Avatar"
1637
+ },
1638
+ {
1639
+ "$ref": "#/components/Table"
1640
+ }
1641
+ ],
1642
+ "discriminator": {
1643
+ "propertyName": "component"
1644
+ }
1645
+ },
1646
+ "anyFunction": {
1647
+ "not": {}
1648
+ }
1649
+ }
1650
+ }