view-contracts 0.3.5 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +10 -3
  2. package/cli-contract.yaml +40 -0
  3. package/dist/preview-style-helpers.js +2 -0
  4. package/dist/preview-style-helpers.js.map +7 -0
  5. package/dist/preview.mjs +152 -0
  6. package/dist/preview.mjs.map +7 -0
  7. package/dist/view-contracts.bundle.mjs +457 -248
  8. package/dist/view-contracts.bundle.mjs.map +4 -4
  9. package/docs/cli-reference.md +36 -0
  10. package/package.json +28 -1
  11. package/renderers/compose/renderRuntime.ts +40 -0
  12. package/renderers/react/defaults/theme.yaml +52 -0
  13. package/renderers/react/defaults/tokens.yaml +76 -1
  14. package/renderers/react/elementMap.ts +30 -6
  15. package/renderers/react/elements.yaml +17 -5
  16. package/renderers/react/lowering/foldStyle.ts +13 -1
  17. package/renderers/react/lowering/lowerToJsx.ts +21 -40
  18. package/renderers/react/paths.ts +5 -10
  19. package/renderers/react/preview/components.ts +23 -0
  20. package/renderers/react/preview/index.ts +3 -0
  21. package/renderers/react/preview/start.tsx +42 -0
  22. package/renderers/react/preview/style-helpers.ts +5 -0
  23. package/renderers/react/preview/vocabulary.tsx +75 -0
  24. package/renderers/react/runtime/structural.css +38 -0
  25. package/renderers/react/style/foldLiterals.ts +25 -4
  26. package/renderers/swiftui/README.md +48 -10
  27. package/renderers/swiftui/elementMap.ts +45 -0
  28. package/renderers/swiftui/elements.yaml +82 -0
  29. package/renderers/swiftui/index.ts +5 -0
  30. package/renderers/swiftui/lowering/lowerToSwiftUI.ts +761 -0
  31. package/renderers/swiftui/lowering/modifiers.ts +221 -0
  32. package/renderers/swiftui/renderComponents.ts +79 -0
  33. package/renderers/swiftui/renderRuntime.ts +139 -0
  34. package/renderers/swiftui/renderTheme.ts +274 -0
  35. package/spec/ui-dsl.linter-rules.json +0 -7
  36. package/spec/ui-dsl.meta.json +5 -0
  37. package/spec/ui-dsl.schema.json +333 -259
  38. package/renderers/react/runtime/theme.css +0 -65
  39. package/src/generated/schema/allowed-components.ts +0 -36
  40. package/src/generated/schema/dsl-enums.ts +0 -19
  41. package/src/generated/schema/dsl-properties.ts +0 -64
  42. package/src/generated/schema/index.ts +0 -4
  43. package/src/generated/schema/lowering-style-properties.ts +0 -35
  44. package/src/generated/schema/react-renderer-element-config.ts +0 -27
  45. package/src/generated/schema/schema-document.ts +0 -33
@@ -113,8 +113,8 @@
113
113
  },
114
114
  "role": {
115
115
  "type": "string",
116
- "enum": "role",
117
116
  "x-category": "identity",
117
+ "enum": "role",
118
118
  "description": "Accessibility semantics (not HTML tag names)"
119
119
  },
120
120
  "label": {
@@ -129,60 +129,31 @@
129
129
  },
130
130
  "enabled": {
131
131
  "type": "boolean",
132
- "x-category": "state",
133
- "x-appliesTo": [
134
- "Button",
135
- "IconButton",
136
- "TextInput",
137
- "TextArea",
138
- "Select",
139
- "Checkbox",
140
- "Radio",
141
- "Switch"
142
- ]
132
+ "x-category": "state"
143
133
  },
144
134
  "selected": {
145
135
  "type": "boolean",
146
- "x-category": "state",
147
- "x-appliesTo": [
148
- "ListItem"
149
- ]
136
+ "x-category": "state"
150
137
  },
151
138
  "checked": {
152
139
  "type": "boolean",
153
- "x-category": "state",
154
- "x-appliesTo": [
155
- "Checkbox",
156
- "Radio",
157
- "Switch"
158
- ]
140
+ "x-category": "state"
159
141
  },
160
142
  "readonly": {
161
143
  "type": "boolean",
162
- "x-category": "state",
163
- "x-appliesTo": [
164
- "TextInput",
165
- "TextArea"
166
- ]
144
+ "x-category": "state"
167
145
  },
168
146
  "required": {
169
147
  "type": "boolean",
170
- "x-category": "state",
171
- "x-appliesTo": [
172
- "TextInput",
173
- "TextArea",
174
- "Select",
175
- "Checkbox",
176
- "Field"
177
- ]
148
+ "x-category": "state"
178
149
  },
179
150
  "width": {
180
151
  "type": [
181
152
  "string",
182
153
  "number"
183
154
  ],
184
- "enum": "widthSize",
185
155
  "x-category": "size",
156
+ "enum": "widthSize",
186
157
  "x-notes": "string: wrap|fill; number: fixed px/dp/pt; flex ratio uses weight property"
187
158
  },
188
159
  "height": {
@@ -190,8 +161,8 @@
190
161
  "string",
191
162
  "number"
192
163
  ],
193
- "enum": "heightSize",
194
164
  "x-category": "size",
165
+ "enum": "heightSize",
195
166
  "x-notes": "string: wrap|fill; number: fixed px/dp/pt; flex ratio uses weight property"
196
167
  },
197
168
  "minWidth": {
@@ -220,10 +191,7 @@
220
191
  },
221
192
  "aspectRatio": {
222
193
  "type": "number",
223
- "x-category": "size",
224
- "x-appliesTo": [
225
- "Image"
226
- ]
194
+ "x-category": "size"
227
195
  },
228
196
  "weight": {
229
197
  "type": "number",
@@ -243,72 +211,43 @@
243
211
  "string",
244
212
  "number"
245
213
  ],
246
- "x-category": "spacing",
247
- "x-appliesTo": [
248
- "Row",
249
- "Column",
250
- "List"
251
- ]
214
+ "x-category": "spacing"
252
215
  },
253
216
  "align": {
254
217
  "type": "string",
255
- "enum": "align",
256
218
  "x-category": "alignment",
257
- "x-appliesTo": [
258
- "Row",
259
- "Column"
260
- ]
219
+ "enum": "align"
261
220
  },
262
221
  "justify": {
263
222
  "type": "string",
264
- "enum": "justify",
265
223
  "x-category": "alignment",
266
- "x-appliesTo": [
267
- "Row",
268
- "Column"
269
- ]
224
+ "enum": "justify"
270
225
  },
271
226
  "selfAlign": {
272
227
  "type": "string",
273
- "enum": "align",
274
- "x-category": "alignment"
228
+ "x-category": "alignment",
229
+ "enum": "align"
275
230
  },
276
231
  "contentAlign": {
277
232
  "type": "string",
278
- "enum": "contentAlign",
279
233
  "x-category": "alignment",
280
- "x-appliesTo": [
281
- "Box",
282
- "Stack"
283
- ]
234
+ "enum": "contentAlign"
284
235
  },
285
236
  "axis": {
286
237
  "type": "string",
287
- "enum": "axis",
288
238
  "x-category": "direction",
289
- "x-appliesTo": [
290
- "ScrollArea",
291
- "List",
292
- "Divider"
293
- ]
239
+ "enum": "axis"
294
240
  },
295
241
  "direction": {
296
242
  "type": "string",
297
- "enum": "direction",
298
243
  "x-category": "direction",
299
- "x-appliesTo": [
300
- "App",
301
- "Page"
302
- ],
244
+ "enum": "direction",
303
245
  "description": "Text/layout direction; set at app or screen root, not per layout container"
304
246
  },
305
247
  "scroll": {
306
248
  "type": "string",
307
- "enum": "scroll",
308
249
  "x-category": "overflow",
309
- "x-appliesTo": [
310
- "ScrollArea"
311
- ]
250
+ "enum": "scroll"
312
251
  },
313
252
  "background": {
314
253
  "type": "string",
@@ -318,11 +257,6 @@
318
257
  "foreground": {
319
258
  "type": "string",
320
259
  "x-category": "visual",
321
- "x-appliesTo": [
322
- "Text",
323
- "Icon",
324
- "Button"
325
- ],
326
260
  "x-notes": "color token"
327
261
  },
328
262
  "border": {
@@ -330,8 +264,8 @@
330
264
  "string",
331
265
  "object"
332
266
  ],
333
- "enum": "border",
334
267
  "x-category": "visual",
268
+ "enum": "border",
335
269
  "x-notes": "none|token|{width,color}"
336
270
  },
337
271
  "radius": {
@@ -341,8 +275,8 @@
341
275
  },
342
276
  "shadow": {
343
277
  "type": "string",
344
- "enum": "shadow",
345
- "x-category": "visual"
278
+ "x-category": "visual",
279
+ "enum": "shadow"
346
280
  },
347
281
  "opacity": {
348
282
  "type": "number",
@@ -351,124 +285,75 @@
351
285
  },
352
286
  "clip": {
353
287
  "type": "string",
354
- "enum": "clip",
355
- "x-category": "visual"
288
+ "x-category": "visual",
289
+ "enum": "clip"
356
290
  },
357
291
  "textStyle": {
358
292
  "type": "string",
359
293
  "x-category": "text",
360
- "x-appliesTo": [
361
- "Text",
362
- "Heading"
363
- ],
364
294
  "x-notes": "typography token"
365
295
  },
366
296
  "textAlign": {
367
297
  "type": "string",
368
- "enum": "textAlign",
369
298
  "x-category": "text",
370
- "x-appliesTo": [
371
- "Text",
372
- "Heading"
373
- ]
299
+ "enum": "textAlign"
374
300
  },
375
301
  "lineLimit": {
376
302
  "type": [
377
303
  "string",
378
304
  "number"
379
305
  ],
380
- "enum": "lineLimit",
381
306
  "x-category": "text",
382
- "x-appliesTo": [
383
- "Text"
384
- ]
307
+ "enum": "lineLimit"
385
308
  },
386
309
  "textOverflow": {
387
310
  "type": "string",
388
- "enum": "textOverflow",
389
311
  "x-category": "text",
390
- "x-appliesTo": [
391
- "Text"
392
- ]
312
+ "enum": "textOverflow"
393
313
  },
394
314
  "fontWeight": {
395
315
  "type": "string",
396
- "enum": "fontWeight",
397
316
  "x-category": "text",
398
- "x-appliesTo": [
399
- "Text"
400
- ]
317
+ "enum": "fontWeight"
401
318
  },
402
- "headingLevel": {
319
+ "size": {
403
320
  "type": "number",
404
321
  "x-category": "text",
405
- "x-appliesTo": [
406
- "Heading"
407
- ],
408
- "description": "Semantic heading level (1–6) for h1/h2 mapping and accessibility hierarchy"
322
+ "x-notes": "Font size shorthand (px/dp/pt)"
409
323
  },
410
324
  "fit": {
411
325
  "type": "string",
412
- "enum": "imageFit",
413
326
  "x-category": "image",
414
- "x-appliesTo": [
415
- "Image"
416
- ]
327
+ "enum": "imageFit"
417
328
  },
418
329
  "src": {
419
330
  "type": "string",
420
331
  "x-category": "image",
421
- "x-appliesTo": [
422
- "Image"
423
- ],
424
332
  "description": "Image source URL or asset reference"
425
333
  },
426
334
  "alt": {
427
335
  "type": "string",
428
336
  "x-category": "image",
429
- "x-appliesTo": [
430
- "Image",
431
- "Icon"
432
- ],
433
337
  "description": "Alternative text; not a source reference"
434
338
  },
435
339
  "name": {
436
340
  "type": "string",
437
341
  "x-category": "image",
438
- "x-appliesTo": [
439
- "Icon"
440
- ],
441
342
  "description": "Icon token or asset name in the renderer icon set"
442
343
  },
443
344
  "onClick": {
444
345
  "type": "action",
445
346
  "x-category": "interaction",
446
- "x-appliesTo": [
447
- "Button",
448
- "IconButton",
449
- "Link"
450
- ],
451
347
  "description": "Action id, not arbitrary code"
452
348
  },
453
349
  "onSubmit": {
454
350
  "type": "action",
455
351
  "x-category": "interaction",
456
- "x-appliesTo": [
457
- "Form"
458
- ],
459
352
  "description": "Form submit/validation action id"
460
353
  },
461
354
  "onChange": {
462
355
  "type": "action",
463
- "x-category": "interaction",
464
- "x-appliesTo": [
465
- "TextInput",
466
- "TextArea",
467
- "Select",
468
- "Checkbox",
469
- "Radio",
470
- "Switch"
471
- ]
356
+ "x-category": "interaction"
472
357
  },
473
358
  "focusable": {
474
359
  "type": "boolean",
@@ -476,19 +361,12 @@
476
361
  },
477
362
  "autoFocus": {
478
363
  "type": "boolean",
479
- "x-category": "interaction",
480
- "x-appliesTo": [
481
- "Modal",
482
- "TextInput"
483
- ]
364
+ "x-category": "interaction"
484
365
  },
485
366
  "keyboardType": {
486
367
  "type": "string",
487
- "enum": "keyboardType",
488
368
  "x-category": "interaction",
489
- "x-appliesTo": [
490
- "TextInput"
491
- ]
369
+ "enum": "keyboardType"
492
370
  },
493
371
  "value": {
494
372
  "type": [
@@ -496,43 +374,20 @@
496
374
  "number",
497
375
  "boolean"
498
376
  ],
499
- "x-category": "data",
500
- "x-appliesTo": [
501
- "TextInput",
502
- "TextArea",
503
- "Select",
504
- "Radio",
505
- "Checkbox",
506
- "Switch"
507
- ]
377
+ "x-category": "data"
508
378
  },
509
379
  "binding": {
510
380
  "type": "string",
511
381
  "x-category": "data",
512
- "x-appliesTo": [
513
- "TextInput",
514
- "TextArea",
515
- "Select",
516
- "Checkbox",
517
- "Radio",
518
- "Switch"
519
- ],
520
382
  "description": "ViewModel or form state field identifier"
521
383
  },
522
384
  "placeholder": {
523
385
  "type": "string",
524
- "x-category": "data",
525
- "x-appliesTo": [
526
- "TextInput",
527
- "TextArea"
528
- ]
386
+ "x-category": "data"
529
387
  },
530
388
  "options": {
531
389
  "type": "array",
532
390
  "x-category": "data",
533
- "x-appliesTo": [
534
- "Select"
535
- ],
536
391
  "x-notes": "array<{value,label}>"
537
392
  },
538
393
  "error": {
@@ -540,26 +395,14 @@
540
395
  "string",
541
396
  "null"
542
397
  ],
543
- "x-category": "validation",
544
- "x-appliesTo": [
545
- "Field",
546
- "TextInput",
547
- "TextArea",
548
- "Select"
549
- ]
398
+ "x-category": "validation"
550
399
  },
551
400
  "help": {
552
401
  "type": [
553
402
  "string",
554
403
  "null"
555
404
  ],
556
- "x-category": "validation",
557
- "x-appliesTo": [
558
- "Field",
559
- "TextInput",
560
- "TextArea",
561
- "Select"
562
- ]
405
+ "x-category": "validation"
563
406
  },
564
407
  "variant": {
565
408
  "type": "string",
@@ -569,17 +412,33 @@
569
412
  "theme": {
570
413
  "type": "string",
571
414
  "x-category": "visual",
572
- "x-appliesTo": [
573
- "App"
574
- ],
575
415
  "x-notes": "active theme id for runtime theme switching"
416
+ },
417
+ "flex": {
418
+ "type": "number",
419
+ "x-category": "size",
420
+ "description": "Flex grow ratio for proportional sizing in table columns/cells"
421
+ },
422
+ "each": {
423
+ "type": "string",
424
+ "x-category": "data",
425
+ "description": "Iterator variable name for data-bound row repetition"
426
+ },
427
+ "source": {
428
+ "type": "string",
429
+ "x-category": "data",
430
+ "description": "ViewModel array binding for data-driven elements"
431
+ },
432
+ "headerVisible": {
433
+ "type": "boolean",
434
+ "x-category": "state"
576
435
  }
577
436
  },
578
437
  "elements": {
579
438
  "App": {
439
+ "description": "App root; holds theme/token/navigation context",
580
440
  "x-tier": "core",
581
441
  "x-category": "structure",
582
- "description": "App root; holds theme/token/navigation context",
583
442
  "x-notes": "Optional; not required for single-screen DSL",
584
443
  "properties": {
585
444
  "id": {
@@ -606,9 +465,9 @@
606
465
  }
607
466
  },
608
467
  "Page": {
468
+ "description": "Screen root; viewport and safe-area boundary",
609
469
  "x-tier": "core",
610
470
  "x-category": "structure",
611
- "description": "Screen root; viewport and safe-area boundary",
612
471
  "properties": {
613
472
  "id": {
614
473
  "$ref": "#/properties/id"
@@ -637,9 +496,9 @@
637
496
  }
638
497
  },
639
498
  "SafeArea": {
499
+ "description": "Insets for OS/browser safe areas",
640
500
  "x-tier": "core",
641
501
  "x-category": "structure",
642
- "description": "Insets for OS/browser safe areas",
643
502
  "properties": {
644
503
  "id": {
645
504
  "$ref": "#/properties/id"
@@ -661,9 +520,9 @@
661
520
  }
662
521
  },
663
522
  "Box": {
523
+ "description": "Single region; background, bounds, child placement",
664
524
  "x-tier": "core",
665
525
  "x-category": "layout",
666
- "description": "Single region; background, bounds, child placement",
667
526
  "properties": {
668
527
  "id": {
669
528
  "$ref": "#/properties/id"
@@ -692,6 +551,12 @@
692
551
  "padding": {
693
552
  "$ref": "#/properties/padding"
694
553
  },
554
+ "margin": {
555
+ "$ref": "#/properties/margin"
556
+ },
557
+ "gap": {
558
+ "$ref": "#/properties/gap"
559
+ },
695
560
  "contentAlign": {
696
561
  "$ref": "#/properties/contentAlign"
697
562
  },
@@ -704,6 +569,9 @@
704
569
  "border": {
705
570
  "$ref": "#/properties/border"
706
571
  },
572
+ "borderColor": {
573
+ "$ref": "#/properties/borderColor"
574
+ },
707
575
  "radius": {
708
576
  "$ref": "#/properties/radius"
709
577
  },
@@ -719,6 +587,15 @@
719
587
  "selfAlign": {
720
588
  "$ref": "#/properties/selfAlign"
721
589
  },
590
+ "display": {
591
+ "$ref": "#/properties/display"
592
+ },
593
+ "gridTemplateColumns": {
594
+ "$ref": "#/properties/gridTemplateColumns"
595
+ },
596
+ "flexDirection": {
597
+ "$ref": "#/properties/flexDirection"
598
+ },
722
599
  "variant": {
723
600
  "$ref": "#/properties/variant"
724
601
  }
@@ -728,9 +605,9 @@
728
605
  }
729
606
  },
730
607
  "Row": {
608
+ "description": "Horizontal child layout",
731
609
  "x-tier": "core",
732
610
  "x-category": "layout",
733
- "description": "Horizontal child layout",
734
611
  "properties": {
735
612
  "id": {
736
613
  "$ref": "#/properties/id"
@@ -777,9 +654,9 @@
777
654
  }
778
655
  },
779
656
  "Column": {
657
+ "description": "Vertical child layout",
780
658
  "x-tier": "core",
781
659
  "x-category": "layout",
782
- "description": "Vertical child layout",
783
660
  "properties": {
784
661
  "id": {
785
662
  "$ref": "#/properties/id"
@@ -826,9 +703,9 @@
826
703
  }
827
704
  },
828
705
  "Stack": {
706
+ "description": "Overlay children by z-order (not absolute positioning)",
829
707
  "x-tier": "core",
830
708
  "x-category": "layout",
831
- "description": "Overlay children by z-order (not absolute positioning)",
832
709
  "properties": {
833
710
  "id": {
834
711
  "$ref": "#/properties/id"
@@ -836,6 +713,9 @@
836
713
  "visible": {
837
714
  "$ref": "#/properties/visible"
838
715
  },
716
+ "gap": {
717
+ "$ref": "#/properties/gap"
718
+ },
839
719
  "contentAlign": {
840
720
  "$ref": "#/properties/contentAlign"
841
721
  },
@@ -860,9 +740,9 @@
860
740
  }
861
741
  },
862
742
  "Spacer": {
743
+ "description": "Occupies remaining flex space",
863
744
  "x-tier": "core",
864
745
  "x-category": "layout",
865
- "description": "Occupies remaining flex space",
866
746
  "x-notes": "Direct child of Row/Column only",
867
747
  "properties": {
868
748
  "id": {
@@ -886,9 +766,9 @@
886
766
  }
887
767
  },
888
768
  "Divider": {
769
+ "description": "Horizontal or vertical separator",
889
770
  "x-tier": "core",
890
771
  "x-category": "layout",
891
- "description": "Horizontal or vertical separator",
892
772
  "properties": {
893
773
  "id": {
894
774
  "$ref": "#/properties/id"
@@ -905,9 +785,9 @@
905
785
  }
906
786
  },
907
787
  "ScrollArea": {
788
+ "description": "Internal scroll boundary",
908
789
  "x-tier": "core",
909
790
  "x-category": "scroll",
910
- "description": "Internal scroll boundary",
911
791
  "properties": {
912
792
  "id": {
913
793
  "$ref": "#/properties/id"
@@ -942,9 +822,9 @@
942
822
  }
943
823
  },
944
824
  "List": {
825
+ "description": "Homogeneous list of items",
945
826
  "x-tier": "core",
946
827
  "x-category": "scroll",
947
- "description": "Homogeneous list of items",
948
828
  "properties": {
949
829
  "id": {
950
830
  "$ref": "#/properties/id"
@@ -973,9 +853,9 @@
973
853
  }
974
854
  },
975
855
  "ListItem": {
856
+ "description": "One row/cell in a list",
976
857
  "x-tier": "core",
977
858
  "x-category": "scroll",
978
- "description": "One row/cell in a list",
979
859
  "properties": {
980
860
  "id": {
981
861
  "$ref": "#/properties/id"
@@ -1004,9 +884,9 @@
1004
884
  }
1005
885
  },
1006
886
  "Text": {
887
+ "description": "Text display",
1007
888
  "x-tier": "core",
1008
889
  "x-category": "text",
1009
- "description": "Text display",
1010
890
  "properties": {
1011
891
  "id": {
1012
892
  "$ref": "#/properties/id"
@@ -1029,45 +909,32 @@
1029
909
  "fontWeight": {
1030
910
  "$ref": "#/properties/fontWeight"
1031
911
  },
912
+ "fontSize": {
913
+ "$ref": "#/properties/fontSize"
914
+ },
915
+ "size": {
916
+ "$ref": "#/properties/size"
917
+ },
1032
918
  "foreground": {
1033
919
  "$ref": "#/properties/foreground"
1034
920
  },
921
+ "background": {
922
+ "$ref": "#/properties/background"
923
+ },
1035
924
  "opacity": {
1036
925
  "$ref": "#/properties/opacity"
1037
926
  },
1038
- "role": {
1039
- "$ref": "#/properties/role"
1040
- },
1041
- "variant": {
1042
- "$ref": "#/properties/variant"
1043
- }
1044
- },
1045
- "_children": {
1046
- "x-kind": "text"
1047
- }
1048
- },
1049
- "Heading": {
1050
- "x-tier": "core",
1051
- "x-category": "text",
1052
- "description": "Heading text; visual style via textStyle, semantic level via headingLevel",
1053
- "properties": {
1054
- "id": {
1055
- "$ref": "#/properties/id"
1056
- },
1057
- "visible": {
1058
- "$ref": "#/properties/visible"
1059
- },
1060
- "headingLevel": {
1061
- "$ref": "#/properties/headingLevel"
927
+ "padding": {
928
+ "$ref": "#/properties/padding"
1062
929
  },
1063
- "textStyle": {
1064
- "$ref": "#/properties/textStyle"
930
+ "radius": {
931
+ "$ref": "#/properties/radius"
1065
932
  },
1066
- "textAlign": {
1067
- "$ref": "#/properties/textAlign"
933
+ "display": {
934
+ "$ref": "#/properties/display"
1068
935
  },
1069
- "foreground": {
1070
- "$ref": "#/properties/foreground"
936
+ "alignItems": {
937
+ "$ref": "#/properties/alignItems"
1071
938
  },
1072
939
  "role": {
1073
940
  "$ref": "#/properties/role"
@@ -1081,9 +948,9 @@
1081
948
  }
1082
949
  },
1083
950
  "Link": {
951
+ "description": "Navigable text or region",
1084
952
  "x-tier": "optional",
1085
953
  "x-category": "text",
1086
- "description": "Navigable text or region",
1087
954
  "properties": {
1088
955
  "id": {
1089
956
  "$ref": "#/properties/id"
@@ -1112,9 +979,9 @@
1112
979
  }
1113
980
  },
1114
981
  "Image": {
982
+ "description": "Image display",
1115
983
  "x-tier": "core",
1116
984
  "x-category": "media",
1117
- "description": "Image display",
1118
985
  "properties": {
1119
986
  "id": {
1120
987
  "$ref": "#/properties/id"
@@ -1152,9 +1019,9 @@
1152
1019
  }
1153
1020
  },
1154
1021
  "Icon": {
1022
+ "description": "Icon display; asset set referenced by name token at renderer",
1155
1023
  "x-tier": "core",
1156
1024
  "x-category": "media",
1157
- "description": "Icon display; asset set referenced by name token at renderer",
1158
1025
  "properties": {
1159
1026
  "id": {
1160
1027
  "$ref": "#/properties/id"
@@ -1183,9 +1050,9 @@
1183
1050
  }
1184
1051
  },
1185
1052
  "Button": {
1053
+ "description": "Pressable action; label or children required (label is a11y name when both present)",
1186
1054
  "x-tier": "core",
1187
1055
  "x-category": "input",
1188
- "description": "Pressable action; label or children required (label is a11y name when both present)",
1189
1056
  "properties": {
1190
1057
  "id": {
1191
1058
  "$ref": "#/properties/id"
@@ -1208,6 +1075,24 @@
1208
1075
  "background": {
1209
1076
  "$ref": "#/properties/background"
1210
1077
  },
1078
+ "radius": {
1079
+ "$ref": "#/properties/radius"
1080
+ },
1081
+ "padding": {
1082
+ "$ref": "#/properties/padding"
1083
+ },
1084
+ "shadow": {
1085
+ "$ref": "#/properties/shadow"
1086
+ },
1087
+ "border": {
1088
+ "$ref": "#/properties/border"
1089
+ },
1090
+ "borderColor": {
1091
+ "$ref": "#/properties/borderColor"
1092
+ },
1093
+ "fontWeight": {
1094
+ "$ref": "#/properties/fontWeight"
1095
+ },
1211
1096
  "variant": {
1212
1097
  "$ref": "#/properties/variant"
1213
1098
  },
@@ -1225,9 +1110,9 @@
1225
1110
  }
1226
1111
  },
1227
1112
  "IconButton": {
1113
+ "description": "Icon-primary button; label required for accessibility",
1228
1114
  "x-tier": "optional",
1229
1115
  "x-category": "input",
1230
- "description": "Icon-primary button; label required for accessibility",
1231
1116
  "properties": {
1232
1117
  "id": {
1233
1118
  "$ref": "#/properties/id"
@@ -1244,6 +1129,18 @@
1244
1129
  "label": {
1245
1130
  "$ref": "#/properties/label"
1246
1131
  },
1132
+ "foreground": {
1133
+ "$ref": "#/properties/foreground"
1134
+ },
1135
+ "background": {
1136
+ "$ref": "#/properties/background"
1137
+ },
1138
+ "radius": {
1139
+ "$ref": "#/properties/radius"
1140
+ },
1141
+ "padding": {
1142
+ "$ref": "#/properties/padding"
1143
+ },
1247
1144
  "variant": {
1248
1145
  "$ref": "#/properties/variant"
1249
1146
  }
@@ -1256,9 +1153,9 @@
1256
1153
  }
1257
1154
  },
1258
1155
  "TextInput": {
1156
+ "description": "Single-line text input",
1259
1157
  "x-tier": "core",
1260
1158
  "x-category": "input",
1261
- "description": "Single-line text input",
1262
1159
  "properties": {
1263
1160
  "id": {
1264
1161
  "$ref": "#/properties/id"
@@ -1308,6 +1205,27 @@
1308
1205
  "label": {
1309
1206
  "$ref": "#/properties/label"
1310
1207
  },
1208
+ "foreground": {
1209
+ "$ref": "#/properties/foreground"
1210
+ },
1211
+ "background": {
1212
+ "$ref": "#/properties/background"
1213
+ },
1214
+ "radius": {
1215
+ "$ref": "#/properties/radius"
1216
+ },
1217
+ "padding": {
1218
+ "$ref": "#/properties/padding"
1219
+ },
1220
+ "border": {
1221
+ "$ref": "#/properties/border"
1222
+ },
1223
+ "borderColor": {
1224
+ "$ref": "#/properties/borderColor"
1225
+ },
1226
+ "minHeight": {
1227
+ "$ref": "#/properties/minHeight"
1228
+ },
1311
1229
  "variant": {
1312
1230
  "$ref": "#/properties/variant"
1313
1231
  }
@@ -1317,9 +1235,9 @@
1317
1235
  }
1318
1236
  },
1319
1237
  "TextArea": {
1238
+ "description": "Multi-line text input",
1320
1239
  "x-tier": "core",
1321
1240
  "x-category": "input",
1322
- "description": "Multi-line text input",
1323
1241
  "properties": {
1324
1242
  "id": {
1325
1243
  "$ref": "#/properties/id"
@@ -1363,6 +1281,24 @@
1363
1281
  "label": {
1364
1282
  "$ref": "#/properties/label"
1365
1283
  },
1284
+ "foreground": {
1285
+ "$ref": "#/properties/foreground"
1286
+ },
1287
+ "background": {
1288
+ "$ref": "#/properties/background"
1289
+ },
1290
+ "radius": {
1291
+ "$ref": "#/properties/radius"
1292
+ },
1293
+ "padding": {
1294
+ "$ref": "#/properties/padding"
1295
+ },
1296
+ "border": {
1297
+ "$ref": "#/properties/border"
1298
+ },
1299
+ "borderColor": {
1300
+ "$ref": "#/properties/borderColor"
1301
+ },
1366
1302
  "variant": {
1367
1303
  "$ref": "#/properties/variant"
1368
1304
  }
@@ -1372,9 +1308,9 @@
1372
1308
  }
1373
1309
  },
1374
1310
  "Select": {
1311
+ "description": "Single selection",
1375
1312
  "x-tier": "core",
1376
1313
  "x-category": "input",
1377
- "description": "Single selection",
1378
1314
  "properties": {
1379
1315
  "id": {
1380
1316
  "$ref": "#/properties/id"
@@ -1412,6 +1348,27 @@
1412
1348
  "label": {
1413
1349
  "$ref": "#/properties/label"
1414
1350
  },
1351
+ "foreground": {
1352
+ "$ref": "#/properties/foreground"
1353
+ },
1354
+ "background": {
1355
+ "$ref": "#/properties/background"
1356
+ },
1357
+ "radius": {
1358
+ "$ref": "#/properties/radius"
1359
+ },
1360
+ "padding": {
1361
+ "$ref": "#/properties/padding"
1362
+ },
1363
+ "border": {
1364
+ "$ref": "#/properties/border"
1365
+ },
1366
+ "borderColor": {
1367
+ "$ref": "#/properties/borderColor"
1368
+ },
1369
+ "minHeight": {
1370
+ "$ref": "#/properties/minHeight"
1371
+ },
1415
1372
  "variant": {
1416
1373
  "$ref": "#/properties/variant"
1417
1374
  }
@@ -1421,9 +1378,9 @@
1421
1378
  }
1422
1379
  },
1423
1380
  "Checkbox": {
1381
+ "description": "Boolean or multi-select toggle",
1424
1382
  "x-tier": "core",
1425
1383
  "x-category": "input",
1426
- "description": "Boolean or multi-select toggle",
1427
1384
  "properties": {
1428
1385
  "id": {
1429
1386
  "$ref": "#/properties/id"
@@ -1458,9 +1415,9 @@
1458
1415
  }
1459
1416
  },
1460
1417
  "Radio": {
1418
+ "description": "Single choice in a group (use Row/Column to group; binding identifies group)",
1461
1419
  "x-tier": "core",
1462
1420
  "x-category": "input",
1463
- "description": "Single choice in a group (use Row/Column to group; binding identifies group)",
1464
1421
  "x-notes": "RadioGroup is expressed via layout Group, not a separate element",
1465
1422
  "properties": {
1466
1423
  "id": {
@@ -1496,9 +1453,9 @@
1496
1453
  }
1497
1454
  },
1498
1455
  "Switch": {
1456
+ "description": "On/off toggle",
1499
1457
  "x-tier": "core",
1500
1458
  "x-category": "input",
1501
- "description": "On/off toggle",
1502
1459
  "properties": {
1503
1460
  "id": {
1504
1461
  "$ref": "#/properties/id"
@@ -1530,9 +1487,9 @@
1530
1487
  }
1531
1488
  },
1532
1489
  "Form": {
1490
+ "description": "Input group submit/validation boundary",
1533
1491
  "x-tier": "core",
1534
1492
  "x-category": "form",
1535
- "description": "Input group submit/validation boundary",
1536
1493
  "properties": {
1537
1494
  "id": {
1538
1495
  "$ref": "#/properties/id"
@@ -1555,9 +1512,9 @@
1555
1512
  }
1556
1513
  },
1557
1514
  "Field": {
1515
+ "description": "label/help/error/input unit",
1558
1516
  "x-tier": "core",
1559
1517
  "x-category": "form",
1560
- "description": "label/help/error/input unit",
1561
1518
  "properties": {
1562
1519
  "id": {
1563
1520
  "$ref": "#/properties/id"
@@ -1589,9 +1546,9 @@
1589
1546
  }
1590
1547
  },
1591
1548
  "Modal": {
1549
+ "description": "Primary transient dialog",
1592
1550
  "x-tier": "core",
1593
1551
  "x-category": "overlay",
1594
- "description": "Primary transient dialog",
1595
1552
  "x-notes": "Direct child of Page or App; role defaults to dialog at renderer",
1596
1553
  "properties": {
1597
1554
  "id": {
@@ -1619,9 +1576,9 @@
1619
1576
  }
1620
1577
  },
1621
1578
  "Drawer": {
1579
+ "description": "Edge panel overlay",
1622
1580
  "x-tier": "extension",
1623
1581
  "x-category": "overlay",
1624
- "description": "Edge panel overlay",
1625
1582
  "x-notes": "Placement limited to start/end/bottom at renderer",
1626
1583
  "properties": {
1627
1584
  "id": {
@@ -1643,9 +1600,9 @@
1643
1600
  }
1644
1601
  },
1645
1602
  "Popover": {
1603
+ "description": "Small anchored panel",
1646
1604
  "x-tier": "extension",
1647
1605
  "x-category": "overlay",
1648
- "description": "Small anchored panel",
1649
1606
  "properties": {
1650
1607
  "id": {
1651
1608
  "$ref": "#/properties/id"
@@ -1666,9 +1623,9 @@
1666
1623
  }
1667
1624
  },
1668
1625
  "Tooltip": {
1626
+ "description": "Supplementary description",
1669
1627
  "x-tier": "extension",
1670
1628
  "x-category": "overlay",
1671
- "description": "Supplementary description",
1672
1629
  "properties": {
1673
1630
  "id": {
1674
1631
  "$ref": "#/properties/id"
@@ -1688,9 +1645,9 @@
1688
1645
  }
1689
1646
  },
1690
1647
  "Progress": {
1648
+ "description": "Determinate progress",
1691
1649
  "x-tier": "core",
1692
1650
  "x-category": "feedback",
1693
- "description": "Determinate progress",
1694
1651
  "properties": {
1695
1652
  "id": {
1696
1653
  "$ref": "#/properties/id"
@@ -1710,9 +1667,9 @@
1710
1667
  }
1711
1668
  },
1712
1669
  "Spinner": {
1670
+ "description": "Indeterminate loading",
1713
1671
  "x-tier": "core",
1714
1672
  "x-category": "feedback",
1715
- "description": "Indeterminate loading",
1716
1673
  "properties": {
1717
1674
  "id": {
1718
1675
  "$ref": "#/properties/id"
@@ -1727,6 +1684,123 @@
1727
1684
  "_children": {
1728
1685
  "x-kind": "none"
1729
1686
  }
1687
+ },
1688
+ "Table": {
1689
+ "description": "Data table with header and repeated rows",
1690
+ "x-tier": "core",
1691
+ "x-category": "data",
1692
+ "properties": {
1693
+ "id": {
1694
+ "$ref": "#/properties/id"
1695
+ },
1696
+ "visible": {
1697
+ "$ref": "#/properties/visible"
1698
+ },
1699
+ "source": {
1700
+ "$ref": "#/properties/source"
1701
+ },
1702
+ "gap": {
1703
+ "$ref": "#/properties/gap"
1704
+ },
1705
+ "variant": {
1706
+ "$ref": "#/properties/variant"
1707
+ }
1708
+ },
1709
+ "_children": {
1710
+ "x-kind": "list",
1711
+ "x-items": [
1712
+ "TableHeader",
1713
+ "TableRow"
1714
+ ]
1715
+ }
1716
+ },
1717
+ "TableHeader": {
1718
+ "description": "Table header row defining column labels",
1719
+ "x-tier": "core",
1720
+ "x-category": "data",
1721
+ "properties": {
1722
+ "height": {
1723
+ "$ref": "#/properties/height"
1724
+ },
1725
+ "variant": {
1726
+ "$ref": "#/properties/variant"
1727
+ }
1728
+ },
1729
+ "_children": {
1730
+ "x-kind": "list",
1731
+ "x-items": [
1732
+ "TableColumn"
1733
+ ]
1734
+ }
1735
+ },
1736
+ "TableColumn": {
1737
+ "description": "Header cell definition; children override label text",
1738
+ "x-tier": "core",
1739
+ "x-category": "data",
1740
+ "properties": {
1741
+ "label": {
1742
+ "$ref": "#/properties/label"
1743
+ },
1744
+ "width": {
1745
+ "$ref": "#/properties/width"
1746
+ },
1747
+ "flex": {
1748
+ "$ref": "#/properties/flex"
1749
+ },
1750
+ "align": {
1751
+ "$ref": "#/properties/align"
1752
+ },
1753
+ "variant": {
1754
+ "$ref": "#/properties/variant"
1755
+ }
1756
+ },
1757
+ "_children": {
1758
+ "x-kind": "any"
1759
+ }
1760
+ },
1761
+ "TableRow": {
1762
+ "description": "Row template repeated for each source item",
1763
+ "x-tier": "core",
1764
+ "x-category": "data",
1765
+ "properties": {
1766
+ "each": {
1767
+ "$ref": "#/properties/each"
1768
+ },
1769
+ "height": {
1770
+ "$ref": "#/properties/height"
1771
+ },
1772
+ "variant": {
1773
+ "$ref": "#/properties/variant"
1774
+ }
1775
+ },
1776
+ "_children": {
1777
+ "x-kind": "list",
1778
+ "x-items": [
1779
+ "TableCell"
1780
+ ]
1781
+ }
1782
+ },
1783
+ "TableCell": {
1784
+ "description": "Data cell; children define cell content",
1785
+ "x-tier": "core",
1786
+ "x-category": "data",
1787
+ "properties": {
1788
+ "width": {
1789
+ "$ref": "#/properties/width"
1790
+ },
1791
+ "flex": {
1792
+ "$ref": "#/properties/flex"
1793
+ },
1794
+ "align": {
1795
+ "$ref": "#/properties/align"
1796
+ },
1797
+ "variant": {
1798
+ "$ref": "#/properties/variant"
1799
+ }
1800
+ },
1801
+ "_children": {
1802
+ "x-kind": "any"
1803
+ }
1730
1804
  }
1731
1805
  }
1732
1806
  }