@adia-ai/a2ui 0.8.39 → 0.8.41

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.
@@ -99,15 +99,16 @@
99
99
  "mcp"
100
100
  ],
101
101
  "name": "A2UIRoot",
102
+ "parts": {
103
+ "default": {
104
+ "description": "The rendered surface — template-owned anatomy, not a light-DOM insertion point (gh#1454). `connected()` constructs `new A2UIRenderer(this, registry, …)` targeting the host itself; the renderer owns and stamps all rendered children as A2UI messages are processed. No consumer content is captured or preserved."
105
+ }
106
+ },
102
107
  "related": [
103
108
  "canvas",
104
109
  "inspector"
105
110
  ],
106
- "slots": {
107
- "default": {
108
- "description": "The rendered surface. Children are stamped by the A2UI renderer."
109
- }
110
- },
111
+ "slots": {},
111
112
  "states": [
112
113
  {
113
114
  "description": "Default, ready to connect.",
@@ -172,6 +173,9 @@
172
173
  ],
173
174
  "unevaluatedProperties": false,
174
175
  "x-adiaui": {
176
+ "allowedChildren": [
177
+ "AccordionItem"
178
+ ],
175
179
  "anti_patterns": [],
176
180
  "category": "container",
177
181
  "composes": [
@@ -212,6 +216,7 @@
212
216
  "expand"
213
217
  ],
214
218
  "name": "UIAccordion",
219
+ "parts": {},
215
220
  "related": [
216
221
  "accordion-item",
217
222
  "input",
@@ -322,6 +327,9 @@
322
327
  ],
323
328
  "unevaluatedProperties": false,
324
329
  "x-adiaui": {
330
+ "allowedParents": [
331
+ "Accordion"
332
+ ],
325
333
  "anti_patterns": [],
326
334
  "category": "layout",
327
335
  "composes": [],
@@ -346,6 +354,7 @@
346
354
  "section-toggle"
347
355
  ],
348
356
  "name": "UIAccordionItem",
357
+ "parts": {},
349
358
  "related": [
350
359
  "Accordion",
351
360
  "Card"
@@ -407,7 +416,7 @@
407
416
  },
408
417
  "ActionItem": {
409
418
  "title": "ActionItem",
410
- "description": "Child of <action-list-ui>. One actionable row — icon + label, forwards activation to the parent action-list.",
419
+ "description": "Child of <action-list-ui>. One actionable row — icon + label + optional\nsubtitle, forwards activation to the parent action-list. Row contract\nconverges on <menu-item-ui>: icon/text/subtitle/value/variant/disabled\nprops and icon/text/subtitle/trailing slot overrides (#1363 C5).",
411
420
  "type": "object",
412
421
  "allOf": [
413
422
  {
@@ -430,6 +439,11 @@
430
439
  "description": "Leading icon name (Phosphor).",
431
440
  "type": "string"
432
441
  },
442
+ "subtitle": {
443
+ "description": "Optional secondary description line rendered under the label.",
444
+ "type": "string",
445
+ "default": ""
446
+ },
433
447
  "text": {
434
448
  "description": "Action label.",
435
449
  "type": "string"
@@ -439,8 +453,12 @@
439
453
  "type": "string"
440
454
  },
441
455
  "variant": {
442
- "description": "Visual variant (default | accent | danger).",
456
+ "description": "Visual variant (default | danger).",
443
457
  "type": "string",
458
+ "enum": [
459
+ "default",
460
+ "danger"
461
+ ],
444
462
  "default": "default"
445
463
  }
446
464
  },
@@ -449,6 +467,9 @@
449
467
  ],
450
468
  "unevaluatedProperties": false,
451
469
  "x-adiaui": {
470
+ "allowedParents": [
471
+ "ActionList"
472
+ ],
452
473
  "anti_patterns": [],
453
474
  "category": "navigation",
454
475
  "composes": [],
@@ -462,6 +483,7 @@
462
483
  "action-list-row"
463
484
  ],
464
485
  "name": "UIActionItem",
486
+ "parts": {},
465
487
  "related": [
466
488
  "ActionList",
467
489
  "MenuItem",
@@ -470,6 +492,15 @@
470
492
  "slots": {
471
493
  "icon": {
472
494
  "description": "Override the [icon] glyph with a custom slotted element (custom icon-ui, image, avatar). Mutually exclusive with the [icon] attribute — slot child wins."
495
+ },
496
+ "subtitle": {
497
+ "description": "Custom secondary-line content override; falls through to [subtitle] prop if not slotted."
498
+ },
499
+ "text": {
500
+ "description": "Custom label content; falls through to [text] prop if not slotted."
501
+ },
502
+ "trailing": {
503
+ "description": "Trailing element pinned to the far edge (shortcut hint, badge, caret). Supersedes the unnamed default slot this row previously used for trailing content — see MIGRATION GUIDE."
473
504
  }
474
505
  },
475
506
  "states": [],
@@ -509,6 +540,9 @@
509
540
  ],
510
541
  "unevaluatedProperties": false,
511
542
  "x-adiaui": {
543
+ "allowedChildren": [
544
+ "ActionItem"
545
+ ],
512
546
  "anti_patterns": [],
513
547
  "category": "navigation",
514
548
  "composes": [
@@ -547,10 +581,12 @@
547
581
  "list"
548
582
  ],
549
583
  "name": "UIActionList",
584
+ "parts": {},
550
585
  "related": [
551
586
  "ActionItem",
552
587
  "Menu",
553
- "Button"
588
+ "Button",
589
+ "List"
554
590
  ],
555
591
  "slots": {
556
592
  "default": {
@@ -647,6 +683,7 @@
647
683
  "icon"
648
684
  ],
649
685
  "name": "UIAdiaMark",
686
+ "parts": {},
650
687
  "related": [
651
688
  "AdiaWordmark",
652
689
  "Icon",
@@ -765,6 +802,7 @@
765
802
  "identity"
766
803
  ],
767
804
  "name": "UIAdiaWordmark",
805
+ "parts": {},
768
806
  "related": [
769
807
  "AdiaMark",
770
808
  "Icon",
@@ -846,8 +884,11 @@
846
884
  ],
847
885
  "unevaluatedProperties": false,
848
886
  "x-adiaui": {
887
+ "allowedParents": [
888
+ "AdminShell"
889
+ ],
849
890
  "anti_patterns": [],
850
- "category": "interaction",
891
+ "category": "container",
851
892
  "composes": [],
852
893
  "events": {
853
894
  "command-select": {
@@ -867,6 +908,7 @@
867
908
  "quickaction"
868
909
  ],
869
910
  "name": "AdminCommand",
911
+ "parts": {},
870
912
  "related": [
871
913
  "AdminShell",
872
914
  "AdminSidebar",
@@ -928,6 +970,9 @@
928
970
  ],
929
971
  "unevaluatedProperties": false,
930
972
  "x-adiaui": {
973
+ "allowedParents": [
974
+ "AdminShell"
975
+ ],
931
976
  "anti_patterns": [],
932
977
  "category": "layout",
933
978
  "composes": [],
@@ -940,6 +985,7 @@
940
985
  "workspace"
941
986
  ],
942
987
  "name": "AdminContent",
988
+ "parts": {},
943
989
  "related": [
944
990
  "AdminShell",
945
991
  "AdminSidebar",
@@ -1015,6 +1061,7 @@
1015
1061
  "icon-label-badge"
1016
1062
  ],
1017
1063
  "name": "AdminEntityItem",
1064
+ "parts": {},
1018
1065
  "related": [
1019
1066
  "AdminTopbar",
1020
1067
  "AdminStatusbar",
@@ -1079,6 +1126,10 @@
1079
1126
  ],
1080
1127
  "unevaluatedProperties": false,
1081
1128
  "x-adiaui": {
1129
+ "allowedParents": [
1130
+ "AdminContent",
1131
+ "AdminScroll"
1132
+ ],
1082
1133
  "anti_patterns": [],
1083
1134
  "category": "layout",
1084
1135
  "composes": [],
@@ -1090,6 +1141,7 @@
1090
1141
  "container-query-host"
1091
1142
  ],
1092
1143
  "name": "AdminPage",
1144
+ "parts": {},
1093
1145
  "related": [
1094
1146
  "AdminShell",
1095
1147
  "AdminContent",
@@ -1153,6 +1205,9 @@
1153
1205
  ],
1154
1206
  "unevaluatedProperties": false,
1155
1207
  "x-adiaui": {
1208
+ "allowedParents": [
1209
+ "AdminPage"
1210
+ ],
1156
1211
  "anti_patterns": [],
1157
1212
  "category": "layout",
1158
1213
  "composes": [],
@@ -1164,6 +1219,7 @@
1164
1219
  "centered-body"
1165
1220
  ],
1166
1221
  "name": "AdminPageBody",
1222
+ "parts": {},
1167
1223
  "related": [
1168
1224
  "AdminPage",
1169
1225
  "AdminPageHeader",
@@ -1215,6 +1271,9 @@
1215
1271
  ],
1216
1272
  "unevaluatedProperties": false,
1217
1273
  "x-adiaui": {
1274
+ "allowedParents": [
1275
+ "AdminPage"
1276
+ ],
1218
1277
  "anti_patterns": [],
1219
1278
  "category": "layout",
1220
1279
  "composes": [],
@@ -1228,6 +1287,7 @@
1228
1287
  "action-bar"
1229
1288
  ],
1230
1289
  "name": "AdminPageFooter",
1290
+ "parts": {},
1231
1291
  "related": [
1232
1292
  "AdminPage",
1233
1293
  "AdminPageHeader",
@@ -1283,6 +1343,9 @@
1283
1343
  ],
1284
1344
  "unevaluatedProperties": false,
1285
1345
  "x-adiaui": {
1346
+ "allowedParents": [
1347
+ "AdminPage"
1348
+ ],
1286
1349
  "anti_patterns": [],
1287
1350
  "category": "layout",
1288
1351
  "composes": [],
@@ -1294,6 +1357,7 @@
1294
1357
  "page-band"
1295
1358
  ],
1296
1359
  "name": "AdminPageHeader",
1360
+ "parts": {},
1297
1361
  "related": [
1298
1362
  "AdminPage",
1299
1363
  "AdminPageBody",
@@ -1417,6 +1481,7 @@
1417
1481
  "menu"
1418
1482
  ],
1419
1483
  "name": "UIAdminRoster",
1484
+ "parts": {},
1420
1485
  "related": [
1421
1486
  "AdminSettings",
1422
1487
  "AgentAdmin",
@@ -1515,6 +1580,9 @@
1515
1580
  ],
1516
1581
  "unevaluatedProperties": false,
1517
1582
  "x-adiaui": {
1583
+ "allowedParents": [
1584
+ "AdminContent"
1585
+ ],
1518
1586
  "anti_patterns": [],
1519
1587
  "category": "layout",
1520
1588
  "composes": [],
@@ -1526,6 +1594,7 @@
1526
1594
  "scroll-container"
1527
1595
  ],
1528
1596
  "name": "AdminScroll",
1597
+ "parts": {},
1529
1598
  "related": [
1530
1599
  "AdminShell",
1531
1600
  "AdminContent",
@@ -1635,6 +1704,7 @@
1635
1704
  "agent"
1636
1705
  ],
1637
1706
  "name": "UIAdminSettings",
1707
+ "parts": {},
1638
1708
  "related": [
1639
1709
  "AdminRoster",
1640
1710
  "AgentAdmin"
@@ -1709,6 +1779,124 @@
1709
1779
  "version": 1
1710
1780
  }
1711
1781
  },
1782
+ "AdminShell": {
1783
+ "title": "AdminShell",
1784
+ "description": "Behavior-only application shell. Canonical authoring shape uses\ncluster-namespaced bespoke children — <admin-topbar> at the top,\n<admin-sidebar slot=\"leading|trailing\"> rails, <admin-content> for\nthe main content region, <admin-command> for the Cmd+K palette, and\noptional <admin-statusbar> at the bottom. The shell wires sidebar\ntoggle forwarding, command-palette triggers, and the ResizeObserver\nthat drives responsive sidebar collapse; each bespoke child owns\nits own resize / collapse / open state-as-attribute semantics per\nADR-0023.\n\nLegacy data-attribute shapes (<aside data-sidebar>, <dialog\ndata-command>, [data-resize], <aside-ui slot=>, <span data-spacer>,\n<div data-actions>) were RETIRED in v0.4.0 per ADR-0024 and are no\nlonger recognized. Consumers must use the bespoke vocabulary.\n",
1785
+ "type": "object",
1786
+ "allOf": [
1787
+ {
1788
+ "$ref": "#/$defs/ComponentCommon"
1789
+ },
1790
+ {
1791
+ "$ref": "#/$defs/CatalogComponentCommon"
1792
+ }
1793
+ ],
1794
+ "properties": {
1795
+ "component": {
1796
+ "const": "AdminShell"
1797
+ },
1798
+ "mode": {
1799
+ "description": "Layout variant — space-separated token set. Recognized tokens:\n rounded — softens content-surface edges (border-radius from --page-content-radius)\n borderless — removes outer chrome borders (content dividers persist)\nThe CSS uses `mode~=\"<token>\"` attribute selectors, so multiple\ntokens combine additively (\"rounded borderless\" = both).\n\nDefault since v0.6.13: \"rounded borderless\". A bare `<admin-shell>`\nwith no `mode` attribute auto-promotes to this pair on connect.\nAuthor-supplied `mode` attributes (including the empty string\n`mode=\"\"` for flat bordered chrome) are respected verbatim.\n",
1800
+ "type": "string",
1801
+ "default": "rounded borderless"
1802
+ }
1803
+ },
1804
+ "required": [
1805
+ "component"
1806
+ ],
1807
+ "unevaluatedProperties": false,
1808
+ "x-adiaui": {
1809
+ "allowedParents": [
1810
+ "Surface"
1811
+ ],
1812
+ "anti_patterns": [],
1813
+ "category": "layout",
1814
+ "composes": [],
1815
+ "events": {
1816
+ "command-select": {
1817
+ "description": "Forwarded from the command palette when an option is chosen.",
1818
+ "detail": {
1819
+ "value": "string"
1820
+ }
1821
+ },
1822
+ "sidebar-resize": {
1823
+ "description": "Fired as a sidebar is dragged; debounced on the trailing edge.",
1824
+ "detail": {
1825
+ "sidebar": "string",
1826
+ "width": "number"
1827
+ }
1828
+ },
1829
+ "sidebar-toggle": {
1830
+ "description": "Fired when a sidebar is collapsed or expanded.",
1831
+ "detail": {
1832
+ "expanded": "boolean",
1833
+ "sidebar": "string"
1834
+ }
1835
+ }
1836
+ },
1837
+ "examples": [],
1838
+ "keywords": [
1839
+ "app-shell",
1840
+ "shell",
1841
+ "layout",
1842
+ "admin",
1843
+ "dashboard",
1844
+ "sidebar",
1845
+ "nav"
1846
+ ],
1847
+ "name": "AdminShell",
1848
+ "parts": {},
1849
+ "related": [
1850
+ "Nav",
1851
+ "NavGroup",
1852
+ "NavItem",
1853
+ "Command"
1854
+ ],
1855
+ "slots": {
1856
+ "description": {
1857
+ "description": "Secondary metadata inside any chrome bar. Muted + --a-ui-sm size."
1858
+ },
1859
+ "default": {
1860
+ "description": "Bespoke children compose here in document order — <admin-topbar>, <admin-sidebar slot=\"leading\">, <admin-content> (containing <admin-page> / <admin-page-header> / <admin-page-body>), <admin-sidebar slot=\"trailing\">, <admin-command>, optional <admin-statusbar>. The shell's grid layout reads child tag selectors to place them."
1861
+ },
1862
+ "action": {
1863
+ "description": "Trailing control cluster inside any chrome bar. The first [slot=\"action\"] child pushes itself (and siblings) to the end; subsequent siblings flow with gap."
1864
+ },
1865
+ "action-leading": {
1866
+ "description": "Leading (inline-start) control cluster inside any chrome bar. Pairs with [slot=\"action\"] for dual-cluster chrome (e.g. back button + breadcrumb on the left, primary actions on the right)."
1867
+ },
1868
+ "heading": {
1869
+ "description": "Primary label inside any chrome bar. Medium-weight + strong fg."
1870
+ },
1871
+ "icon": {
1872
+ "description": "Leading glyph inside any chrome bar (<admin-topbar>, <admin-statusbar>, <admin-sidebar> header/footer). Muted color, flex-align."
1873
+ }
1874
+ },
1875
+ "states": [
1876
+ {
1877
+ "description": "Default, interactive shell.",
1878
+ "name": "idle"
1879
+ }
1880
+ ],
1881
+ "status": "stable",
1882
+ "synonyms": {
1883
+ "admin": [
1884
+ "dashboard",
1885
+ "shell",
1886
+ "app-shell"
1887
+ ],
1888
+ "dashboard": [
1889
+ "admin",
1890
+ "shell",
1891
+ "app-shell"
1892
+ ]
1893
+ },
1894
+ "tag": "admin-shell",
1895
+ "tokens": {},
1896
+ "traits": [],
1897
+ "version": 1
1898
+ }
1899
+ },
1712
1900
  "AdminSidebar": {
1713
1901
  "title": "AdminSidebar",
1714
1902
  "description": "Module-tier shell sidebar — owns resize, snap-to-collapsed, persistence,\nand the [collapsed] reflected attribute. Sits inside <admin-shell> as\nslot=\"leading\" or slot=\"trailing\". Authors compose chrome bars + content\ninside via slot vocabulary.\n\nThis is the bespoke web-component replacement for the legacy\n<aside data-sidebar> shape per ADR-0023. The legacy shape was\nretired in v0.4.0 per ADR-0024 and is no longer recognized.\n",
@@ -1761,6 +1949,9 @@
1761
1949
  ],
1762
1950
  "unevaluatedProperties": false,
1763
1951
  "x-adiaui": {
1952
+ "allowedParents": [
1953
+ "AdminShell"
1954
+ ],
1764
1955
  "anti_patterns": [],
1765
1956
  "category": "layout",
1766
1957
  "composes": [],
@@ -1793,6 +1984,7 @@
1793
1984
  "nav"
1794
1985
  ],
1795
1986
  "name": "AdminSidebar",
1987
+ "parts": {},
1796
1988
  "related": [
1797
1989
  "AdminShell",
1798
1990
  "AdminCommand",
@@ -1869,6 +2061,11 @@
1869
2061
  ],
1870
2062
  "unevaluatedProperties": false,
1871
2063
  "x-adiaui": {
2064
+ "allowedParents": [
2065
+ "AdminShell",
2066
+ "AdminContent",
2067
+ "AdminSidebar"
2068
+ ],
1872
2069
  "anti_patterns": [],
1873
2070
  "category": "layout",
1874
2071
  "composes": [],
@@ -1882,6 +2079,7 @@
1882
2079
  "status-line"
1883
2080
  ],
1884
2081
  "name": "AdminStatusbar",
2082
+ "parts": {},
1885
2083
  "related": [
1886
2084
  "AdminShell",
1887
2085
  "AdminContent",
@@ -1951,6 +2149,11 @@
1951
2149
  ],
1952
2150
  "unevaluatedProperties": false,
1953
2151
  "x-adiaui": {
2152
+ "allowedParents": [
2153
+ "AdminShell",
2154
+ "AdminContent",
2155
+ "AdminSidebar"
2156
+ ],
1954
2157
  "anti_patterns": [],
1955
2158
  "category": "layout",
1956
2159
  "composes": [],
@@ -1964,6 +2167,7 @@
1964
2167
  "shell-header"
1965
2168
  ],
1966
2169
  "name": "AdminTopbar",
2170
+ "parts": {},
1967
2171
  "related": [
1968
2172
  "AdminShell",
1969
2173
  "AdminContent",
@@ -2104,6 +2308,7 @@
2104
2308
  "store-swap"
2105
2309
  ],
2106
2310
  "name": "UIAgentAdmin",
2311
+ "parts": {},
2107
2312
  "related": [
2108
2313
  "AdminRoster",
2109
2314
  "AdminSettings",
@@ -2225,6 +2430,7 @@
2225
2430
  "attachment"
2226
2431
  ],
2227
2432
  "name": "UIAgentArtifact",
2433
+ "parts": {},
2228
2434
  "related": [
2229
2435
  "card-ui",
2230
2436
  "code-ui"
@@ -2332,15 +2538,16 @@
2332
2538
  "bookmark"
2333
2539
  ],
2334
2540
  "name": "UIAgentFeedbackBar",
2541
+ "parts": {
2542
+ "default": {
2543
+ "description": "Template-owned anatomy, not a light-DOM insertion point (gh#1454). `#build()` unconditionally wipes the host (`this.innerHTML = ''`) and rebuilds a fixed thumbs-up/thumbs-down/save row from props — no pre-existing children are captured or preserved."
2544
+ }
2545
+ },
2335
2546
  "related": [
2336
2547
  "agent-suggestions-ui",
2337
2548
  "agent-trace-ui"
2338
2549
  ],
2339
- "slots": {
2340
- "default": {
2341
- "description": "Default slot — primary child content."
2342
- }
2343
- },
2550
+ "slots": {},
2344
2551
  "states": [
2345
2552
  {
2346
2553
  "description": "Default, ready for interaction.",
@@ -2446,6 +2653,7 @@
2446
2653
  "clarify"
2447
2654
  ],
2448
2655
  "name": "UIAgentQuestions",
2656
+ "parts": {},
2449
2657
  "related": [
2450
2658
  "agent-suggestions-ui",
2451
2659
  "agent-reasoning-ui"
@@ -2580,15 +2788,16 @@
2580
2788
  "iteration"
2581
2789
  ],
2582
2790
  "name": "UIAgentReasoning",
2791
+ "parts": {
2792
+ "default": {
2793
+ "description": "Template-owned anatomy, not a light-DOM insertion point (gh#938, gh#1454): the component rebuilds its body from the addStep()/addThought() pipeline (`this.innerHTML = ''` then rebuild) and does not consume authored children."
2794
+ }
2795
+ },
2583
2796
  "related": [
2584
2797
  "agent-trace-ui",
2585
2798
  "pipeline-status-ui"
2586
2799
  ],
2587
- "slots": {
2588
- "default": {
2589
- "description": "Default slot — NOT a step-authoring surface: the component rebuilds its body from the addStep()/addThought() pipeline and does not consume authored children (gh#938)."
2590
- }
2591
- },
2800
+ "slots": {},
2592
2801
  "states": [
2593
2802
  {
2594
2803
  "description": "Default, ready for interaction.",
@@ -2628,13 +2837,21 @@
2628
2837
  "default": false
2629
2838
  },
2630
2839
  "size": {
2631
- "description": "sm | md",
2840
+ "description": "sm | md — forwarded to each chip's <button-ui size>.",
2632
2841
  "type": "string",
2842
+ "enum": [
2843
+ "sm",
2844
+ "md"
2845
+ ],
2633
2846
  "default": "sm"
2634
2847
  },
2635
2848
  "variant": {
2636
- "description": "outline | ghost | subtle",
2849
+ "description": "outline | ghost forwarded to each chip's <button-ui variant>.",
2637
2850
  "type": "string",
2851
+ "enum": [
2852
+ "outline",
2853
+ "ghost"
2854
+ ],
2638
2855
  "default": "outline"
2639
2856
  }
2640
2857
  },
@@ -2681,6 +2898,7 @@
2681
2898
  "quick replies"
2682
2899
  ],
2683
2900
  "name": "UIAgentSuggestions",
2901
+ "parts": {},
2684
2902
  "related": [
2685
2903
  "agent-questions-ui",
2686
2904
  "agent-feedback-bar-ui"
@@ -2777,15 +2995,16 @@
2777
2995
  "training feedback"
2778
2996
  ],
2779
2997
  "name": "UIAgentTrace",
2998
+ "parts": {
2999
+ "default": {
3000
+ "description": "Template-owned anatomy, not a light-DOM insertion point (gh#1454). `#buildShell()` unconditionally wipes the host (`this.innerHTML = ''`) and rebuilds a `<details>` root from the `pills`/`metrics`/`feedback` properties — no pre-existing children are captured or preserved."
3001
+ }
3002
+ },
2780
3003
  "related": [
2781
3004
  "agent-reasoning-ui",
2782
3005
  "agent-feedback-bar-ui"
2783
3006
  ],
2784
- "slots": {
2785
- "default": {
2786
- "description": "Default slot — primary child content."
2787
- }
2788
- },
3007
+ "slots": {},
2789
3008
  "states": [
2790
3009
  {
2791
3010
  "description": "Default, ready for interaction.",
@@ -2970,6 +3189,7 @@
2970
3189
  "announce"
2971
3190
  ],
2972
3191
  "name": "UIAlert",
3192
+ "parts": {},
2973
3193
  "related": [
2974
3194
  "button"
2975
3195
  ],
@@ -3181,6 +3401,7 @@
3181
3401
  "bulk action"
3182
3402
  ],
3183
3403
  "name": "UIAnchorBar",
3404
+ "parts": {},
3184
3405
  "related": [],
3185
3406
  "slots": {
3186
3407
  "default": {
@@ -3290,6 +3511,7 @@
3290
3511
  "app-shell"
3291
3512
  ],
3292
3513
  "name": "EmbedShell",
3514
+ "parts": {},
3293
3515
  "related": [
3294
3516
  "AdminShell",
3295
3517
  "Frame",
@@ -3390,6 +3612,7 @@
3390
3612
  "nav-rail"
3391
3613
  ],
3392
3614
  "name": "UIAside",
3615
+ "parts": {},
3393
3616
  "related": [
3394
3617
  "app-shell",
3395
3618
  "drawer",
@@ -3510,24 +3733,25 @@
3510
3733
  "user"
3511
3734
  ],
3512
3735
  "name": "UIAvatar",
3513
- "related": [
3514
- "input",
3515
- "button",
3516
- "check-box",
3517
- "badge",
3518
- "avatar-group"
3519
- ],
3520
- "slots": {
3736
+ "parts": {
3521
3737
  "icon": {
3522
- "description": "Phosphor icon rendered inside the avatar circle (system-event avatars)"
3738
+ "description": "Phosphor icon rendered inside the avatar circle (system-event avatars) — template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always creates it from the `icon` prop; no consumer override path exists in source."
3523
3739
  },
3524
3740
  "img": {
3525
- "description": "Avatar image element"
3741
+ "description": "Avatar image element — template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always creates it from the `src` prop; no consumer override path exists in source."
3526
3742
  },
3527
3743
  "initials": {
3528
- "description": "Initials text span"
3744
+ "description": "Initials text span — template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always creates it from the `text` prop; no consumer override path exists in source."
3529
3745
  }
3530
3746
  },
3747
+ "related": [
3748
+ "input",
3749
+ "button",
3750
+ "check-box",
3751
+ "badge",
3752
+ "avatar-group"
3753
+ ],
3754
+ "slots": {},
3531
3755
  "states": [
3532
3756
  {
3533
3757
  "description": "Default, ready for interaction.",
@@ -3641,7 +3865,12 @@
3641
3865
  },
3642
3866
  "size": {
3643
3867
  "description": "Forwards to each child <avatar-ui> (sm|md|lg). Empty uses the per-avatar size. For denser or larger sets, set [scale] on an ancestor.",
3644
- "type": "string"
3868
+ "type": "string",
3869
+ "enum": [
3870
+ "sm",
3871
+ "md",
3872
+ "lg"
3873
+ ]
3645
3874
  }
3646
3875
  },
3647
3876
  "required": [
@@ -3663,6 +3892,7 @@
3663
3892
  "overflow-avatars"
3664
3893
  ],
3665
3894
  "name": "UIAvatarGroup",
3895
+ "parts": {},
3666
3896
  "related": [
3667
3897
  "Avatar",
3668
3898
  "Tag"
@@ -3803,6 +4033,7 @@
3803
4033
  "marker"
3804
4034
  ],
3805
4035
  "name": "UIBadge",
4036
+ "parts": {},
3806
4037
  "related": [
3807
4038
  "button",
3808
4039
  "grid",
@@ -3878,7 +4109,10 @@
3878
4109
  "properties": {
3879
4110
  "account": {
3880
4111
  "description": "Aggregate billing snapshot — source of truth for the whole\ndashboard. Shape:\n {plan: {id, name, price, cycle, currency, status},\n status: \"active\" | \"trialing\" | \"past_due\" | \"canceled\" | \"paused\",\n billingCycle: \"month\" | \"year\",\n currentSpend: number,\n seats: {used: number, total: number},\n nextInvoiceDate: ISO 8601 date string,\n paymentMethods: [...], // forwarded to payment-method-list\n invoices: [...], // forwarded to invoice-history\n plans?: [...], // forwarded to plan-picker; omitted when planSection is \"hidden\"\n dunning?: {amount, currency, dueAt, cardLast4?, reason?}}\nNull + no `data-stream-src` renders the empty state.\n",
3881
- "type": "object",
4112
+ "type": [
4113
+ "object",
4114
+ "null"
4115
+ ],
3882
4116
  "default": null
3883
4117
  },
3884
4118
  "component": {
@@ -3949,6 +4183,11 @@
3949
4183
  "tag-ui",
3950
4184
  "text-ui",
3951
4185
  "alert-ui",
4186
+ "avatar-ui",
4187
+ "col-ui",
4188
+ "row-ui",
4189
+ "grid-ui",
4190
+ "progress-ui",
3952
4191
  "plan-picker-ui",
3953
4192
  "payment-method-list-ui",
3954
4193
  "invoice-history-ui",
@@ -4018,6 +4257,7 @@
4018
4257
  "past-due"
4019
4258
  ],
4020
4259
  "name": "UIBillingOverview",
4260
+ "parts": {},
4021
4261
  "related": [
4022
4262
  "PlanPicker",
4023
4263
  "PaymentMethodList",
@@ -4213,6 +4453,7 @@
4213
4453
  "developer"
4214
4454
  ],
4215
4455
  "name": "UIBlock",
4456
+ "parts": {},
4216
4457
  "related": [
4217
4458
  "Section",
4218
4459
  "Col",
@@ -4335,6 +4576,7 @@
4335
4576
  "cite"
4336
4577
  ],
4337
4578
  "name": "UIBlockquote",
4579
+ "parts": {},
4338
4580
  "related": [
4339
4581
  "text",
4340
4582
  "link",
@@ -4466,6 +4708,7 @@
4466
4708
  "back"
4467
4709
  ],
4468
4710
  "name": "UIBreadcrumb",
4711
+ "parts": {},
4469
4712
  "related": [
4470
4713
  "AdminTopbar",
4471
4714
  "Nav",
@@ -4634,6 +4877,7 @@
4634
4877
  "icon-button"
4635
4878
  ],
4636
4879
  "name": "UIButton",
4880
+ "parts": {},
4637
4881
  "related": [
4638
4882
  "Link"
4639
4883
  ],
@@ -4641,9 +4885,6 @@
4641
4885
  "icon-trailing": {
4642
4886
  "description": "Trailing icon, after the label. Stamped from the `icon-trailing` prop, or slot a custom `<icon-ui slot=\"icon-trailing\">` directly (the consumer's element wins over the prop-stamped one). Sized to --content-height."
4643
4887
  },
4644
- "leading": {
4645
- "description": "Icon container (start), sized to --content-height"
4646
- },
4647
4888
  "trailing": {
4648
4889
  "description": "Icon container (end), sized to --content-height"
4649
4890
  }
@@ -4820,6 +5061,7 @@
4820
5061
  "substrate"
4821
5062
  ],
4822
5063
  "name": "UICalendarGrid",
5064
+ "parts": {},
4823
5065
  "related": [
4824
5066
  "CalendarPicker",
4825
5067
  "DateRangePicker",
@@ -4882,7 +5124,7 @@
4882
5124
  },
4883
5125
  "CalendarPicker": {
4884
5126
  "title": "CalendarPicker",
4885
- "description": "Date picker with trigger button and popover calendar grid. Form-associated input emitting ISO date string via change events; supports min/max and disabled-date masks. Use for single-date input in forms; for date ranges compose two pickers or use a dedicated range component.",
5127
+ "description": "Date (and, per `[precision]`, date+time) picker with trigger button and popover panel. Form-associated input emitting an ISO date (or, when `precision` is `minute`/`second`, ISO datetime) string via change events; supports min/max and disabled-date masks. Use for single-date or single-datetime input in forms; for date ranges use <date-range-picker-ui> instead of composing two calendar-picker instances. gh#1372 (#1363 C3c) folded <datetime-picker-ui>'s surface into this widened `precision` axis — see the deprecated <datetime-picker-ui> alias.",
4886
5128
  "type": "object",
4887
5129
  "allOf": [
4888
5130
  {
@@ -4907,7 +5149,7 @@
4907
5149
  "default": false
4908
5150
  },
4909
5151
  "format": {
4910
- "description": "Display format for the selected date",
5152
+ "description": "Display format for the trigger text. `short`, e.g. `Jan 1, 2026` (+ ` 14:30` when `precision` is minute/second); `long`, e.g. `January 1, 2026`; `iso`, the raw ISO string.",
4911
5153
  "type": "string",
4912
5154
  "enum": [
4913
5155
  "short",
@@ -4916,18 +5158,28 @@
4916
5158
  ],
4917
5159
  "default": "short"
4918
5160
  },
4919
- "label": {
4920
- "description": "Label text displayed above the trigger",
5161
+ "hourcycle": {
5162
+ "description": "Hour cycle for the time pane. Active only when `precision` is\nminute/second. Empty (default) derives from the document locale.\n`h12` forces a 12-hour cycle with an AM/PM (meridiem) segment; `h23`\nforces 24-hour cycle.\n",
5163
+ "type": "string",
5164
+ "enum": [
5165
+ "",
5166
+ "h12",
5167
+ "h23"
5168
+ ],
5169
+ "default": ""
5170
+ },
5171
+ "locale": {
5172
+ "description": "BCP-47 locale tag used to derive hour-cycle when `hour-cycle` is empty. Active only when `precision` is minute/second. Falls back to `<html lang>` then to browser default.",
4921
5173
  "type": "string",
4922
5174
  "default": ""
4923
5175
  },
4924
5176
  "max": {
4925
- "description": "Maximum selectable date in ISO format (YYYY-MM-DD)",
5177
+ "description": "Maximum selectable date (ISO `YYYY-MM-DD`), or datetime (ISO `YYYY-MM-DDTHH:mm[:ss]`) when `precision` is minute/second.",
4926
5178
  "type": "string",
4927
5179
  "default": ""
4928
5180
  },
4929
5181
  "min": {
4930
- "description": "Minimum selectable date in ISO format (YYYY-MM-DD)",
5182
+ "description": "Minimum selectable date (ISO `YYYY-MM-DD`), or datetime (ISO `YYYY-MM-DDTHH:mm[:ss]`) when `precision` is minute/second.",
4931
5183
  "type": "string",
4932
5184
  "default": ""
4933
5185
  },
@@ -4961,8 +5213,28 @@
4961
5213
  ],
4962
5214
  "default": "bottom"
4963
5215
  },
5216
+ "precision": {
5217
+ "description": "Mode axis (gh#1372,",
5218
+ "type": "string",
5219
+ "enum": [
5220
+ "date",
5221
+ "minute",
5222
+ "second"
5223
+ ],
5224
+ "default": "date"
5225
+ },
5226
+ "readonly": {
5227
+ "description": "Blocks edits; the trigger stays keyboard-focusable for screen-reader inspection but the popover does not open.",
5228
+ "type": "boolean",
5229
+ "default": false
5230
+ },
5231
+ "step": {
5232
+ "description": "Per-Arrow-keypress increment in seconds for the time pane. Active only when `precision` is minute/second. 60 = minute precision (default), 900 = 15-minute, 1 = second precision.",
5233
+ "type": "number",
5234
+ "default": 60
5235
+ },
4964
5236
  "value": {
4965
- "description": "Selected date (ISO string)",
5237
+ "description": "Selected date (ISO string), or datetime (ISO `YYYY-MM-DDTHH:mm[:ss]`) when `precision` is minute/second.",
4966
5238
  "type": "string",
4967
5239
  "default": ""
4968
5240
  }
@@ -4972,46 +5244,107 @@
4972
5244
  ],
4973
5245
  "unevaluatedProperties": false,
4974
5246
  "x-adiaui": {
4975
- "anti_patterns": [],
5247
+ "anti_patterns": [
5248
+ {
5249
+ "fix": "{\"component\": \"CalendarPicker\", \"precision\": \"minute\", \"value\": \"2026-05-24T00:00\"}\n",
5250
+ "why": "`value` is a date-only string but `precision` is \"minute\" — no time\ncomponent. The contract requires a full ISO 8601 datetime including\nthe `T` and time segment when `precision` isn't \"date\".\n",
5251
+ "wrong": "{\"component\": \"CalendarPicker\", \"precision\": \"minute\", \"value\": \"2026-05-24\"}\n"
5252
+ },
5253
+ {
5254
+ "fix": "{\"component\": \"Field\", \"label\": \"Date\", \"children\": [\"cal\"]}\n",
5255
+ "why": "`label` is not a first-class prop on CalendarPicker (#1363 C3d) —\nsiblings all delegate the field label to `<field-ui label>`.\n",
5256
+ "wrong": "{\"component\": \"CalendarPicker\", \"label\": \"Date\"}\n"
5257
+ }
5258
+ ],
4976
5259
  "category": "input",
4977
5260
  "composes": [
4978
- "button-ui"
5261
+ "calendar-grid-ui",
5262
+ "time-picker-ui",
5263
+ "divider-ui"
4979
5264
  ],
4980
5265
  "events": {
4981
5266
  "change": {
4982
- "description": "Fired when a date is selected"
5267
+ "description": "Fired when a value commits (date picked, or — when `precision` is minute/second — date picked + time edited, or Apply clicked in an explicit-commit footer)."
5268
+ },
5269
+ "close": {
5270
+ "description": "Popover closed (without commit, or after commit).",
5271
+ "detail": {
5272
+ "reason": "string"
5273
+ }
5274
+ },
5275
+ "input": {
5276
+ "description": "Fired during partial selection (date picked but time still pending, or vice versa — meaningful only when `precision` is minute/second).",
5277
+ "detail": {
5278
+ "value": "string"
5279
+ }
5280
+ },
5281
+ "invalid": {
5282
+ "description": "A constraint failed (out of range, or — when `precision` is minute/second — a parse error).",
5283
+ "detail": {
5284
+ "reason": "string",
5285
+ "value": "string"
5286
+ }
5287
+ },
5288
+ "open": {
5289
+ "description": "Popover opened (user clicked the trigger, pressed Enter/Space, or Apply/Cancel in a footer closed then reopened).",
5290
+ "detail": {
5291
+ "trigger": "string"
5292
+ }
4983
5293
  }
4984
5294
  },
4985
5295
  "examples": [
4986
5296
  {
4987
- "description": "Date and time picker form with calendar picker and time selects.",
4988
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"col\"\n ]\n },\n {\n \"id\": \"col\",\n \"component\": \"Column\",\n \"children\": [\n \"name\",\n \"cal\",\n \"btn\"\n ],\n \"gap\": \"4\"\n },\n {\n \"id\": \"name\",\n \"component\": \"Input\",\n \"label\": \"Event Name\"\n },\n {\n \"id\": \"cal\",\n \"component\": \"CalendarPicker\",\n \"label\": \"Date\"\n },\n {\n \"id\": \"btn\",\n \"component\": \"Button\",\n \"text\": \"Schedule\",\n \"variant\": \"primary\"\n }\n]",
5297
+ "description": "Event form with a name field and a date picker, wrapped in Field for its label per",
5298
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"col\"\n ]\n },\n {\n \"id\": \"col\",\n \"component\": \"Column\",\n \"children\": [\n \"name\",\n \"field\",\n \"btn\"\n ],\n \"gap\": \"4\"\n },\n {\n \"id\": \"name\",\n \"component\": \"Input\",\n \"label\": \"Event Name\"\n },\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Date\",\n \"children\": [\n \"cal\"\n ]\n },\n {\n \"id\": \"cal\",\n \"component\": \"CalendarPicker\"\n },\n {\n \"id\": \"btn\",\n \"component\": \"Button\",\n \"text\": \"Schedule\",\n \"variant\": \"primary\"\n }\n]",
4989
5299
  "name": "date-picker"
4990
5300
  },
4991
5301
  {
4992
- "description": "Date range selection form with start/end calendar pickers, quick-pick badges, and apply button.",
4993
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"hdr\",\n \"sec\",\n \"ftr\"\n ]\n },\n {\n \"id\": \"hdr\",\n \"component\": \"Header\",\n \"children\": [\n \"title\"\n ]\n },\n {\n \"id\": \"title\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"Select Dates\",\n \"variant\": \"section\"\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"fields\"\n ]\n },\n {\n \"id\": \"fields\",\n \"component\": \"Column\",\n \"children\": [\n \"calendars-row\",\n \"quick-picks\"\n ],\n \"gap\": \"4\"\n },\n {\n \"id\": \"calendars-row\",\n \"component\": \"Row\",\n \"children\": [\n \"start-cal\",\n \"end-cal\"\n ],\n \"gap\": \"3\"\n },\n {\n \"id\": \"start-cal\",\n \"component\": \"CalendarPicker\",\n \"label\": \"Start Date\",\n \"name\": \"startDate\"\n },\n {\n \"id\": \"end-cal\",\n \"component\": \"CalendarPicker\",\n \"label\": \"End Date\",\n \"name\": \"endDate\"\n },\n {\n \"id\": \"quick-picks\",\n \"component\": \"Row\",\n \"children\": [\n \"pick-today\",\n \"pick-week\",\n \"pick-month\",\n \"pick-quarter\"\n ],\n \"gap\": \"2\"\n },\n {\n \"id\": \"pick-today\",\n \"component\": \"Badge\",\n \"textContent\": \"Today\"\n },\n {\n \"id\": \"pick-week\",\n \"component\": \"Badge\",\n \"textContent\": \"This Week\"\n },\n {\n \"id\": \"pick-month\",\n \"component\": \"Badge\",\n \"textContent\": \"This Month\"\n },\n {\n \"id\": \"pick-quarter\",\n \"component\": \"Badge\",\n \"textContent\": \"This Quarter\"\n },\n {\n \"id\": \"ftr\",\n \"component\": \"Footer\",\n \"children\": [\n \"apply-btn\"\n ]\n },\n {\n \"id\": \"apply-btn\",\n \"component\": \"Button\",\n \"text\": \"Apply\",\n \"variant\": \"primary\"\n }\n]",
4994
- "name": "date-range-picker"
5302
+ "description": "Combined date+time selection via precision the mode gh#1372 folded in from the former <datetime-picker-ui>.",
5303
+ "a2ui": "[\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Appointment\",\n \"children\": [\"dt\"]\n },\n {\n \"id\": \"dt\",\n \"component\": \"CalendarPicker\",\n \"name\": \"appointment\",\n \"precision\": \"minute\",\n \"min\": \"2026-01-01T00:00\",\n \"max\": \"2026-12-31T23:59\"\n }\n]\n",
5304
+ "name": "datetime-picker"
5305
+ },
5306
+ {
5307
+ "description": "Single-date picker constrained to a future booking window via min/max, paired with a submit button.",
5308
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"col\"\n ]\n },\n {\n \"id\": \"col\",\n \"component\": \"Column\",\n \"children\": [\n \"field\",\n \"btn\"\n ],\n \"gap\": \"4\"\n },\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Check-in date\",\n \"children\": [\n \"cal\"\n ]\n },\n {\n \"id\": \"cal\",\n \"component\": \"CalendarPicker\",\n \"name\": \"checkin\",\n \"min\": \"2026-08-16\",\n \"max\": \"2026-12-31\"\n },\n {\n \"id\": \"btn\",\n \"component\": \"Button\",\n \"text\": \"Reserve\",\n \"variant\": \"primary\"\n }\n]",
5309
+ "name": "constrained-date"
5310
+ },
5311
+ {
5312
+ "description": "Log-cursor picker with second precision — gh#1372's fold of the former datetime-picker second-precision example.",
5313
+ "a2ui": "[\n {\n \"id\": \"dt\",\n \"component\": \"CalendarPicker\",\n \"name\": \"log-cursor\",\n \"precision\": \"second\",\n \"step\": 1,\n \"value\": \"2026-05-24T14:30:45\"\n }\n]\n",
5314
+ "name": "second-precision"
4995
5315
  }
4996
5316
  ],
4997
5317
  "keywords": [
4998
5318
  "calendarpicker",
4999
5319
  "calendar-picker",
5000
5320
  "calendar",
5001
- "picker"
5321
+ "picker",
5322
+ "datetimepicker",
5323
+ "datetime-picker",
5324
+ "datetime",
5325
+ "date-time",
5326
+ "dateandtime",
5327
+ "appointment",
5328
+ "schedule",
5329
+ "timestamp"
5002
5330
  ],
5003
5331
  "name": "UICalendarPicker",
5332
+ "parts": {},
5004
5333
  "related": [
5005
5334
  "input",
5006
5335
  "button",
5007
- "badge"
5336
+ "badge",
5337
+ "date-range-picker",
5338
+ "time-picker",
5339
+ "field",
5340
+ "popover"
5008
5341
  ],
5009
5342
  "slots": {
5010
- "calendar": {
5011
- "description": "Popover container for the month grid"
5343
+ "footer": {
5344
+ "description": "Optional Apply/Cancel buttons for explicit-commit flows. Spans the pane(s) below the calendar (+ time, when `precision` is minute/second)."
5012
5345
  },
5013
- "label": {
5014
- "description": "Label element above the trigger"
5346
+ "popover": {
5347
+ "description": "Popover container for the calendar pane(s) (gh#1461; renamed from the yaml's prior `calendar` key, which matched no real slot=\"…\" attribute — render() stamps this element as slot=\"popover\")."
5015
5348
  },
5016
5349
  "trigger": {
5017
5350
  "description": "Combobox button that opens the calendar popover"
@@ -5026,19 +5359,47 @@
5026
5359
  "description": "Non-interactive; dimmed.",
5027
5360
  "attribute": "disabled",
5028
5361
  "name": "disabled"
5362
+ },
5363
+ {
5364
+ "description": "Read-only; trigger keyboard-focusable but popover does not open.",
5365
+ "attribute": "readonly",
5366
+ "name": "readonly"
5029
5367
  }
5030
5368
  ],
5031
5369
  "status": "stable",
5032
5370
  "synonyms": {
5371
+ "appointment": [
5372
+ "datetime",
5373
+ "meeting",
5374
+ "schedule"
5375
+ ],
5376
+ "datetime": [
5377
+ "date-time",
5378
+ "timestamp",
5379
+ "appointment",
5380
+ "schedule"
5381
+ ],
5033
5382
  "tags": [
5034
5383
  "DateTimeInput",
5035
- "DatePicker"
5384
+ "DatePicker",
5385
+ "DateTimePicker",
5386
+ "DatetimeInput",
5387
+ "Timestamp"
5036
5388
  ]
5037
5389
  },
5038
5390
  "tag": "calendar-picker-ui",
5039
- "tokens": {},
5391
+ "tokens": {
5392
+ "--calendar-picker-divider": {
5393
+ "description": "Pane divider color. Only visible when `precision` is minute/second.",
5394
+ "default": "var(--md-sys-color-neutral-outline-variant)"
5395
+ },
5396
+ "--calendar-picker-popover-gap": {
5397
+ "description": "Gap between the calendar pane and the time pane. Only visible when `precision` is minute/second.",
5398
+ "default": "var(--a-space-3)"
5399
+ }
5400
+ },
5040
5401
  "traits": [],
5041
- "version": 1
5402
+ "version": 2
5042
5403
  }
5043
5404
  },
5044
5405
  "Canvas": {
@@ -5087,16 +5448,17 @@
5087
5448
  "canvas"
5088
5449
  ],
5089
5450
  "name": "UICanvas",
5451
+ "parts": {
5452
+ "default": {
5453
+ "description": "Template-owned anatomy, not a light-DOM insertion point (gh#1454). render() appends its own `<a2ui-root>` rendering surface; the runtime owns all rendered content (a2ui rule below: \"Do not place static children inside\"). No consumer content is captured or preserved."
5454
+ }
5455
+ },
5090
5456
  "related": [
5091
5457
  "A2uiRoot",
5092
5458
  "GenRoot",
5093
5459
  "EditorCanvas"
5094
5460
  ],
5095
- "slots": {
5096
- "default": {
5097
- "description": "Default slot — primary child content."
5098
- }
5099
- },
5461
+ "slots": {},
5100
5462
  "states": [
5101
5463
  {
5102
5464
  "description": "Default, ready for interaction.",
@@ -5149,9 +5511,31 @@
5149
5511
  "default": 1
5150
5512
  },
5151
5513
  "padding": {
5152
- "description": "Interior padding scale (overrides --card-padding). Accepts the named scale (none/xs/sm/md/lg/xl) or a numeric rung (\"1\"…\"16\").",
5514
+ "description": "Interior padding scale overrides --card-inset (the header/section/footer inset token) for the whole card. Accepts the named scale (none/xs/sm/md/lg/xl — the parametric --a-padding-* tokens, same vocabulary as block-ui's [padding]) or a literal space rung (\"0\"/\"1\"…\"10\"/\"12\"/\"16\", mapped to --a-space-N). Empty (default) defers to the ambient --card-inset (context/[size]-driven) — unchanged behavior for the many existing cards that never set this attribute.",
5153
5515
  "type": "string",
5154
- "default": "md"
5516
+ "enum": [
5517
+ "",
5518
+ "none",
5519
+ "xs",
5520
+ "sm",
5521
+ "md",
5522
+ "lg",
5523
+ "xl",
5524
+ "0",
5525
+ "1",
5526
+ "2",
5527
+ "3",
5528
+ "4",
5529
+ "5",
5530
+ "6",
5531
+ "7",
5532
+ "8",
5533
+ "9",
5534
+ "10",
5535
+ "12",
5536
+ "16"
5537
+ ],
5538
+ "default": ""
5155
5539
  },
5156
5540
  "raw": {
5157
5541
  "description": "Strips background, border, and shadow. Parent owns the surface. Content structure still applies.",
@@ -5219,6 +5603,7 @@
5219
5603
  "responsive"
5220
5604
  ],
5221
5605
  "name": "UICard",
5606
+ "parts": {},
5222
5607
  "related": [
5223
5608
  "avatar",
5224
5609
  "input",
@@ -5442,6 +5827,14 @@
5442
5827
  "component": {
5443
5828
  "const": "Chart"
5444
5829
  },
5830
+ "cornerRadius": {
5831
+ "description": "Bar corner radius in px (null = let CSS tokens decide)",
5832
+ "type": [
5833
+ "number",
5834
+ "null"
5835
+ ],
5836
+ "default": null
5837
+ },
5445
5838
  "data": {
5446
5839
  "description": "JS property (set programmatically — `el.data = [...]`). An array of plain objects; each object's keys are named by the `x` and `y` attributes — e.g. `<chart-ui x=\"month\" y=\"revenue\">` consumes `[{month:'Jan', revenue:3200}, {month:'Feb', revenue:4100}]`. The Chart.js `{labels, datasets}` envelope is NOT chart-ui's API — passing it (or any non-array value) renders an empty chart. May also be supplied declaratively as a JSON-array `data=\"[…]\"` attribute, hydrated once at connect. Custom accessor on the element class, not a reflected attribute.",
5447
5840
  "$ref": "#/$defs/DynamicObjectList"
@@ -5488,11 +5881,6 @@
5488
5881
  "type": "boolean",
5489
5882
  "default": false
5490
5883
  },
5491
- "radius": {
5492
- "description": "Bar corner radius (null = let CSS tokens decide)",
5493
- "type": "number",
5494
- "default": null
5495
- },
5496
5884
  "seriesEmphasis": {
5497
5885
  "description": "Multi-line only. Names one series key (matching a `y` key) to render at full strength — area fill + full-opacity line. Every other series drops its area fill and renders line-only at --chart-deemphasized-opacity. Empty (default) applies full treatment to every series, unchanged from pre-gh#561 behavior.",
5498
5886
  "type": "string",
@@ -5580,6 +5968,7 @@
5580
5968
  "poll"
5581
5969
  ],
5582
5970
  "name": "UIChart",
5971
+ "parts": {},
5583
5972
  "related": [
5584
5973
  "button",
5585
5974
  "grid",
@@ -5593,7 +5982,7 @@
5593
5982
  "description": "Chart rendering area"
5594
5983
  },
5595
5984
  "empty": {
5596
- "description": "Shown in place of the SVG when `.data` is empty or missing. Typically an `<empty-state-ui>` with icon + heading + description + optional action. Visibility is CSS-toggled via `[data-has-data]` on the host — authors don't need to manage it imperatively."
5985
+ "description": "Shown in place of the SVG when `.data` is empty or missing. Typically an `<empty-state-ui>` with icon + heading + description + optional action. Visibility is CSS-toggled via `[has-data]` on the host — authors don't need to manage it imperatively."
5597
5986
  }
5598
5987
  },
5599
5988
  "states": [
@@ -5602,8 +5991,9 @@
5602
5991
  "name": "idle"
5603
5992
  },
5604
5993
  {
5605
- "description": "No data — the empty slot (if provided) is rendered; otherwise the chart area renders nothing. Host carries [data-has-data] only when data is present.",
5606
- "name": "empty"
5994
+ "description": "No data — the empty slot (if provided) is rendered; otherwise the chart area renders nothing. Host carries [has-data] only when data is present (gh#1332 Category A — converged off the private [data-has-data] mirror).",
5995
+ "name": "empty",
5996
+ "selector": ":not([has-data])"
5607
5997
  }
5608
5998
  ],
5609
5999
  "status": "stable",
@@ -5854,6 +6244,7 @@
5854
6244
  "visualization"
5855
6245
  ],
5856
6246
  "name": "UIChartLegend",
6247
+ "parts": {},
5857
6248
  "related": [
5858
6249
  "chart",
5859
6250
  "badge",
@@ -5942,6 +6333,7 @@
5942
6333
  "conversation-input"
5943
6334
  ],
5944
6335
  "name": "ChatComposer",
6336
+ "parts": {},
5945
6337
  "related": [
5946
6338
  "ChatShell",
5947
6339
  "ChatThread",
@@ -6010,6 +6402,9 @@
6010
6402
  ],
6011
6403
  "unevaluatedProperties": false,
6012
6404
  "x-adiaui": {
6405
+ "allowedParents": [
6406
+ "ChatThread"
6407
+ ],
6013
6408
  "anti_patterns": [],
6014
6409
  "category": "feedback",
6015
6410
  "composes": [],
@@ -6022,6 +6417,7 @@
6022
6417
  "no-messages"
6023
6418
  ],
6024
6419
  "name": "ChatEmpty",
6420
+ "parts": {},
6025
6421
  "related": [
6026
6422
  "ChatShell",
6027
6423
  "ChatThread",
@@ -6078,6 +6474,10 @@
6078
6474
  ],
6079
6475
  "unevaluatedProperties": false,
6080
6476
  "x-adiaui": {
6477
+ "allowedParents": [
6478
+ "ChatShell",
6479
+ "ChatSidebar"
6480
+ ],
6081
6481
  "anti_patterns": [],
6082
6482
  "category": "layout",
6083
6483
  "composes": [],
@@ -6090,6 +6490,7 @@
6090
6490
  "app-header"
6091
6491
  ],
6092
6492
  "name": "ChatHeader",
6493
+ "parts": {},
6093
6494
  "related": [
6094
6495
  "ChatShell",
6095
6496
  "ChatStatus",
@@ -6243,6 +6644,7 @@
6243
6644
  "submit"
6244
6645
  ],
6245
6646
  "name": "UIChatInput",
6647
+ "parts": {},
6246
6648
  "related": [
6247
6649
  "ChatShell",
6248
6650
  "ChatThread",
@@ -6344,6 +6746,9 @@
6344
6746
  ],
6345
6747
  "unevaluatedProperties": false,
6346
6748
  "x-adiaui": {
6749
+ "allowedParents": [
6750
+ "Surface"
6751
+ ],
6347
6752
  "anti_patterns": [],
6348
6753
  "category": "container",
6349
6754
  "composes": [
@@ -6410,6 +6815,7 @@
6410
6815
  "assistant"
6411
6816
  ],
6412
6817
  "name": "ChatShell",
6818
+ "parts": {},
6413
6819
  "related": [
6414
6820
  "ChatThread",
6415
6821
  "ChatComposer",
@@ -6504,6 +6910,9 @@
6504
6910
  ],
6505
6911
  "unevaluatedProperties": false,
6506
6912
  "x-adiaui": {
6913
+ "allowedParents": [
6914
+ "ChatShell"
6915
+ ],
6507
6916
  "anti_patterns": [],
6508
6917
  "category": "layout",
6509
6918
  "composes": [],
@@ -6535,6 +6944,7 @@
6535
6944
  "inspector"
6536
6945
  ],
6537
6946
  "name": "ChatSidebar",
6947
+ "parts": {},
6538
6948
  "related": [
6539
6949
  "ChatShell",
6540
6950
  "ChatComposer",
@@ -6610,6 +7020,9 @@
6610
7020
  ],
6611
7021
  "unevaluatedProperties": false,
6612
7022
  "x-adiaui": {
7023
+ "allowedParents": [
7024
+ "ChatHeader"
7025
+ ],
6613
7026
  "anti_patterns": [],
6614
7027
  "category": "feedback",
6615
7028
  "composes": [],
@@ -6622,6 +7035,7 @@
6622
7035
  "streaming-indicator"
6623
7036
  ],
6624
7037
  "name": "ChatStatus",
7038
+ "parts": {},
6625
7039
  "related": [
6626
7040
  "ChatShell",
6627
7041
  "ChatHeader",
@@ -6683,6 +7097,9 @@
6683
7097
  ],
6684
7098
  "unevaluatedProperties": false,
6685
7099
  "x-adiaui": {
7100
+ "allowedParents": [
7101
+ "ChatShell"
7102
+ ],
6686
7103
  "anti_patterns": [],
6687
7104
  "category": "container",
6688
7105
  "composes": [],
@@ -6696,6 +7113,7 @@
6696
7113
  "scroll-surface"
6697
7114
  ],
6698
7115
  "name": "ChatThread",
7116
+ "parts": {},
6699
7117
  "related": [
6700
7118
  "ChatShell",
6701
7119
  "ChatEmpty",
@@ -6824,7 +7242,7 @@
6824
7242
  "wrong": "<field-ui inline label=\"Agree\">\n <check-ui></check-ui>\n</field-ui>\n"
6825
7243
  }
6826
7244
  ],
6827
- "category": "layout",
7245
+ "category": "input",
6828
7246
  "composes": [],
6829
7247
  "events": {
6830
7248
  "change": {
@@ -6842,19 +7260,20 @@
6842
7260
  "check"
6843
7261
  ],
6844
7262
  "name": "UICheck",
6845
- "related": [
6846
- "Switch",
6847
- "Radio",
6848
- "Field"
6849
- ],
6850
- "slots": {
7263
+ "parts": {
6851
7264
  "box": {
6852
- "description": "Visual checkbox indicator"
7265
+ "description": "Visual checkbox indicator — template-owned anatomy part, not a light-DOM insertion point"
6853
7266
  },
6854
7267
  "label": {
6855
- "description": "Label text beside the checkbox"
7268
+ "description": "Label text beside the checkbox — set via the `label` attribute (rendered by CSS `attr(label)` on `::after`, exposed as `aria-label`); template-owned, not a light-DOM insertion point (gh#1435, gh#1447)"
6856
7269
  }
6857
7270
  },
7271
+ "related": [
7272
+ "Switch",
7273
+ "Radio",
7274
+ "Field"
7275
+ ],
7276
+ "slots": {},
6858
7277
  "states": [
6859
7278
  {
6860
7279
  "description": "Default, ready for interaction.",
@@ -7061,6 +7480,7 @@
7061
7480
  "developer"
7062
7481
  ],
7063
7482
  "name": "UICode",
7483
+ "parts": {},
7064
7484
  "related": [
7065
7485
  "badge",
7066
7486
  "button"
@@ -7214,6 +7634,7 @@
7214
7634
  "col"
7215
7635
  ],
7216
7636
  "name": "UICol",
7637
+ "parts": {},
7217
7638
  "related": [
7218
7639
  "avatar",
7219
7640
  "input",
@@ -7422,6 +7843,7 @@
7422
7843
  "compact"
7423
7844
  ],
7424
7845
  "name": "UIColorInput",
7846
+ "parts": {},
7425
7847
  "related": [
7426
7848
  "color-picker",
7427
7849
  "popover",
@@ -7576,6 +7998,7 @@
7576
7998
  "picker"
7577
7999
  ],
7578
8000
  "name": "UIColorPicker",
8001
+ "parts": {},
7579
8002
  "related": [
7580
8003
  "grid",
7581
8004
  "button"
@@ -7744,8 +8167,8 @@
7744
8167
  "wrong": "{\"component\": \"Combobox\", \"value\": \"xx\", \"options\": [{\"value\": \"us\", \"label\": \"United States\"}]}\n"
7745
8168
  },
7746
8169
  {
7747
- "fix": "{\"component\": \"SegmentedControl\", \"options\": [{\"value\": \"a\", \"label\": \"A\"}, {\"value\": \"b\", \"label\": \"B\"}]}\n",
7748
- "why": "Only 2 options. Combobox is overkill — use SegmentedControl or Radio.\n",
8170
+ "fix": "{\"component\": \"Segmented\", \"children\": [{\"component\": \"Segment\", \"value\": \"a\", \"text\": \"A\"}, {\"component\": \"Segment\", \"value\": \"b\", \"text\": \"B\"}]}\n",
8171
+ "why": "Only 2 options. Combobox is overkill — use Segmented or Radio.\n",
7749
8172
  "wrong": "{\"component\": \"Combobox\", \"options\": [{\"value\": \"a\", \"label\": \"A\"}, {\"value\": \"b\", \"label\": \"B\"}]}\n"
7750
8173
  },
7751
8174
  {
@@ -7852,6 +8275,7 @@
7852
8275
  "member-picker"
7853
8276
  ],
7854
8277
  "name": "UICombobox",
8278
+ "parts": {},
7855
8279
  "related": [
7856
8280
  "select",
7857
8281
  "search",
@@ -8065,6 +8489,17 @@
8065
8489
  "keybinding"
8066
8490
  ],
8067
8491
  "name": "UICommand",
8492
+ "parts": {
8493
+ "footer": {
8494
+ "description": "Keyboard hint bar — template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() unconditionally stamps a fixed `<footer>` with hard-coded kbd hints; no consumer override path exists in source."
8495
+ },
8496
+ "input": {
8497
+ "description": "The auto-stamped search field — a contenteditable=\"plaintext-only\" span carrying role=\"combobox\" (per ADR-0025/ADR-0055; no native <input>). Internal only; not consumer-slottable — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
8498
+ },
8499
+ "list": {
8500
+ "description": "Container for command items and groups — template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always populates it wholesale from `.options`/parsed `<option>` children; any pre-existing content is discarded, not adopted."
8501
+ }
8502
+ },
8068
8503
  "related": [
8069
8504
  "AdminCommand",
8070
8505
  "Menu",
@@ -8073,16 +8508,7 @@
8073
8508
  ],
8074
8509
  "slots": {
8075
8510
  "empty": {
8076
- "description": "Empty state shown when no items match"
8077
- },
8078
- "footer": {
8079
- "description": "Keyboard hint bar"
8080
- },
8081
- "input": {
8082
- "description": "The auto-stamped search field — a contenteditable=\"plaintext-only\" span carrying role=\"combobox\" (per ADR-0025/ADR-0055; no native <input>). Internal only; not consumer-slottable."
8083
- },
8084
- "list": {
8085
- "description": "Container for command items and groups"
8511
+ "description": "Empty state shown when no items match. Consumer-supplied [slot=\"empty\"] content is captured before the internal shell renders and re-inserted — a genuine light-DOM insertion point."
8086
8512
  }
8087
8513
  },
8088
8514
  "states": [
@@ -8344,6 +8770,7 @@
8344
8770
  "dialog-modal"
8345
8771
  ],
8346
8772
  "name": "ConfirmDialog",
8773
+ "parts": {},
8347
8774
  "related": [
8348
8775
  "Modal",
8349
8776
  "AlertDialog",
@@ -8527,6 +8954,7 @@
8527
8954
  "popup-menu"
8528
8955
  ],
8529
8956
  "name": "UIContextMenu",
8957
+ "parts": {},
8530
8958
  "related": [
8531
8959
  "menu",
8532
8960
  "menu-item",
@@ -8594,6 +9022,11 @@
8594
9022
  }
8595
9023
  ],
8596
9024
  "properties": {
9025
+ "bandGap": {
9026
+ "description": "Override band-to-band vertical gap. Empty string = the\ndensity-modulated default. Numeric `1`..`6` selects the\ncorresponding --a-space-N step. Renamed from `[gap]` (gh#1335) —\nthis attribute set the component-local `--dashboard-layout-gap`\ntoken directly, never composing with the ambient\n`[size]`→`--a-gap` cascade the global Scale-grammar `[gap]`\nattribute uses, and covers a narrower numeric range (1-6 vs. the\nglobal 0-16) — a genuinely distinct, band-scoped concept kept\nunder its own namespaced name rather than converged.\n",
9027
+ "type": "string",
9028
+ "default": ""
9029
+ },
8597
9030
  "chart-split": {
8598
9031
  "description": "Chart-band column split. Empty string = single full-width chart;\n`2` = two equal columns; `2:1` / `3:2` / `3:1` = asymmetric\nratios. Collapses to single column at narrow widths (≤48em).\n",
8599
9032
  "type": "string",
@@ -8610,21 +9043,15 @@
8610
9043
  "const": "DashboardLayout"
8611
9044
  },
8612
9045
  "density": {
8613
- "description": "Spacing scale — propagates --a-density to descendant primitives\nvia CSS custom-property cascade. Empty string inherits whatever\ndensity is in effect on an ancestor (the default — respects an\napp-level density theme). `compact` / `comfortable` / `spacious`\nexplicitly override.\n",
9046
+ "description": "Spacing scale — propagates --a-density to descendant primitives\nvia CSS custom-property cascade. Empty string inherits whatever\ndensity is in effect on an ancestor (the default — respects an\napp-level density theme). `compact` / `spacious` explicitly\noverride. `comfortable` retired (gh#1335) — verified dead code:\nit set `--a-density: 1` with no gap-token override, functionally\nidentical to the \"\" (unset/ambient) state, not to `spacious`\n(`--a-density: 1.15` + wider gap tokens) — so it converges onto\n\"\" (the closest matching real behavior) rather than a\n`comfortable`→`spacious` rename, which would have silently\nchanged behavior for any existing consumer.\n",
8614
9047
  "type": "string",
8615
9048
  "enum": [
8616
9049
  "",
8617
- "comfortable",
8618
9050
  "compact",
8619
9051
  "spacious"
8620
9052
  ],
8621
9053
  "default": ""
8622
9054
  },
8623
- "gap": {
8624
- "description": "Override band-to-band vertical gap. Empty string = the\ndensity-modulated default (--a-space-4 at comfortable). Numeric\n`1`..`6` selects the corresponding --a-space-N step.\n",
8625
- "type": "string",
8626
- "default": ""
8627
- },
8628
9055
  "kpi-columns": {
8629
9056
  "description": "Target column count for the KPI band at desktop width. Range 2-6;\nout-of-range values fall back to 4. Container-query collapse\nreduces this at narrower widths (≤48em → 2; ≤32em → 1).\n",
8630
9057
  "type": "string",
@@ -8682,7 +9109,7 @@
8682
9109
  "description": "Fired when [density] changes (programmatic or via setDensity()).\nBubbles; detail.density carries the new value.\n",
8683
9110
  "detail": {
8684
9111
  "density": {
8685
- "description": "The new density value (comfortable / compact / spacious).",
9112
+ "description": "The new density value (\"\" / compact / spacious).",
8686
9113
  "type": "string"
8687
9114
  }
8688
9115
  }
@@ -8727,6 +9154,7 @@
8727
9154
  "layout-container"
8728
9155
  ],
8729
9156
  "name": "UIDashboardLayout",
9157
+ "parts": {},
8730
9158
  "related": [
8731
9159
  "AdminPageBody",
8732
9160
  "AdminPage",
@@ -9025,6 +9453,7 @@
9025
9453
  "reporting-period"
9026
9454
  ],
9027
9455
  "name": "UIDateRangePicker",
9456
+ "parts": {},
9028
9457
  "related": [
9029
9458
  "calendar-picker",
9030
9459
  "popover",
@@ -9134,7 +9563,7 @@
9134
9563
  "default": "var(--a-space-2)"
9135
9564
  },
9136
9565
  "--date-range-picker-selected-bg": {
9137
- "description": "Selected day-cell background (cascaded into the inner calendar via --calendar-picker-day-bg-selected).",
9566
+ "description": "Selected day-cell background (cascaded into the inner calendar via --calendar-grid-day-bg-selected).",
9138
9567
  "default": "var(--md-sys-color-primary)"
9139
9568
  },
9140
9569
  "--date-range-picker-selected-fg": {
@@ -9218,9 +9647,9 @@
9218
9647
  "wrong": "<date-range-selector-ui broadcast=\"document\"></date-range-selector-ui>\n<date-range-selector-ui broadcast=\"document\"></date-range-selector-ui>\n"
9219
9648
  },
9220
9649
  {
9221
- "description": "Using DateRangeSelector for single-date selection. The composite\nresolves a range; the picker UI exposes two-pane selection. For\nsingle-date use <input-ui type=\"date\"> or <calendar-picker-ui>.\n",
9222
- "right": "<input-ui type=\"date\" name=\"d\"></input-ui>\n",
9223
- "rule": "Range chooser → DateRangeSelector. Single-date chooser → input-ui\ntype=date or calendar-picker-ui.\n",
9650
+ "description": "Using DateRangeSelector for single-date selection. The composite\nresolves a range; the picker UI exposes two-pane selection. For\nsingle-date use <calendar-picker-ui> — input-ui's `type=\"date\"`\nwas removed (gh#1381, gh#1363 B10); it never rendered a\nnative date affordance.\n",
9651
+ "right": "<calendar-picker-ui name=\"d\"></calendar-picker-ui>\n",
9652
+ "rule": "Range chooser → DateRangeSelector. Single-date chooser →\ncalendar-picker-ui.\n",
9224
9653
  "wrong": "<date-range-selector-ui value=\"today\"></date-range-selector-ui>\n<!-- The selector still resolves a range (from=today, to=today). -->\n"
9225
9654
  },
9226
9655
  {
@@ -9293,6 +9722,7 @@
9293
9722
  "timeframe"
9294
9723
  ],
9295
9724
  "name": "DateRangeSelector",
9725
+ "parts": {},
9296
9726
  "related": [
9297
9727
  "DateRangePicker",
9298
9728
  "Segmented",
@@ -9382,7 +9812,7 @@
9382
9812
  },
9383
9813
  "DatetimePicker": {
9384
9814
  "title": "DatetimePicker",
9385
- "description": "Single-control date + time selection. Trigger button opens a popover with a `<calendar-picker-ui>` on the left + a `<time-picker-ui>` on the right; commit emits a full ISO 8601 datetime string (\"YYYY-MM-DDTHH:mm\" or with seconds). Composes the two underlying primitives never wraps a native `<input type=\"datetime-local\">` (per ADR-0025). Form-associated under one `name`. SPEC-038.",
9815
+ "description": "DEPRECATED (gh#1372, #1363 C3c) folded into <calendar-picker-ui>'s widened `precision` axis. `<datetime-picker-ui>` is now a thin `UICalendarPicker` subclass (see datetime-picker.class.js) rather than an independent implementation: `precision` defaults to `\"minute\"` (not `\"date\"`) and `placeholder` defaults to `\"Select date and time\"`; every other prop/event/token is inherited unchanged from <calendar-picker-ui>. Existing markup keeps working, but new markup should reach for `<calendar-picker-ui precision=\"minute\">` (or `precision=\"second\"`) directly. See <calendar-picker-ui> for the full contract.",
9386
9816
  "type": "object",
9387
9817
  "allOf": [
9388
9818
  {
@@ -9452,7 +9882,7 @@
9452
9882
  "default": false
9453
9883
  },
9454
9884
  "placeholder": {
9455
- "description": "Text shown in the trigger when the value is empty.",
9885
+ "description": "Text shown in the trigger when the value is empty. Defaults to \"Select date and time\" HERE (vs. \"Select date...\" on the base `<calendar-picker-ui>`).",
9456
9886
  "type": "string",
9457
9887
  "default": "Select date and time"
9458
9888
  },
@@ -9472,9 +9902,10 @@
9472
9902
  "default": "bottom"
9473
9903
  },
9474
9904
  "precision": {
9475
- "description": "Time-pane precision. `minute` (default) emits `HH:mm`; `second` exposes the seconds segment and emits `HH:mm:ss`.",
9905
+ "description": "Time-pane precision. `minute` (default HERE — `date` on the base `<calendar-picker-ui>`) emits `HH:mm`; `second` exposes the seconds segment and emits `HH:mm:ss`; `date` drops the time pane entirely (identical to the base class's own default).",
9476
9906
  "type": "string",
9477
9907
  "enum": [
9908
+ "date",
9478
9909
  "minute",
9479
9910
  "second"
9480
9911
  ],
@@ -9507,34 +9938,21 @@
9507
9938
  "wrong": "{\"component\": \"DatetimePicker\", \"value\": \"2026-05-24\"}\n"
9508
9939
  },
9509
9940
  {
9510
- "fix": "{\"component\": \"DatetimePicker\", \"value\": \"2026-05-24T14:30\"}\n",
9511
- "why": "`value` is a time-only string no date component. Use `<TimePicker>` for\ntime-only selection or supply the date portion.\n",
9512
- "wrong": "{\"component\": \"DatetimePicker\", \"value\": \"14:30\"}\n"
9513
- },
9514
- {
9515
- "fix": "{\"component\": \"DatetimePicker\", \"name\": \"field-name\"}\n",
9516
- "why": "Nesting a native datetime-local input violates ADR-0025 and bypasses\nElementInternals form participation.\n",
9517
- "wrong": "{\"component\": \"DatetimePicker\", \"children\": [\n {\"component\": \"Input\", \"type\": \"datetime-local\"}\n]}\n"
9518
- },
9519
- {
9520
- "fix": "<datetime-picker-ui name=\"appointment\"></datetime-picker-ui>\n",
9521
- "why": "Hand-rolled date + free-form time composition is the pattern this primitive\nreplaces. It misses the coordinated popover, the per-segment Spinbutton\na11y model, and unified form participation.\n",
9522
- "wrong": "<calendar-picker-ui></calendar-picker-ui>\n<input-ui type=\"text\" placeholder=\"HH:mm\"></input-ui>\n"
9941
+ "fix": "{\"component\": \"CalendarPicker\", \"precision\": \"minute\", \"name\": \"appointment\"}\n",
9942
+ "why": "DatetimePicker is deprecated (gh#1372)new generation should reach\nfor CalendarPicker's widened precision axis instead.\n",
9943
+ "wrong": "{\"component\": \"DatetimePicker\", \"name\": \"appointment\"}\n"
9523
9944
  }
9524
9945
  ],
9525
9946
  "category": "input",
9526
9947
  "composes": [
9527
9948
  "calendar-grid-ui",
9528
9949
  "time-picker-ui",
9529
- "button-ui",
9530
- "popover-ui",
9531
9950
  "divider-ui"
9532
9951
  ],
9533
9952
  "events": {
9534
9953
  "change": {
9535
9954
  "description": "Fired when the value commits (date picked + time edited, OR Apply clicked in explicit-commit mode).",
9536
9955
  "detail": {
9537
- "source": "string",
9538
9956
  "value": "string"
9539
9957
  }
9540
9958
  },
@@ -9566,24 +9984,9 @@
9566
9984
  },
9567
9985
  "examples": [
9568
9986
  {
9569
- "description": "Form-field-wrapped picker with min/max bounds.",
9987
+ "description": "Form-field-wrapped picker with min/max bounds. Prefer the CalendarPicker[precision] form for NEW markup — see calendar-picker-ui's own \"datetime-picker\" example.",
9570
9988
  "a2ui": "[\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Appointment\",\n \"children\": [\"dt\"]\n },\n {\n \"id\": \"dt\",\n \"component\": \"DatetimePicker\",\n \"name\": \"appointment\",\n \"min\": \"2026-01-01T00:00\",\n \"max\": \"2026-12-31T23:59\"\n }\n]\n",
9571
9989
  "name": "canonical"
9572
- },
9573
- {
9574
- "description": "Log-cursor picker with second precision.",
9575
- "a2ui": "[\n {\n \"id\": \"dt\",\n \"component\": \"DatetimePicker\",\n \"name\": \"log-cursor\",\n \"precision\": \"second\",\n \"step\": 1,\n \"value\": \"2026-05-24T14:30:45\"\n }\n]\n",
9576
- "name": "second-precision"
9577
- },
9578
- {
9579
- "description": "Cron editor with forced 24-hour cycle.",
9580
- "a2ui": "[\n {\n \"id\": \"dt\",\n \"component\": \"DatetimePicker\",\n \"name\": \"cron\",\n \"hourCycle\": \"h23\"\n }\n]\n",
9581
- "name": "forced-24h"
9582
- },
9583
- {
9584
- "description": "Read-only datetime for inspection only.",
9585
- "a2ui": "[\n {\n \"id\": \"dt\",\n \"component\": \"DatetimePicker\",\n \"readonly\": true,\n \"value\": \"2026-05-24T14:30\"\n }\n]\n",
9586
- "name": "readonly"
9587
9990
  }
9588
9991
  ],
9589
9992
  "keywords": [
@@ -9597,6 +10000,7 @@
9597
10000
  "timestamp"
9598
10001
  ],
9599
10002
  "name": "UIDatetimePicker",
10003
+ "parts": {},
9600
10004
  "related": [
9601
10005
  "calendar-picker",
9602
10006
  "time-picker",
@@ -9610,7 +10014,7 @@
9610
10014
  "description": "Optional Apply / Cancel buttons for explicit-commit flows. Spans both panes below the calendar + time area."
9611
10015
  },
9612
10016
  "trigger": {
9613
- "description": "Custom trigger replacement. When omitted, a default `<button-ui>` is stamped."
10017
+ "description": "Custom trigger replacement. When omitted, a default trigger is stamped (a plain clickable span, per the base `<calendar-picker-ui>` — NOT the old standalone datetime-picker's `<button-ui>` trigger; see the Consequences note below)."
9614
10018
  }
9615
10019
  },
9616
10020
  "states": [
@@ -9619,19 +10023,9 @@
9619
10023
  "name": "idle"
9620
10024
  },
9621
10025
  {
9622
- "description": "Popover open, no calendar pick yet.",
9623
- "attribute": "open",
9624
- "name": "open-pending-date"
9625
- },
9626
- {
9627
- "description": "Date picked; time pane is the next focus target.",
10026
+ "description": "Popover open.",
9628
10027
  "attribute": "open",
9629
- "name": "open-pending-time"
9630
- },
9631
- {
9632
- "description": "Both panes set; awaiting Apply (explicit-commit mode only).",
9633
- "attribute": "open",
9634
- "name": "open-committed"
10028
+ "name": "open"
9635
10029
  },
9636
10030
  {
9637
10031
  "description": "Non-interactive; dimmed.",
@@ -9644,7 +10038,7 @@
9644
10038
  "name": "readonly"
9645
10039
  }
9646
10040
  ],
9647
- "status": "experimental",
10041
+ "status": "deprecated",
9648
10042
  "synonyms": {
9649
10043
  "appointment": [
9650
10044
  "datetime",
@@ -9665,66 +10059,9 @@
9665
10059
  ]
9666
10060
  },
9667
10061
  "tag": "datetime-picker-ui",
9668
- "tokens": {
9669
- "--datetime-picker-bg": {
9670
- "description": "Host background.",
9671
- "default": "var(--a-bg)"
9672
- },
9673
- "--datetime-picker-divider": {
9674
- "description": "Pane divider color.",
9675
- "default": "var(--a-border-subtle)"
9676
- },
9677
- "--datetime-picker-duration": {
9678
- "description": "Open/close transition duration.",
9679
- "default": "var(--a-duration-fast)"
9680
- },
9681
- "--datetime-picker-easing": {
9682
- "description": "Open/close transition easing.",
9683
- "default": "var(--a-easing)"
9684
- },
9685
- "--datetime-picker-fg": {
9686
- "description": "Host text color.",
9687
- "default": "var(--a-fg)"
9688
- },
9689
- "--datetime-picker-popover-bg": {
9690
- "description": "Popover background.",
9691
- "default": "var(--a-bg-subtle)"
9692
- },
9693
- "--datetime-picker-popover-border": {
9694
- "description": "Popover border color.",
9695
- "default": "var(--a-border-subtle)"
9696
- },
9697
- "--datetime-picker-popover-gap": {
9698
- "description": "Gap between calendar pane and time pane.",
9699
- "default": "var(--a-space-3)"
9700
- },
9701
- "--datetime-picker-popover-padding": {
9702
- "description": "Popover internal padding.",
9703
- "default": "var(--a-space-3)"
9704
- },
9705
- "--datetime-picker-popover-radius": {
9706
- "description": "Popover border radius.",
9707
- "default": "var(--a-radius-lg)"
9708
- },
9709
- "--datetime-picker-popover-shadow": {
9710
- "description": "Popover box shadow.",
9711
- "default": "var(--a-shadow-lg)"
9712
- },
9713
- "--datetime-picker-px": {
9714
- "description": "Horizontal popover padding.",
9715
- "default": "var(--a-space-3)"
9716
- },
9717
- "--datetime-picker-py": {
9718
- "description": "Vertical popover padding.",
9719
- "default": "var(--a-space-2)"
9720
- },
9721
- "--datetime-picker-trigger-min-width": {
9722
- "description": "Default trigger min-width — sized so the formatted date+time fits without truncation.",
9723
- "default": "16em"
9724
- }
9725
- },
10062
+ "tokens": {},
9726
10063
  "traits": [],
9727
- "version": 1
10064
+ "version": 2
9728
10065
  }
9729
10066
  },
9730
10067
  "DemoToggle": {
@@ -9812,6 +10149,7 @@
9812
10149
  "switch"
9813
10150
  ],
9814
10151
  "name": "UIDemoToggle",
10152
+ "parts": {},
9815
10153
  "related": [
9816
10154
  "Switch",
9817
10155
  "Card"
@@ -9940,6 +10278,7 @@
9940
10278
  "dl"
9941
10279
  ],
9942
10280
  "name": "UIDescriptionList",
10281
+ "parts": {},
9943
10282
  "related": [
9944
10283
  "List",
9945
10284
  "Field",
@@ -10061,6 +10400,7 @@
10061
10400
  "non-editable"
10062
10401
  ],
10063
10402
  "name": "UIDisplayField",
10403
+ "parts": {},
10064
10404
  "related": [
10065
10405
  "field",
10066
10406
  "input",
@@ -10207,6 +10547,7 @@
10207
10547
  "spacer"
10208
10548
  ],
10209
10549
  "name": "UIDivider",
10550
+ "parts": {},
10210
10551
  "related": [
10211
10552
  "upload",
10212
10553
  "input",
@@ -10366,6 +10707,7 @@
10366
10707
  "expand"
10367
10708
  ],
10368
10709
  "name": "UIDrawer",
10710
+ "parts": {},
10369
10711
  "related": [
10370
10712
  "button",
10371
10713
  "empty-state",
@@ -10383,9 +10725,6 @@
10383
10725
  "action-leading": {
10384
10726
  "description": "Direct child of <footer> — leading (inline-start) action cluster. Used for dual-cluster footers where a destructive or secondary action sits on the opposite edge from the primary trailing cluster (e.g. Delete ↔ Cancel/Save, Back ↔ Cancel/Next). Replaces the legacy <span data-spacer> hack."
10385
10727
  },
10386
- "backdrop": {
10387
- "description": "Scrim overlay behind the drawer (stamped by the component)."
10388
- },
10389
10728
  "body": {
10390
10729
  "description": "Scrollable content region. Accepts one or more bare <section> tags or [slot=\"body\"] elements; multi-section stacks are mounted in author order and share the panel's scroll context. [bleed] removes section padding; [padding] adds a canvas-scrim background for hero regions."
10391
10730
  },
@@ -10594,43 +10933,45 @@
10594
10933
  "catalog-browser"
10595
10934
  ],
10596
10935
  "name": "UIDrilldown",
10597
- "related": [
10598
- "Tree",
10599
- "List",
10600
- "Nav",
10601
- "Breadcrumb",
10602
- "Menu"
10603
- ],
10604
- "slots": {
10936
+ "parts": {
10605
10937
  "title": {
10606
- "description": "Auto-stamped title cluster (current-level label + item count) inside the header."
10938
+ "description": "Auto-stamped title cluster (current-level label + item count) inside the header — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
10607
10939
  },
10608
10940
  "back": {
10609
- "description": "Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level."
10610
- },
10611
- "breadcrumb": {
10612
- "description": "Optional slot for a consumer-supplied <breadcrumb-ui> in the level header, for deep hierarchies. Not managed by drilldown-ui — the consumer wires jump clicks to `.path = [...]` itself."
10941
+ "description": "Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
10613
10942
  },
10614
10943
  "counts": {
10615
- "description": "Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts`."
10944
+ "description": "Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts` — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
10616
10945
  },
10617
10946
  "dot": {
10618
- "description": "Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone."
10947
+ "description": "Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
10619
10948
  },
10620
10949
  "filter": {
10621
- "description": "Auto-stamped filter-input row, shown only when `[filterable]` is set."
10950
+ "description": "Auto-stamped filter-input row, shown only when `[filterable]` is set — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
10622
10951
  },
10623
10952
  "header": {
10624
- "description": "Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable."
10953
+ "description": "Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable; template-owned anatomy part, not a light-DOM insertion point (gh#1454). Stamped once via an unconditional `this.innerHTML = …` with no consumer-content capture (except `breadcrumb`, which stays in `slots:` above)."
10625
10954
  },
10626
10955
  "main": {
10627
- "description": "Auto-stamped per-row content column (label + optional meta line)."
10956
+ "description": "Auto-stamped per-row content column (label + optional meta line) — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
10628
10957
  },
10629
10958
  "meta": {
10630
- "description": "Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta`."
10959
+ "description": "Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta` — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
10631
10960
  },
10632
10961
  "viewport": {
10633
- "description": "Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip)."
10962
+ "description": "Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip) — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
10963
+ }
10964
+ },
10965
+ "related": [
10966
+ "Tree",
10967
+ "List",
10968
+ "Nav",
10969
+ "Breadcrumb",
10970
+ "Menu"
10971
+ ],
10972
+ "slots": {
10973
+ "breadcrumb": {
10974
+ "description": "Optional slot for a consumer-supplied <breadcrumb-ui> in the level header, for deep hierarchies. Not managed by drilldown-ui — the consumer wires jump clicks to `.path = [...]` itself."
10634
10975
  }
10635
10976
  },
10636
10977
  "states": [
@@ -10756,6 +11097,9 @@
10756
11097
  ],
10757
11098
  "unevaluatedProperties": false,
10758
11099
  "x-adiaui": {
11100
+ "allowedParents": [
11101
+ "EditorShell"
11102
+ ],
10759
11103
  "anti_patterns": [],
10760
11104
  "category": "container",
10761
11105
  "composes": [],
@@ -10769,6 +11113,7 @@
10769
11113
  "editor-surface"
10770
11114
  ],
10771
11115
  "name": "EditorCanvas",
11116
+ "parts": {},
10772
11117
  "related": [
10773
11118
  "EditorShell",
10774
11119
  "EditorCanvasEmpty",
@@ -10834,6 +11179,9 @@
10834
11179
  ],
10835
11180
  "unevaluatedProperties": false,
10836
11181
  "x-adiaui": {
11182
+ "allowedParents": [
11183
+ "EditorCanvas"
11184
+ ],
10837
11185
  "anti_patterns": [],
10838
11186
  "category": "feedback",
10839
11187
  "composes": [],
@@ -10847,6 +11195,7 @@
10847
11195
  "canvas-empty"
10848
11196
  ],
10849
11197
  "name": "EditorCanvasEmpty",
11198
+ "parts": {},
10850
11199
  "related": [
10851
11200
  "EditorShell",
10852
11201
  "EditorCanvas",
@@ -10903,6 +11252,9 @@
10903
11252
  ],
10904
11253
  "unevaluatedProperties": false,
10905
11254
  "x-adiaui": {
11255
+ "allowedParents": [
11256
+ "EditorCanvas"
11257
+ ],
10906
11258
  "anti_patterns": [],
10907
11259
  "category": "layout",
10908
11260
  "composes": [],
@@ -10918,6 +11270,7 @@
10918
11270
  "tab-strip"
10919
11271
  ],
10920
11272
  "name": "EditorCanvasToolbar",
11273
+ "parts": {},
10921
11274
  "related": [
10922
11275
  "EditorShell",
10923
11276
  "EditorCanvas",
@@ -10988,6 +11341,10 @@
10988
11341
  ],
10989
11342
  "unevaluatedProperties": false,
10990
11343
  "x-adiaui": {
11344
+ "allowedParents": [
11345
+ "Surface",
11346
+ "AdminPageBody"
11347
+ ],
10991
11348
  "anti_patterns": [],
10992
11349
  "category": "container",
10993
11350
  "composes": [],
@@ -11003,6 +11360,7 @@
11003
11360
  "editing-surface"
11004
11361
  ],
11005
11362
  "name": "EditorShell",
11363
+ "parts": {},
11006
11364
  "related": [
11007
11365
  "EditorToolbar",
11008
11366
  "EditorCanvas",
@@ -11092,6 +11450,9 @@
11092
11450
  ],
11093
11451
  "unevaluatedProperties": false,
11094
11452
  "x-adiaui": {
11453
+ "allowedParents": [
11454
+ "EditorShell"
11455
+ ],
11095
11456
  "anti_patterns": [],
11096
11457
  "category": "layout",
11097
11458
  "composes": [],
@@ -11115,6 +11476,7 @@
11115
11476
  "trailing"
11116
11477
  ],
11117
11478
  "name": "EditorSidebar",
11479
+ "parts": {},
11118
11480
  "related": [
11119
11481
  "EditorShell",
11120
11482
  "EditorCanvas",
@@ -11175,6 +11537,9 @@
11175
11537
  ],
11176
11538
  "unevaluatedProperties": false,
11177
11539
  "x-adiaui": {
11540
+ "allowedParents": [
11541
+ "EditorShell"
11542
+ ],
11178
11543
  "anti_patterns": [],
11179
11544
  "category": "layout",
11180
11545
  "composes": [],
@@ -11187,6 +11552,7 @@
11187
11552
  "editor-footer"
11188
11553
  ],
11189
11554
  "name": "EditorStatusbar",
11555
+ "parts": {},
11190
11556
  "related": [
11191
11557
  "EditorShell",
11192
11558
  "EditorToolbar",
@@ -11256,6 +11622,9 @@
11256
11622
  ],
11257
11623
  "unevaluatedProperties": false,
11258
11624
  "x-adiaui": {
11625
+ "allowedParents": [
11626
+ "EditorShell"
11627
+ ],
11259
11628
  "anti_patterns": [],
11260
11629
  "category": "layout",
11261
11630
  "composes": [],
@@ -11276,6 +11645,7 @@
11276
11645
  "editor-actions"
11277
11646
  ],
11278
11647
  "name": "EditorToolbar",
11648
+ "parts": {},
11279
11649
  "related": [
11280
11650
  "EditorShell",
11281
11651
  "EditorCanvas",
@@ -11396,15 +11766,16 @@
11396
11766
  "third-party"
11397
11767
  ],
11398
11768
  "name": "UIEmbed",
11769
+ "parts": {
11770
+ "iframe": {
11771
+ "description": "Sandboxed <iframe> element (allow-scripts allow-same-origin) — template-owned anatomy part, not a light-DOM insertion point (gh#1447)"
11772
+ }
11773
+ },
11399
11774
  "related": [
11400
11775
  "slider",
11401
11776
  "button"
11402
11777
  ],
11403
- "slots": {
11404
- "iframe": {
11405
- "description": "Sandboxed <iframe> element (allow-scripts allow-same-origin)"
11406
- }
11407
- },
11778
+ "slots": {},
11408
11779
  "states": [
11409
11780
  {
11410
11781
  "description": "Default, ready for interaction.",
@@ -11552,6 +11923,7 @@
11552
11923
  "state"
11553
11924
  ],
11554
11925
  "name": "UIEmptyState",
11926
+ "parts": {},
11555
11927
  "related": [
11556
11928
  "button",
11557
11929
  "drawer",
@@ -11669,8 +12041,14 @@
11669
12041
  ],
11670
12042
  "unevaluatedProperties": false,
11671
12043
  "x-adiaui": {
11672
- "anti_patterns": [],
11673
- "category": "container",
12044
+ "anti_patterns": [
12045
+ {
12046
+ "fix": "{\"component\": \"Toast\", \"variant\": \"success\", \"text\": \"Saved successfully.\"}\n",
12047
+ "why": "<feed-ui> is a lazily-mounted per-position singleton reached via\nUIFeed.get()/.post(); statically nesting <feed-item-ui> children in\ngenerated markup bypasses that container lifecycle. Declarative\ntransient notifications are <toast-ui>'s job — it already dissolves\ninto this same channel on connect (SPEC-FEED-CHANNEL-001 Phase 4).\n",
12048
+ "wrong": "{\"component\": \"Feed\", \"children\": [{\"component\": \"FeedItem\", \"variant\": \"success\", \"text\": \"Saved successfully.\"}]}\n"
12049
+ }
12050
+ ],
12051
+ "category": "feedback",
11674
12052
  "composes": [
11675
12053
  "button-ui",
11676
12054
  "feed-item-ui"
@@ -11691,6 +12069,7 @@
11691
12069
  "notification-channel"
11692
12070
  ],
11693
12071
  "name": "UIFeedContainer",
12072
+ "parts": {},
11694
12073
  "related": [
11695
12074
  "FeedItem",
11696
12075
  "Toast",
@@ -11779,6 +12158,9 @@
11779
12158
  ],
11780
12159
  "unevaluatedProperties": false,
11781
12160
  "x-adiaui": {
12161
+ "allowedParents": [
12162
+ "Feed"
12163
+ ],
11782
12164
  "anti_patterns": [],
11783
12165
  "category": "feedback",
11784
12166
  "composes": [],
@@ -11797,17 +12179,34 @@
11797
12179
  "notification-card"
11798
12180
  ],
11799
12181
  "name": "UIFeedItem",
12182
+ "parts": {
12183
+ "body": {
12184
+ "description": "Template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always clears (`body.textContent = ''`) and rebuilds it wholesale from the `text` / `heading` props every cycle — no consumer content is preserved."
12185
+ }
12186
+ },
11800
12187
  "related": [
11801
12188
  "Feed",
11802
12189
  "Toast",
11803
12190
  "Alert"
11804
12191
  ],
11805
- "slots": {
11806
- "body": {
11807
- "description": "Default content slot (also accepts the `text` / `heading` props)"
12192
+ "slots": {},
12193
+ "states": [
12194
+ {
12195
+ "description": "Entry transition settled — deferred one frame (or immediate under SSR) after mount so the enter transition can run.",
12196
+ "attribute": "open",
12197
+ "name": "open"
12198
+ },
12199
+ {
12200
+ "description": "Dismiss in progress — the exit transition is running before the element removes itself.",
12201
+ "attribute": "closing",
12202
+ "name": "closing"
12203
+ },
12204
+ {
12205
+ "description": "Above the parent `<feed-ui>`'s `[max]` visible-lane limit; hidden until a visible sibling dismisses and promotes it (Phase 2 max-queue).",
12206
+ "attribute": "queued",
12207
+ "name": "queued"
11808
12208
  }
11809
- },
11810
- "states": {},
12209
+ ],
11811
12210
  "status": "stable",
11812
12211
  "synonyms": {
11813
12212
  "feed-item": [
@@ -11912,6 +12311,7 @@
11912
12311
  "wrapper"
11913
12312
  ],
11914
12313
  "name": "UIField",
12314
+ "parts": {},
11915
12315
  "related": [
11916
12316
  "input",
11917
12317
  "select",
@@ -12061,6 +12461,7 @@
12061
12461
  "group"
12062
12462
  ],
12063
12463
  "name": "UIFields",
12464
+ "parts": {},
12064
12465
  "related": [
12065
12466
  "field",
12066
12467
  "input",
@@ -12155,6 +12556,7 @@
12155
12556
  "footer"
12156
12557
  ],
12157
12558
  "name": "UIFooter",
12559
+ "parts": {},
12158
12560
  "related": [
12159
12561
  "avatar",
12160
12562
  "input",
@@ -12257,6 +12659,7 @@
12257
12659
  ],
12258
12660
  "keywords": [],
12259
12661
  "name": "FormPopover",
12662
+ "parts": {},
12260
12663
  "related": [],
12261
12664
  "slots": {
12262
12665
  "default": {
@@ -12321,6 +12724,7 @@
12321
12724
  "sheet"
12322
12725
  ],
12323
12726
  "name": "UIFrame",
12727
+ "parts": {},
12324
12728
  "related": [
12325
12729
  "Card",
12326
12730
  "Drawer",
@@ -12421,15 +12825,16 @@
12421
12825
  "agent-shell"
12422
12826
  ],
12423
12827
  "name": "GenRoot",
12828
+ "parts": {
12829
+ "default": {
12830
+ "description": "Template-owned anatomy, not a light-DOM insertion point (gh#1454). render() unconditionally creates its own `<chat-thread-ui>` / `<canvas-ui>` / (when `[inspector]`) `<inspector-ui>` children and appends them — it never checks for or adopts consumer-authored children of those tags. The previous description (\"Author supplies chat-ui, canvas-ui... children\") documented an authoring model the source has never implemented; corrected here per AGENTS.md's source-wins rule."
12831
+ }
12832
+ },
12424
12833
  "related": [
12425
12834
  "AppShell",
12426
12835
  "Chat"
12427
12836
  ],
12428
- "slots": {
12429
- "default": {
12430
- "description": "Author supplies chat-ui, canvas-ui, and optional inspector-ui children."
12431
- }
12432
- },
12837
+ "slots": {},
12433
12838
  "states": [
12434
12839
  {
12435
12840
  "description": "Default mode=chat.",
@@ -12536,6 +12941,7 @@
12536
12941
  "responsive"
12537
12942
  ],
12538
12943
  "name": "UIGrid",
12944
+ "parts": {},
12539
12945
  "related": [
12540
12946
  "button",
12541
12947
  "badge",
@@ -12647,8 +13053,8 @@
12647
13053
  "component": {
12648
13054
  "const": "Header"
12649
13055
  },
12650
- "padding": {
12651
- "description": "Bare attribute — enables default header padding. The container parent's own `padding` prop sets the scale.",
13056
+ "padded": {
13057
+ "description": "Bare attribute — enables default header padding. The container parent's own `padding` prop sets the scale. Renamed from `[padding]` (gh#1335) — a boolean can't share a name with the global Scale-grammar `[padding]` attribute (ADR-0053).",
12652
13058
  "type": "boolean",
12653
13059
  "default": false
12654
13060
  }
@@ -12678,6 +13084,7 @@
12678
13084
  "header"
12679
13085
  ],
12680
13086
  "name": "UIHeader",
13087
+ "parts": {},
12681
13088
  "related": [
12682
13089
  "avatar",
12683
13090
  "input",
@@ -12808,7 +13215,7 @@
12808
13215
  "unevaluatedProperties": false,
12809
13216
  "x-adiaui": {
12810
13217
  "anti_patterns": [],
12811
- "category": "data-display",
13218
+ "category": "data",
12812
13219
  "composes": [],
12813
13220
  "events": {
12814
13221
  "cell-click": {
@@ -12846,6 +13253,7 @@
12846
13253
  "activity"
12847
13254
  ],
12848
13255
  "name": "UIHeatmap",
13256
+ "parts": {},
12849
13257
  "related": [
12850
13258
  "chart",
12851
13259
  "calendar-picker"
@@ -12969,6 +13377,7 @@
12969
13377
  "icon"
12970
13378
  ],
12971
13379
  "name": "UIIcon",
13380
+ "parts": {},
12972
13381
  "related": [
12973
13382
  "input",
12974
13383
  "empty-state",
@@ -13019,6 +13428,17 @@
13019
13428
  "component": {
13020
13429
  "const": "Image"
13021
13430
  },
13431
+ "cornerRadius": {
13432
+ "description": "Border radius token. Renamed from `[radius]` (gh#1335) — a preset-enum can't share a name with the global Enum·preset `[radius]` attribute (`sharp`/`rounded`/`round`), whose vocabulary is unrelated (ADR-0053); mirrors chart-ui's own `[corner-radius]` fix (ADR-0054) and skeleton-ui's matching rename (image-ui composes skeleton-ui for its loading fallback).",
13433
+ "type": "string",
13434
+ "enum": [
13435
+ "sm",
13436
+ "md",
13437
+ "lg",
13438
+ "full"
13439
+ ],
13440
+ "default": ""
13441
+ },
13022
13442
  "fallback": {
13023
13443
  "description": "Fallback image URL on error",
13024
13444
  "type": "string",
@@ -13040,17 +13460,6 @@
13040
13460
  "type": "string",
13041
13461
  "default": ""
13042
13462
  },
13043
- "radius": {
13044
- "description": "Border radius token",
13045
- "type": "string",
13046
- "enum": [
13047
- "sm",
13048
- "md",
13049
- "lg",
13050
- "full"
13051
- ],
13052
- "default": ""
13053
- },
13054
13463
  "raw": {
13055
13464
  "description": "Strip chrome (no background, no radius) for edge-to-edge rendering.",
13056
13465
  "type": "boolean",
@@ -13091,7 +13500,7 @@
13091
13500
  },
13092
13501
  {
13093
13502
  "description": "Image upload card with drag-and-drop zone and a 3-column preview grid of placeholder image cards. Footer holds cancel and upload action buttons.",
13094
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"hdr\",\n \"sec\",\n \"ftr\"\n ]\n },\n {\n \"id\": \"hdr\",\n \"component\": \"Header\",\n \"children\": [\n \"title\"\n ]\n },\n {\n \"id\": \"title\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"variant\": \"section\",\n \"textContent\": \"Upload Images\"\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"col\"\n ]\n },\n {\n \"id\": \"col\",\n \"component\": \"Column\",\n \"gap\": \"4\",\n \"children\": [\n \"uploader\",\n \"preview-grid\"\n ]\n },\n {\n \"id\": \"uploader\",\n \"component\": \"Upload\",\n \"accept\": \"image/*\",\n \"multiple\": true,\n \"hint\": \"Drag images here or click to browse\"\n },\n {\n \"id\": \"preview-grid\",\n \"component\": \"Grid\",\n \"columns\": \"3\",\n \"gap\": \"3\",\n \"children\": [\n \"preview-1\",\n \"preview-2\",\n \"preview-3\"\n ]\n },\n {\n \"id\": \"preview-1\",\n \"component\": \"Card\",\n \"variant\": \"outlined\",\n \"children\": [\n \"img-1\"\n ]\n },\n {\n \"id\": \"img-1\",\n \"component\": \"Image\",\n \"src\": \"\",\n \"alt\": \"Preview 1\",\n \"height\": \"120px\",\n \"fit\": \"cover\",\n \"radius\": \"sm\"\n },\n {\n \"id\": \"preview-2\",\n \"component\": \"Card\",\n \"variant\": \"outlined\",\n \"children\": [\n \"img-2\"\n ]\n },\n {\n \"id\": \"img-2\",\n \"component\": \"Image\",\n \"src\": \"\",\n \"alt\": \"Preview 2\",\n \"height\": \"120px\",\n \"fit\": \"cover\",\n \"radius\": \"sm\"\n },\n {\n \"id\": \"preview-3\",\n \"component\": \"Card\",\n \"variant\": \"outlined\",\n \"children\": [\n \"img-3\"\n ]\n },\n {\n \"id\": \"img-3\",\n \"component\": \"Image\",\n \"src\": \"\",\n \"alt\": \"Preview 3\",\n \"height\": \"120px\",\n \"fit\": \"cover\",\n \"radius\": \"sm\"\n },\n {\n \"id\": \"ftr\",\n \"component\": \"Footer\",\n \"children\": [\n \"ftr-actions\"\n ]\n },\n {\n \"id\": \"ftr-actions\",\n \"component\": \"Row\",\n \"gap\": \"2\",\n \"children\": [\n \"cancel-btn\",\n \"upload-btn\"\n ]\n },\n {\n \"id\": \"cancel-btn\",\n \"component\": \"Button\",\n \"text\": \"Cancel\",\n \"variant\": \"ghost\"\n },\n {\n \"id\": \"upload-btn\",\n \"component\": \"Button\",\n \"text\": \"Upload\",\n \"variant\": \"primary\"\n }\n]",
13503
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"hdr\",\n \"sec\",\n \"ftr\"\n ]\n },\n {\n \"id\": \"hdr\",\n \"component\": \"Header\",\n \"children\": [\n \"title\"\n ]\n },\n {\n \"id\": \"title\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"variant\": \"section\",\n \"textContent\": \"Upload Images\"\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"col\"\n ]\n },\n {\n \"id\": \"col\",\n \"component\": \"Column\",\n \"gap\": \"4\",\n \"children\": [\n \"uploader\",\n \"preview-grid\"\n ]\n },\n {\n \"id\": \"uploader\",\n \"component\": \"Upload\",\n \"accept\": \"image/*\",\n \"multiple\": true,\n \"hint\": \"Drag images here or click to browse\"\n },\n {\n \"id\": \"preview-grid\",\n \"component\": \"Grid\",\n \"columns\": \"3\",\n \"gap\": \"3\",\n \"children\": [\n \"preview-1\",\n \"preview-2\",\n \"preview-3\"\n ]\n },\n {\n \"id\": \"preview-1\",\n \"component\": \"Card\",\n \"variant\": \"outlined\",\n \"children\": [\n \"img-1\"\n ]\n },\n {\n \"id\": \"img-1\",\n \"component\": \"Image\",\n \"src\": \"\",\n \"alt\": \"Preview 1\",\n \"height\": \"120px\",\n \"fit\": \"cover\",\n \"cornerRadius\": \"sm\"\n },\n {\n \"id\": \"preview-2\",\n \"component\": \"Card\",\n \"variant\": \"outlined\",\n \"children\": [\n \"img-2\"\n ]\n },\n {\n \"id\": \"img-2\",\n \"component\": \"Image\",\n \"src\": \"\",\n \"alt\": \"Preview 2\",\n \"height\": \"120px\",\n \"fit\": \"cover\",\n \"cornerRadius\": \"sm\"\n },\n {\n \"id\": \"preview-3\",\n \"component\": \"Card\",\n \"variant\": \"outlined\",\n \"children\": [\n \"img-3\"\n ]\n },\n {\n \"id\": \"img-3\",\n \"component\": \"Image\",\n \"src\": \"\",\n \"alt\": \"Preview 3\",\n \"height\": \"120px\",\n \"fit\": \"cover\",\n \"cornerRadius\": \"sm\"\n },\n {\n \"id\": \"ftr\",\n \"component\": \"Footer\",\n \"children\": [\n \"ftr-actions\"\n ]\n },\n {\n \"id\": \"ftr-actions\",\n \"component\": \"Row\",\n \"gap\": \"2\",\n \"children\": [\n \"cancel-btn\",\n \"upload-btn\"\n ]\n },\n {\n \"id\": \"cancel-btn\",\n \"component\": \"Button\",\n \"text\": \"Cancel\",\n \"variant\": \"ghost\"\n },\n {\n \"id\": \"upload-btn\",\n \"component\": \"Button\",\n \"text\": \"Upload\",\n \"variant\": \"primary\"\n }\n]",
13095
13504
  "name": "file-upload-gallery"
13096
13505
  }
13097
13506
  ],
@@ -13115,6 +13524,7 @@
13115
13524
  "assets"
13116
13525
  ],
13117
13526
  "name": "UIImage",
13527
+ "parts": {},
13118
13528
  "related": [
13119
13529
  "button",
13120
13530
  "select",
@@ -13123,14 +13533,27 @@
13123
13533
  "upload"
13124
13534
  ],
13125
13535
  "slots": {
13126
- "img": {
13127
- "description": "Stamped <img> element"
13536
+ "image": {
13537
+ "description": "The <img> element. Adopt-or-stamp (gh#1461): an author-supplied [slot=\"image\"] child is adopted as-is; otherwise a lazy-loading <img> is created. Renamed from the yaml's prior `img` key, which matched neither this real attribute value nor any DOM element image-ui stamps."
13538
+ },
13539
+ "skeleton": {
13540
+ "description": "Loading-state placeholder shown until the image loads or errors. Adopt-or-stamp: an author-supplied [slot=\"skeleton\"] child is adopted; otherwise a <skeleton-ui> is created."
13128
13541
  }
13129
13542
  },
13130
13543
  "states": [
13131
13544
  {
13132
- "description": "Default, ready for interaction.",
13133
- "name": "idle"
13545
+ "description": "Default, ready for interaction.",
13546
+ "name": "idle"
13547
+ },
13548
+ {
13549
+ "description": "The `[slot=\"image\"]` element's `load` event has fired (or it was already `complete` with a non-zero `naturalWidth` at connect — the gh#999 missed-load guard). Reveals the image and hides the skeleton via opacity transition.",
13550
+ "attribute": "loaded",
13551
+ "name": "loaded"
13552
+ },
13553
+ {
13554
+ "description": "The image failed to load and either no `[fallback]` was set or the fallback URL itself also failed. The skeleton stays visible (no built-in visual error affordance beyond this attribute today — consumers style `[error]` themselves).",
13555
+ "attribute": "error",
13556
+ "name": "error"
13134
13557
  }
13135
13558
  ],
13136
13559
  "status": "stable",
@@ -13335,6 +13758,7 @@
13335
13758
  "edit-in-place"
13336
13759
  ],
13337
13760
  "name": "UIInlineEdit",
13761
+ "parts": {},
13338
13762
  "related": [
13339
13763
  "input",
13340
13764
  "field",
@@ -13428,10 +13852,11 @@
13428
13852
  "$ref": "#/$defs/DynamicString"
13429
13853
  },
13430
13854
  "live": {
13431
- "description": "Sets `aria-live` on the host for dynamic message updates. Empty = no live region (static annotation).",
13855
+ "description": "Sets `aria-live` on the host for dynamic message updates. `off` = no live region (static annotation) — the A2UI v1.0 vocabulary (off | polite | assertive, SPEC REQ-013); empty string is the legacy alias for `off`, kept for existing consumers.",
13432
13856
  "type": "string",
13433
13857
  "enum": [
13434
13858
  "",
13859
+ "off",
13435
13860
  "polite",
13436
13861
  "assertive"
13437
13862
  ],
@@ -13489,6 +13914,7 @@
13489
13914
  "notice"
13490
13915
  ],
13491
13916
  "name": "UIInlineMessage",
13917
+ "parts": {},
13492
13918
  "related": [
13493
13919
  "alert",
13494
13920
  "field",
@@ -13562,7 +13988,7 @@
13562
13988
  ],
13563
13989
  "properties": {
13564
13990
  "type": {
13565
- "description": "Input type. `password` wraps a native `<input>` for disc masking; `number` renders a contenteditable + stepper buttons (no native input). All other types use plain contenteditable.",
13991
+ "description": "Input type. `password` wraps a native `<input>` for disc masking; `number` renders a contenteditable + stepper buttons (no native input). `text`/`email`/`tel`/`url` use plain contenteditable. input-ui does NOT implement date/time/color/search affordances — those HTML5 type values render as a plain contenteditable with no calendar, clock, swatch, or search affordance (first-pass-VALID against this enum historically, but functionally broken generation output). Use the owning primitive instead — CalendarPicker for date (+ month/week, no dedicated granularity primitive exists), DatetimePicker for datetime-local, TimePicker for time, ColorInput/ColorPicker for color, Search for search. See anti_patterns.",
13566
13992
  "type": "string",
13567
13993
  "enum": [
13568
13994
  "text",
@@ -13570,14 +13996,7 @@
13570
13996
  "password",
13571
13997
  "number",
13572
13998
  "tel",
13573
- "url",
13574
- "search",
13575
- "date",
13576
- "datetime-local",
13577
- "time",
13578
- "month",
13579
- "week",
13580
- "color"
13999
+ "url"
13581
14000
  ],
13582
14001
  "default": "text"
13583
14002
  },
@@ -13619,22 +14038,34 @@
13619
14038
  },
13620
14039
  "max": {
13621
14040
  "description": "Maximum numeric value. Applies when `type=\"number\"`. Clamps + drives aria-valuemax + the [+] button's disabled state.",
13622
- "type": "number",
14041
+ "type": [
14042
+ "number",
14043
+ "null"
14044
+ ],
13623
14045
  "default": null
13624
14046
  },
13625
14047
  "maxlength": {
13626
14048
  "description": "Maximum character length for validation",
13627
- "type": "number",
14049
+ "type": [
14050
+ "number",
14051
+ "null"
14052
+ ],
13628
14053
  "default": null
13629
14054
  },
13630
14055
  "min": {
13631
14056
  "description": "Minimum numeric value. Applies when `type=\"number\"`. Clamps + drives aria-valuemin + the [-] button's disabled state.",
13632
- "type": "number",
14057
+ "type": [
14058
+ "number",
14059
+ "null"
14060
+ ],
13633
14061
  "default": null
13634
14062
  },
13635
14063
  "minlength": {
13636
14064
  "description": "Minimum character length for validation",
13637
- "type": "number",
14065
+ "type": [
14066
+ "number",
14067
+ "null"
14068
+ ],
13638
14069
  "default": null
13639
14070
  },
13640
14071
  "name": {
@@ -13654,7 +14085,10 @@
13654
14085
  },
13655
14086
  "precision": {
13656
14087
  "description": "Decimal places to display + clamp to, when `type=\"number\"`. Overrides the implicit decimal-count from `step` — e.g. `step=1 precision=2` formats \"10.00\".",
13657
- "type": "number",
14088
+ "type": [
14089
+ "number",
14090
+ "null"
14091
+ ],
13658
14092
  "default": null
13659
14093
  },
13660
14094
  "prefix": {
@@ -13698,7 +14132,43 @@
13698
14132
  ],
13699
14133
  "unevaluatedProperties": false,
13700
14134
  "x-adiaui": {
13701
- "anti_patterns": [],
14135
+ "anti_patterns": [
14136
+ {
14137
+ "fix": "{\"component\": \"CalendarPicker\"}\n",
14138
+ "why": "input-ui's `type` enum no longer includes \"date\" (gh#1363\nB10) — it never rendered a native date picker, just a plain\ncontenteditable surface with no calendar affordance. Use\nCalendarPicker for single-date input.\n",
14139
+ "wrong": "{\"component\": \"Input\", \"type\": \"date\"}\n"
14140
+ },
14141
+ {
14142
+ "fix": "{\"component\": \"DatetimePicker\"}\n",
14143
+ "why": "Same gap as \"date\" — no native datetime picker rendered. Use\nDatetimePicker for combined date + time input.\n",
14144
+ "wrong": "{\"component\": \"Input\", \"type\": \"datetime-local\"}\n"
14145
+ },
14146
+ {
14147
+ "fix": "{\"component\": \"TimePicker\"}\n",
14148
+ "why": "Same gap as \"date\" — no native time picker rendered. Use\nTimePicker for time-of-day input.\n",
14149
+ "wrong": "{\"component\": \"Input\", \"type\": \"time\"}\n"
14150
+ },
14151
+ {
14152
+ "fix": "{\"component\": \"CalendarPicker\"}\n",
14153
+ "why": "No native month picker rendered, and no dedicated month-granularity\nprimitive exists in the catalog. CalendarPicker (day granularity)\nis the closest routed primitive.\n",
14154
+ "wrong": "{\"component\": \"Input\", \"type\": \"month\"}\n"
14155
+ },
14156
+ {
14157
+ "fix": "{\"component\": \"CalendarPicker\"}\n",
14158
+ "why": "No native week picker rendered, and no dedicated week-granularity\nprimitive exists in the catalog. CalendarPicker (day granularity)\nis the closest routed primitive.\n",
14159
+ "wrong": "{\"component\": \"Input\", \"type\": \"week\"}\n"
14160
+ },
14161
+ {
14162
+ "fix": "{\"component\": \"ColorInput\"}\n",
14163
+ "why": "No native color swatch/picker rendered — just a plain text\nsurface. Use ColorInput for a compact form-bearing swatch +\npopover, or ColorPicker directly for the full OKLCH picker\nsurface.\n",
14164
+ "wrong": "{\"component\": \"Input\", \"type\": \"color\"}\n"
14165
+ },
14166
+ {
14167
+ "fix": "{\"component\": \"Search\"}\n",
14168
+ "why": "No search icon or clear affordance rendered — plain\ncontenteditable, functionally identical to the default text\ntype. Use Search for the dedicated magnifying-glass + clear +\ndebounced-search-event primitive.\n",
14169
+ "wrong": "{\"component\": \"Input\", \"type\": \"search\"}\n"
14170
+ }
14171
+ ],
13702
14172
  "category": "input",
13703
14173
  "composes": [
13704
14174
  "button-ui",
@@ -13759,12 +14229,18 @@
13759
14229
  "tag"
13760
14230
  ],
13761
14231
  "name": "UIInput",
14232
+ "parts": {},
13762
14233
  "related": [
13763
14234
  "avatar",
13764
14235
  "button",
13765
14236
  "table",
13766
14237
  "pagination",
13767
- "check-box"
14238
+ "check-box",
14239
+ "search",
14240
+ "calendar-picker",
14241
+ "datetime-picker",
14242
+ "time-picker",
14243
+ "color-input"
13768
14244
  ],
13769
14245
  "slots": {
13770
14246
  "leading": {
@@ -13935,6 +14411,7 @@
13935
14411
  "inspector"
13936
14412
  ],
13937
14413
  "name": "UIInspector",
14414
+ "parts": {},
13938
14415
  "related": [
13939
14416
  "A2uiRoot",
13940
14417
  "EditorSidebar",
@@ -14117,6 +14594,7 @@
14117
14594
  "tile"
14118
14595
  ],
14119
14596
  "name": "UIIntegrationCard",
14597
+ "parts": {},
14120
14598
  "related": [
14121
14599
  "card",
14122
14600
  "badge",
@@ -14390,6 +14868,7 @@
14390
14868
  "marketplace"
14391
14869
  ],
14392
14870
  "name": "UIIntegrationsPage",
14871
+ "parts": {},
14393
14872
  "related": [
14394
14873
  "IntegrationCard",
14395
14874
  "Grid",
@@ -14417,12 +14896,12 @@
14417
14896
  },
14418
14897
  {
14419
14898
  "description": "Search query yields zero cards.",
14420
- "attribute": "data-empty-search",
14899
+ "attribute": "empty-search",
14421
14900
  "name": "empty-search"
14422
14901
  },
14423
14902
  {
14424
14903
  "description": "`integrations` array is empty.",
14425
- "attribute": "data-empty-data",
14904
+ "attribute": "empty-data",
14426
14905
  "name": "empty-data"
14427
14906
  }
14428
14907
  ],
@@ -14532,17 +15011,21 @@
14532
15011
  "default": ""
14533
15012
  },
14534
15013
  "density": {
14535
- "description": "Line-items table row density. `compact` for tightly-packed\ninvoices with many line items; `standard` for typical invoices.\nForwarded to the embedded <table-ui density>.\n",
15014
+ "description": "Line-items table row density. `compact` for tightly-packed\ninvoices with many line items; unset (default) for typical\ninvoices. Forwarded to the embedded <table-ui density>.\nConverged onto the global `[density]` Enum·preset vocabulary\n(gh#1335) — `standard` retired (it was never a real state; the\nforwarding logic already treated it as unset) and `spacious`\nadded for parity with the global grammar.\n",
14536
15015
  "type": "string",
14537
15016
  "enum": [
15017
+ "",
14538
15018
  "compact",
14539
- "standard"
15019
+ "spacious"
14540
15020
  ],
14541
- "default": "standard"
15021
+ "default": ""
14542
15022
  },
14543
15023
  "invoice": {
14544
15024
  "description": "The invoice record. Source of truth for the rendered page.\nShape: {number, status, issuedAt, dueAt, customer:{name,email},\nremitTo?:{name,address?}, lines:[{description,qty,unitAmount,\namount}], subtotal, tax, discount?, total, currency,\nnotes?:string}. Null + no data-stream-src renders the empty\nstate.\n",
14545
- "type": "object",
15025
+ "type": [
15026
+ "object",
15027
+ "null"
15028
+ ],
14546
15029
  "default": null
14547
15030
  },
14548
15031
  "loading": {
@@ -14672,6 +15155,7 @@
14672
15155
  "void"
14673
15156
  ],
14674
15157
  "name": "UIInvoiceDetail",
15158
+ "parts": {},
14675
15159
  "related": [
14676
15160
  "Card",
14677
15161
  "Table",
@@ -14806,14 +15290,14 @@
14806
15290
  "default": ""
14807
15291
  },
14808
15292
  "density": {
14809
- "description": "Row density, forwarded to <table-ui>. `compact` for dense lists,\n`standard` for default rows, `comfortable` for spacious rows.\n",
15293
+ "description": "Row density, forwarded to <table-ui>. `compact` for dense lists,\n`spacious` for airier rows, unset (default) for standard rows.\nConverged onto the global `[density]` Enum·preset vocabulary\n(gh#1335) — `standard` retired (never a real state) and\n`comfortable` renamed to `spacious` (ADR-0054's own migration\nmapping).\n",
14810
15294
  "type": "string",
14811
15295
  "enum": [
15296
+ "",
14812
15297
  "compact",
14813
- "standard",
14814
- "comfortable"
15298
+ "spacious"
14815
15299
  ],
14816
- "default": "standard"
15300
+ "default": ""
14817
15301
  },
14818
15302
  "exportable": {
14819
15303
  "description": "When set, the default toolbar carries an \"Export CSV\" button.\nConsumers overriding the toolbar via slot=\"toolbar\" can omit\nthis and stamp their own export affordance.\n",
@@ -14875,6 +15359,8 @@
14875
15359
  "composes": [
14876
15360
  "table-ui",
14877
15361
  "table-toolbar-ui",
15362
+ "card-ui",
15363
+ "row-ui",
14878
15364
  "badge-ui",
14879
15365
  "button-ui",
14880
15366
  "empty-state-ui",
@@ -14989,6 +15475,7 @@
14989
15475
  "export-invoices"
14990
15476
  ],
14991
15477
  "name": "InvoiceHistory",
15478
+ "parts": {},
14992
15479
  "related": [
14993
15480
  "Table",
14994
15481
  "TableToolbar",
@@ -15148,6 +15635,7 @@
15148
15635
  "keybinding"
15149
15636
  ],
15150
15637
  "name": "UIKbd",
15638
+ "parts": {},
15151
15639
  "related": [
15152
15640
  "grid"
15153
15641
  ],
@@ -15279,7 +15767,7 @@
15279
15767
  "❌ `<link-ui>` with no `href` AND no `press` handler — a link to nowhere is a bug. Either set `href` or wire a navigate action handler.",
15280
15768
  "❌ `<link-ui>` for form submission — submission is a button concern. Use `<button-ui type=\"submit\">`."
15281
15769
  ],
15282
- "category": "content",
15770
+ "category": "display",
15283
15771
  "composes": [],
15284
15772
  "events": {
15285
15773
  "press": {
@@ -15321,6 +15809,7 @@
15321
15809
  "url"
15322
15810
  ],
15323
15811
  "name": "UILink",
15812
+ "parts": {},
15324
15813
  "related": [
15325
15814
  "Button",
15326
15815
  "NavItem",
@@ -15378,7 +15867,7 @@
15378
15867
  },
15379
15868
  "List": {
15380
15869
  "title": "List",
15381
- "description": "Styled flat list with optional row dividers and icons — each row\nis a <list-item-ui> child. Selectable mode via [selectable] +\n[selectedKey] / `select` event. Composes <icon-ui> for row leading\nglyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),\n<tree-ui> (hierarchical with arbitrary nesting), and <table-ui>\n(tabular data with columns). Use list-ui for non-navigable,\nnon-tabular vertical rows — comment lists, file lists, message\nstreams outside chat-shell.\n",
15870
+ "description": "Styled flat list with optional row dividers and icons — each row\nis a <list-item-ui> child. Selectable mode via [selectable] +\n[selectedKey] / `selection-change` event. Composes <icon-ui> for row\nleading glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),\n<tree-ui> (hierarchical with arbitrary nesting), and <table-ui>\n(tabular data with columns). Use list-ui for non-navigable,\nnon-tabular vertical rows — comment lists, file lists, message\nstreams outside chat-shell.\n",
15382
15871
  "type": "object",
15383
15872
  "allOf": [
15384
15873
  {
@@ -15408,13 +15897,18 @@
15408
15897
  "default": false
15409
15898
  },
15410
15899
  "selectedKey": {
15411
- "description": "ID (or data-key) of the currently-selected child listitem.",
15900
+ "description": "ID (or data-key) of the currently-selected child listitem — drives each child's [selected] reflected prop (ADR-0056, #1363 B7). Kept as `selectedKey` rather than renamed to `value` (segmented/tabs/ select's parent-selection prop name): list rows are identified by DOM id/data-key, not an option value, and ADR-0056 itself governs only the child's own [selected] state surface, not this naming — a cross-family rename has no ratifying ADR (B5/B9-shaped follow-up).",
15412
15901
  "type": "string",
15413
15902
  "default": ""
15414
15903
  },
15415
15904
  "spacing": {
15416
- "description": "Item spacing",
15905
+ "description": "Item spacing scale — `sm`/`lg` modulate the per-item inset; `md` (default) is the base inset.",
15417
15906
  "type": "string",
15907
+ "enum": [
15908
+ "sm",
15909
+ "md",
15910
+ "lg"
15911
+ ],
15418
15912
  "default": "md"
15419
15913
  }
15420
15914
  },
@@ -15460,6 +15954,7 @@
15460
15954
  "star"
15461
15955
  ],
15462
15956
  "name": "UIList",
15957
+ "parts": {},
15463
15958
  "related": [
15464
15959
  "ListItem",
15465
15960
  "Tree",
@@ -15534,6 +16029,11 @@
15534
16029
  "description": "Optional leading icon name (Phosphor).",
15535
16030
  "type": "string"
15536
16031
  },
16032
+ "selected": {
16033
+ "description": "Whether this row is the current selection. Managed by the parent <list-ui>[selectable] — don't set directly; the parent's [selectedKey] is the single source of truth (ADR-0056).",
16034
+ "type": "boolean",
16035
+ "default": false
16036
+ },
15537
16037
  "text": {
15538
16038
  "description": "Primary text. Renders as semibold inline body.",
15539
16039
  "type": "string"
@@ -15544,6 +16044,9 @@
15544
16044
  ],
15545
16045
  "unevaluatedProperties": false,
15546
16046
  "x-adiaui": {
16047
+ "allowedParents": [
16048
+ "List"
16049
+ ],
15547
16050
  "anti_patterns": [],
15548
16051
  "category": "layout",
15549
16052
  "composes": [],
@@ -15557,6 +16060,7 @@
15557
16060
  "row"
15558
16061
  ],
15559
16062
  "name": "UIListItem",
16063
+ "parts": {},
15560
16064
  "related": [
15561
16065
  "List",
15562
16066
  "NavItem",
@@ -15775,6 +16279,7 @@
15775
16279
  "10k-rows"
15776
16280
  ],
15777
16281
  "name": "UIListWindow",
16282
+ "parts": {},
15778
16283
  "related": [
15779
16284
  "List",
15780
16285
  "ListItem",
@@ -15959,6 +16464,7 @@
15959
16464
  "wait"
15960
16465
  ],
15961
16466
  "name": "UILoadingOverlay",
16467
+ "parts": {},
15962
16468
  "related": [
15963
16469
  "Spinner",
15964
16470
  "Skeleton",
@@ -16085,7 +16591,7 @@
16085
16591
  "wrong": "<mark>matched</mark>"
16086
16592
  }
16087
16593
  ],
16088
- "category": "typography",
16594
+ "category": "display",
16089
16595
  "composes": [],
16090
16596
  "events": {},
16091
16597
  "examples": [
@@ -16102,6 +16608,7 @@
16102
16608
  "emphasis"
16103
16609
  ],
16104
16610
  "name": "UIMark",
16611
+ "parts": {},
16105
16612
  "related": [
16106
16613
  "text",
16107
16614
  "tag"
@@ -16167,8 +16674,8 @@
16167
16674
  "component": {
16168
16675
  "const": "Menu"
16169
16676
  },
16170
- "gap": {
16171
- "description": "Gap in px",
16677
+ "offset": {
16678
+ "description": "Pixel offset between the anchor (trigger) and the menu popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053); matches popover-ui's own `[offset]` (same anchorPopover() helper).",
16172
16679
  "type": "number",
16173
16680
  "default": 4
16174
16681
  },
@@ -16232,6 +16739,7 @@
16232
16739
  "right-click"
16233
16740
  ],
16234
16741
  "name": "UIMenu",
16742
+ "parts": {},
16235
16743
  "related": [
16236
16744
  "MenuItem",
16237
16745
  "MenuDivider",
@@ -16341,6 +16849,7 @@
16341
16849
  "menu-rule"
16342
16850
  ],
16343
16851
  "name": "UIMenuDivider",
16852
+ "parts": {},
16344
16853
  "related": [
16345
16854
  "Menu",
16346
16855
  "MenuItem",
@@ -16430,11 +16939,13 @@
16430
16939
  "dropdown-item"
16431
16940
  ],
16432
16941
  "name": "UIMenuItem",
16942
+ "parts": {},
16433
16943
  "related": [
16434
16944
  "Menu",
16435
16945
  "MenuDivider",
16436
16946
  "Button",
16437
- "NavItem"
16947
+ "NavItem",
16948
+ "ActionItem"
16438
16949
  ],
16439
16950
  "slots": {
16440
16951
  "icon": {
@@ -16504,6 +17015,7 @@
16504
17015
  "menu-heading"
16505
17016
  ],
16506
17017
  "name": "UIMenuLabel",
17018
+ "parts": {},
16507
17019
  "related": [
16508
17020
  "Menu",
16509
17021
  "MenuItem",
@@ -16595,6 +17107,7 @@
16595
17107
  "modal"
16596
17108
  ],
16597
17109
  "name": "UIModal",
17110
+ "parts": {},
16598
17111
  "related": [
16599
17112
  "Drawer",
16600
17113
  "Card",
@@ -16756,6 +17269,7 @@
16756
17269
  "links"
16757
17270
  ],
16758
17271
  "name": "UINav",
17272
+ "parts": {},
16759
17273
  "related": [
16760
17274
  "NavGroup",
16761
17275
  "NavItem",
@@ -16886,6 +17400,7 @@
16886
17400
  "menu"
16887
17401
  ],
16888
17402
  "name": "UINavGroup",
17403
+ "parts": {},
16889
17404
  "related": [
16890
17405
  "Nav",
16891
17406
  "NavItem",
@@ -17022,6 +17537,7 @@
17022
17537
  "sidebar"
17023
17538
  ],
17024
17539
  "name": "UINavItem",
17540
+ "parts": {},
17025
17541
  "related": [
17026
17542
  "Nav",
17027
17543
  "NavGroup",
@@ -17220,6 +17736,7 @@
17220
17736
  "noodles"
17221
17737
  ],
17222
17738
  "name": "UINoodles",
17739
+ "parts": {},
17223
17740
  "related": [
17224
17741
  "Canvas",
17225
17742
  "EditorCanvas"
@@ -17393,6 +17910,7 @@
17393
17910
  "notification-settings"
17394
17911
  ],
17395
17912
  "name": "UINotificationPreferences",
17913
+ "parts": {},
17396
17914
  "related": [
17397
17915
  "Check",
17398
17916
  "Switch",
@@ -17644,6 +18162,7 @@
17644
18162
  "intl"
17645
18163
  ],
17646
18164
  "name": "UINumberFormat",
18165
+ "parts": {},
17647
18166
  "related": [
17648
18167
  "stat",
17649
18168
  "text",
@@ -17826,6 +18345,7 @@
17826
18345
  "getting started"
17827
18346
  ],
17828
18347
  "name": "UIOnboardingChecklist",
18348
+ "parts": {},
17829
18349
  "related": [
17830
18350
  "Check",
17831
18351
  "List",
@@ -17860,7 +18380,7 @@
17860
18380
  },
17861
18381
  {
17862
18382
  "description": "All items done. Behavior depends on dismiss-on-complete.",
17863
- "attribute": "data-complete",
18383
+ "attribute": "complete",
17864
18384
  "name": "complete"
17865
18385
  },
17866
18386
  {
@@ -18041,6 +18561,7 @@
18041
18561
  "registration"
18042
18562
  ],
18043
18563
  "name": "UIOptionCard",
18564
+ "parts": {},
18044
18565
  "related": [
18045
18566
  "radio",
18046
18567
  "card",
@@ -18300,12 +18821,13 @@
18300
18821
  "input"
18301
18822
  ],
18302
18823
  "name": "UIOtpInput",
18824
+ "parts": {},
18303
18825
  "related": [
18304
18826
  "button"
18305
18827
  ],
18306
18828
  "slots": {
18307
- "field": {
18308
- "description": "Container for the digit input boxes and optional separator"
18829
+ "digit": {
18830
+ "description": "Each digit input box, one per [length] — the component's own real slot=\"digit\" attribute (gh#1461; renamed from the yaml's prior `field` key, which matched no DOM element otp-input-ui stamps). Rebuilt wholesale on every #stamp() (innerHTML wipe + recreate), so this is template-owned in current behavior, not an author-content insertion point; left under slots: here since reclassifying slots:/parts: is gh#1454's charter, not this ticket's."
18309
18831
  }
18310
18832
  },
18311
18833
  "states": [
@@ -18362,6 +18884,18 @@
18362
18884
  "padding": {
18363
18885
  "description": "Page-padding scale from the spacing system. Accepts `0`–`8`\n(mapped to `--a-space-N`). Empty (no value) applies the\n`--page-padding` token; `0` removes padding.\n",
18364
18886
  "type": "string",
18887
+ "enum": [
18888
+ "",
18889
+ "0",
18890
+ "1",
18891
+ "2",
18892
+ "3",
18893
+ "4",
18894
+ "5",
18895
+ "6",
18896
+ "7",
18897
+ "8"
18898
+ ],
18365
18899
  "default": ""
18366
18900
  },
18367
18901
  "scroll": {
@@ -18408,6 +18942,7 @@
18408
18942
  "dashboard-page"
18409
18943
  ],
18410
18944
  "name": "UIPage",
18945
+ "parts": {},
18411
18946
  "related": [
18412
18947
  "app-shell",
18413
18948
  "card",
@@ -18549,6 +19084,7 @@
18549
19084
  "paging"
18550
19085
  ],
18551
19086
  "name": "UIPagination",
19087
+ "parts": {},
18552
19088
  "related": [
18553
19089
  "input",
18554
19090
  "table"
@@ -18669,6 +19205,7 @@
18669
19205
  "pane"
18670
19206
  ],
18671
19207
  "name": "UIPane",
19208
+ "parts": {},
18672
19209
  "related": [
18673
19210
  "text-area"
18674
19211
  ],
@@ -18684,6 +19221,11 @@
18684
19221
  {
18685
19222
  "description": "Default, ready for interaction.",
18686
19223
  "name": "idle"
19224
+ },
19225
+ {
19226
+ "description": "The resize handle is mid-drag (pointer down through pointerup/pointercancel).",
19227
+ "attribute": "resizing",
19228
+ "name": "resizing"
18687
19229
  }
18688
19230
  ],
18689
19231
  "status": "stable",
@@ -18776,6 +19318,7 @@
18776
19318
  "security"
18777
19319
  ],
18778
19320
  "name": "UIPasswordStrength",
19321
+ "parts": {},
18779
19322
  "related": [
18780
19323
  "input",
18781
19324
  "field",
@@ -19050,6 +19593,7 @@
19050
19593
  "add-card"
19051
19594
  ],
19052
19595
  "name": "UIPaymentMethodForm",
19596
+ "parts": {},
19053
19597
  "related": [
19054
19598
  "Form",
19055
19599
  "Field",
@@ -19243,6 +19787,9 @@
19243
19787
  "category": "input",
19244
19788
  "composes": [
19245
19789
  "card-ui",
19790
+ "col-ui",
19791
+ "row-ui",
19792
+ "divider-ui",
19246
19793
  "button-ui",
19247
19794
  "icon-ui",
19248
19795
  "tag-ui",
@@ -19324,6 +19871,7 @@
19324
19871
  "method-list"
19325
19872
  ],
19326
19873
  "name": "PaymentMethodList",
19874
+ "parts": {},
19327
19875
  "related": [
19328
19876
  "PlanPicker",
19329
19877
  "Card",
@@ -19520,6 +20068,7 @@
19520
20068
  "status"
19521
20069
  ],
19522
20070
  "name": "UIPipelineStatus",
20071
+ "parts": {},
19523
20072
  "related": [
19524
20073
  "AgentTrace",
19525
20074
  "Stepper",
@@ -19650,6 +20199,11 @@
19650
20199
  "option-card-ui",
19651
20200
  "segmented-ui",
19652
20201
  "segment-ui",
20202
+ "field-ui",
20203
+ "grid-ui",
20204
+ "col-ui",
20205
+ "row-ui",
20206
+ "divider-ui",
19653
20207
  "button-ui",
19654
20208
  "icon-ui",
19655
20209
  "text-ui",
@@ -19751,6 +20305,7 @@
19751
20305
  "plan-selection"
19752
20306
  ],
19753
20307
  "name": "PlanPicker",
20308
+ "parts": {},
19754
20309
  "related": [
19755
20310
  "OptionCard",
19756
20311
  "Segmented",
@@ -19913,16 +20468,16 @@
19913
20468
  "component": {
19914
20469
  "const": "Popover"
19915
20470
  },
19916
- "gap": {
19917
- "description": "Pixel offset between the anchor and the popover",
19918
- "type": "number",
19919
- "default": 4
19920
- },
19921
20471
  "match-width": {
19922
20472
  "description": "Size the content panel to the trigger's width instead of max-content. Opt-in — the default (unset) keeps every existing consumer's content-sized panel unchanged.",
19923
20473
  "type": "boolean",
19924
20474
  "default": false
19925
20475
  },
20476
+ "offset": {
20477
+ "description": "Pixel offset between the anchor and the popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053).",
20478
+ "type": "number",
20479
+ "default": 4
20480
+ },
19926
20481
  "open": {
19927
20482
  "description": "Controls visibility via showPopover()/hidePopover()",
19928
20483
  "type": "boolean",
@@ -19989,13 +20544,14 @@
19989
20544
  "right-click"
19990
20545
  ],
19991
20546
  "name": "UIPopover",
20547
+ "parts": {},
19992
20548
  "related": [
19993
20549
  "button",
19994
20550
  "divider"
19995
20551
  ],
19996
20552
  "slots": {
19997
20553
  "content": {
19998
- "description": "Popover body — any interactive content. Hoisted to the top-layer via :popover-open when shown. Positioned via the Popover API + CSS Anchor Positioning per [placement] / [gap]; no manual positioning required."
20554
+ "description": "Popover body — any interactive content. Hoisted to the top-layer via :popover-open when shown. Positioned via the Popover API + CSS Anchor Positioning per [placement] / [offset]; no manual positioning required."
19999
20555
  },
20000
20556
  "trigger": {
20001
20557
  "description": "Focusable element that opens the popover when activated. Typically <button-ui>, but any focusable element works (button, a link with href). MUST be focusable for keyboard accessibility — bare <span> or <div> children will not respond to keyboard activation. Positioned at the anchor point per [placement]."
@@ -20137,6 +20693,7 @@
20137
20693
  "codepen"
20138
20694
  ],
20139
20695
  "name": "UIPreview",
20696
+ "parts": {},
20140
20697
  "related": [
20141
20698
  "Code",
20142
20699
  "Card"
@@ -20169,7 +20726,7 @@
20169
20726
  },
20170
20727
  "Progress": {
20171
20728
  "title": "Progress",
20172
- "description": "Progress indicator with bar (default) or spinner variant. Value < 0 marks indeterminate state showing animated activity instead of a fill. Use inside <progress-row-ui> for labeled task lists or standalone for global loading indicators; for percent-complete inline displays use <stat-ui> instead.",
20729
+ "description": "Linear progress bar indicator. Value < 0 marks indeterminate state showing animated activity instead of a fill. Bar-only for circular loading indicators use <spinner-ui> instead (the former `variant=\"spinner\"` render mode was retired; spinner-ui owns circular). Set `label` for a labeled task-list row (label + bar + optional `meta` text in one row, e.g. storage quotas, capacity breakdowns) — absorbed <progress-row-ui>'s row layout directly; that component is now a deprecated alias. Omit `label` for a standalone bar (global loading indicators); for percent-complete inline displays use <stat-ui> instead.",
20173
20730
  "type": "object",
20174
20731
  "allOf": [
20175
20732
  {
@@ -20183,19 +20740,23 @@
20183
20740
  "component": {
20184
20741
  "const": "Progress"
20185
20742
  },
20186
- "value": {
20187
- "description": "Current progress. 0..max (or 0..1 when max omitted). null = indeterminate (legacy -1 accepted for back-compat).",
20188
- "type": "number",
20189
- "default": null
20743
+ "label": {
20744
+ "description": "Left-hand label text. Presence (non-empty) switches to the labeled row layout — label + bar + optional `meta` in one row; absent = plain bar. Sanctioned Mode Attribute (component-token-contract.md).",
20745
+ "type": "string",
20746
+ "default": ""
20190
20747
  },
20191
- "variant": {
20192
- "description": "Render mode `bar` (default) or `spinner`. For fill color set the `--progress-fill` token (defaults to `--md-sys-color-primary`); there is no variant-as-color (use the token).",
20748
+ "meta": {
20749
+ "description": "Right-hand meta text shown in row layout (e.g. '32 GB', '4.2k / 10k'). No visible effect without `label`.",
20193
20750
  "type": "string",
20194
- "enum": [
20195
- "bar",
20196
- "spinner"
20751
+ "default": ""
20752
+ },
20753
+ "value": {
20754
+ "description": "Current progress, 0-100 (clamped). null = indeterminate (legacy -1 accepted for back-compat).",
20755
+ "type": [
20756
+ "number",
20757
+ "null"
20197
20758
  ],
20198
- "default": "bar"
20759
+ "default": null
20199
20760
  }
20200
20761
  },
20201
20762
  "required": [
@@ -20203,19 +20764,30 @@
20203
20764
  ],
20204
20765
  "unevaluatedProperties": false,
20205
20766
  "x-adiaui": {
20206
- "anti_patterns": [],
20207
- "category": "display",
20767
+ "anti_patterns": [
20768
+ {
20769
+ "fix": "{\"component\": \"Spinner\"}\n",
20770
+ "why": "Progress no longer has a `variant` prop — the spinner render mode\nwas retired. Progress is bar-only now.\n",
20771
+ "wrong": "{\"component\": \"Progress\", \"variant\": \"spinner\"}\n"
20772
+ },
20773
+ {
20774
+ "fix": "{\"component\": \"Progress\", \"label\": \"CPU\", \"value\": 92}\n",
20775
+ "why": "ProgressRow is deprecated — its label+row layout was\nabsorbed into Progress directly.\n",
20776
+ "wrong": "{\"component\": \"ProgressRow\", \"label\": \"CPU\", \"value\": 92}\n"
20777
+ }
20778
+ ],
20779
+ "category": "feedback",
20208
20780
  "composes": [],
20209
20781
  "events": {},
20210
20782
  "examples": [
20211
20783
  {
20212
20784
  "description": "Two-column dashboard with quick actions (buttons) and system status (progress bars).",
20213
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Grid\",\n \"children\": [\n \"c1\",\n \"c2\"\n ],\n \"columns\": \"2\"\n },\n {\n \"id\": \"c1\",\n \"component\": \"Card\",\n \"children\": [\n \"c1h\",\n \"c1s\"\n ]\n },\n {\n \"id\": \"c1h\",\n \"component\": \"Header\",\n \"children\": [\n \"c1t\"\n ]\n },\n {\n \"id\": \"c1t\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"Quick Actions\",\n \"variant\": \"section\"\n },\n {\n \"id\": \"c1s\",\n \"component\": \"Section\",\n \"children\": [\n \"c1col\"\n ]\n },\n {\n \"id\": \"c1col\",\n \"component\": \"Column\",\n \"children\": [\n \"b1\",\n \"b2\",\n \"b3\"\n ]\n },\n {\n \"id\": \"b1\",\n \"component\": \"Button\",\n \"text\": \"New Project\",\n \"variant\": \"solid\",\n \"iconLeading\": \"plus\"\n },\n {\n \"id\": \"b2\",\n \"component\": \"Button\",\n \"text\": \"Invite Member\",\n \"variant\": \"outline\",\n \"iconLeading\": \"users\"\n },\n {\n \"id\": \"b3\",\n \"component\": \"Button\",\n \"text\": \"View Reports\",\n \"variant\": \"ghost\",\n \"iconLeading\": \"chart\"\n },\n {\n \"id\": \"c2\",\n \"component\": \"Card\",\n \"children\": [\n \"c2h\",\n \"c2s\"\n ]\n },\n {\n \"id\": \"c2h\",\n \"component\": \"Header\",\n \"children\": [\n \"c2t\"\n ]\n },\n {\n \"id\": \"c2t\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"System Status\",\n \"variant\": \"section\"\n },\n {\n \"id\": \"c2s\",\n \"component\": \"Section\",\n \"children\": [\n \"c2col\"\n ]\n },\n {\n \"id\": \"c2col\",\n \"component\": \"Column\",\n \"children\": [\n \"p1\",\n \"p2\",\n \"p3\"\n ]\n },\n {\n \"id\": \"p1\",\n \"component\": \"Progress\",\n \"value\": \"92\",\n \"label\": \"CPU\"\n },\n {\n \"id\": \"p2\",\n \"component\": \"Progress\",\n \"value\": \"67\",\n \"label\": \"Memory\"\n },\n {\n \"id\": \"p3\",\n \"component\": \"Progress\",\n \"value\": \"34\",\n \"label\": \"Disk\"\n }\n]",
20785
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Grid\",\n \"children\": [\n \"c1\",\n \"c2\"\n ],\n \"columns\": \"2\"\n },\n {\n \"id\": \"c1\",\n \"component\": \"Card\",\n \"children\": [\n \"c1h\",\n \"c1s\"\n ]\n },\n {\n \"id\": \"c1h\",\n \"component\": \"Header\",\n \"children\": [\n \"c1t\"\n ]\n },\n {\n \"id\": \"c1t\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"Quick Actions\",\n \"variant\": \"section\"\n },\n {\n \"id\": \"c1s\",\n \"component\": \"Section\",\n \"children\": [\n \"c1col\"\n ]\n },\n {\n \"id\": \"c1col\",\n \"component\": \"Column\",\n \"children\": [\n \"b1\",\n \"b2\",\n \"b3\"\n ]\n },\n {\n \"id\": \"b1\",\n \"component\": \"Button\",\n \"text\": \"New Project\",\n \"variant\": \"solid\",\n \"icon\": \"plus\"\n },\n {\n \"id\": \"b2\",\n \"component\": \"Button\",\n \"text\": \"Invite Member\",\n \"variant\": \"outline\",\n \"icon\": \"users\"\n },\n {\n \"id\": \"b3\",\n \"component\": \"Button\",\n \"text\": \"View Reports\",\n \"variant\": \"ghost\",\n \"icon\": \"chart\"\n },\n {\n \"id\": \"c2\",\n \"component\": \"Card\",\n \"children\": [\n \"c2h\",\n \"c2s\"\n ]\n },\n {\n \"id\": \"c2h\",\n \"component\": \"Header\",\n \"children\": [\n \"c2t\"\n ]\n },\n {\n \"id\": \"c2t\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"System Status\",\n \"variant\": \"section\"\n },\n {\n \"id\": \"c2s\",\n \"component\": \"Section\",\n \"children\": [\n \"c2col\"\n ]\n },\n {\n \"id\": \"c2col\",\n \"component\": \"Column\",\n \"children\": [\n \"p1\",\n \"p2\",\n \"p3\"\n ]\n },\n {\n \"id\": \"p1\",\n \"component\": \"Progress\",\n \"value\": 92,\n \"label\": \"CPU\"\n },\n {\n \"id\": \"p2\",\n \"component\": \"Progress\",\n \"value\": 67,\n \"label\": \"Memory\"\n },\n {\n \"id\": \"p3\",\n \"component\": \"Progress\",\n \"value\": 34,\n \"label\": \"Disk\"\n }\n]",
20214
20786
  "name": "dashboard"
20215
20787
  },
20216
20788
  {
20217
20789
  "description": "User onboarding checklist with progress and checkbox items.",
20218
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"hdr\",\n \"sec\"\n ]\n },\n {\n \"id\": \"hdr\",\n \"component\": \"Header\",\n \"children\": [\n \"title\"\n ]\n },\n {\n \"id\": \"title\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"Getting Started\"\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"col\"\n ]\n },\n {\n \"id\": \"col\",\n \"component\": \"Column\",\n \"children\": [\n \"prog\",\n \"c1\",\n \"c2\",\n \"c3\"\n ],\n \"gap\": \"3\"\n },\n {\n \"id\": \"prog\",\n \"component\": \"Progress\",\n \"value\": 33,\n \"max\": 100\n },\n {\n \"id\": \"c1\",\n \"component\": \"CheckBox\",\n \"label\": \"Complete your profile\",\n \"checked\": true\n },\n {\n \"id\": \"c2\",\n \"component\": \"CheckBox\",\n \"label\": \"Invite team members\"\n },\n {\n \"id\": \"c3\",\n \"component\": \"CheckBox\",\n \"label\": \"Create your first project\"\n }\n]",
20790
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"hdr\",\n \"sec\"\n ]\n },\n {\n \"id\": \"hdr\",\n \"component\": \"Header\",\n \"children\": [\n \"title\"\n ]\n },\n {\n \"id\": \"title\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"Getting Started\"\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"col\"\n ]\n },\n {\n \"id\": \"col\",\n \"component\": \"Column\",\n \"children\": [\n \"prog\",\n \"c1\",\n \"c2\",\n \"c3\"\n ],\n \"gap\": \"3\"\n },\n {\n \"id\": \"prog\",\n \"component\": \"Progress\",\n \"value\": 33\n },\n {\n \"id\": \"c1\",\n \"component\": \"CheckBox\",\n \"label\": \"Complete your profile\",\n \"checked\": true\n },\n {\n \"id\": \"c2\",\n \"component\": \"CheckBox\",\n \"label\": \"Invite team members\"\n },\n {\n \"id\": \"c3\",\n \"component\": \"CheckBox\",\n \"label\": \"Create your first project\"\n }\n]",
20219
20791
  "name": "onboarding-checklist"
20220
20792
  }
20221
20793
  ],
@@ -20236,20 +20808,28 @@
20236
20808
  "gamification"
20237
20809
  ],
20238
20810
  "name": "UIProgress",
20239
- "related": [
20240
- "grid",
20241
- "button",
20242
- "check-box",
20243
- "upload"
20244
- ],
20245
- "slots": {
20811
+ "parts": {
20246
20812
  "fill": {
20247
- "description": "Bar fill element inside track"
20813
+ "description": "Bar fill element inside track — template-owned anatomy part, not a light-DOM insertion point (gh#1447)"
20814
+ },
20815
+ "label": {
20816
+ "description": "Label region — row-layout left-hand text (active when `label` is set)."
20817
+ },
20818
+ "meta": {
20819
+ "description": "Meta region — row-layout right-hand text (active when `label` is set)."
20248
20820
  },
20249
20821
  "track": {
20250
- "description": "Bar track container"
20822
+ "description": "Bar track container — template-owned anatomy part, not a light-DOM insertion point (gh#1447)"
20251
20823
  }
20252
20824
  },
20825
+ "related": [
20826
+ "grid",
20827
+ "button",
20828
+ "check-box",
20829
+ "upload",
20830
+ "spinner"
20831
+ ],
20832
+ "slots": {},
20253
20833
  "states": [
20254
20834
  {
20255
20835
  "description": "Default, ready for interaction.",
@@ -20356,7 +20936,7 @@
20356
20936
  },
20357
20937
  "ProgressRow": {
20358
20938
  "title": "ProgressRow",
20359
- "description": "Inline labeled progress row with label, progress bar, and meta text. Used for storage quotas, capacity breakdowns, usage indicators.",
20939
+ "description": "DEPRECATED (gh#1363 C4) — absorbed into <progress-ui>: set `label` (and optional `meta`) directly on <progress-ui> instead, which activates the identical row layout in place. progress-row-ui keeps working (still composes <progress-ui> internally, unchanged behavior) for existing back-compat markup, but is no longer taught or generated for new work. Was: inline labeled progress row with label, progress bar, and meta text storage quotas, capacity breakdowns, usage indicators.",
20360
20940
  "type": "object",
20361
20941
  "allOf": [
20362
20942
  {
@@ -20382,7 +20962,10 @@
20382
20962
  },
20383
20963
  "value": {
20384
20964
  "description": "Progress value 0-100 (null = indeterminate; legacy -1 accepted for back-compat)",
20385
- "type": "number",
20965
+ "type": [
20966
+ "number",
20967
+ "null"
20968
+ ],
20386
20969
  "default": null
20387
20970
  },
20388
20971
  "variant": {
@@ -20402,19 +20985,19 @@
20402
20985
  ],
20403
20986
  "unevaluatedProperties": false,
20404
20987
  "x-adiaui": {
20405
- "anti_patterns": [],
20406
- "category": "data",
20988
+ "anti_patterns": [
20989
+ {
20990
+ "fix": "{\"component\": \"Progress\", \"label\": \"CPU\", \"value\": 92}\n",
20991
+ "why": "ProgressRow is deprecated — its row layout was absorbed\ninto Progress directly.\n",
20992
+ "wrong": "{\"component\": \"ProgressRow\", \"label\": \"CPU\", \"value\": 92}\n"
20993
+ }
20994
+ ],
20995
+ "category": "feedback",
20407
20996
  "composes": [
20408
20997
  "progress-ui"
20409
20998
  ],
20410
20999
  "events": {},
20411
- "examples": [
20412
- {
20413
- "description": "Basic ProgressRow usage",
20414
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"id\": \"comp\",\n \"component\": \"ProgressRow\",\n \"label\": \"Example ProgressRow\"\n }\n]",
20415
- "name": "basic-progress-row"
20416
- }
20417
- ],
21000
+ "examples": [],
20418
21001
  "keywords": [
20419
21002
  "progressrow",
20420
21003
  "progress-row",
@@ -20422,6 +21005,7 @@
20422
21005
  "row"
20423
21006
  ],
20424
21007
  "name": "UIProgressRow",
21008
+ "parts": {},
20425
21009
  "related": [
20426
21010
  "Progress",
20427
21011
  "StepProgress",
@@ -20441,7 +21025,7 @@
20441
21025
  "name": "idle"
20442
21026
  }
20443
21027
  ],
20444
- "status": "stable",
21028
+ "status": "deprecated",
20445
21029
  "synonyms": {
20446
21030
  "progress-row": [
20447
21031
  "task-row",
@@ -20457,7 +21041,7 @@
20457
21041
  },
20458
21042
  "QRCode": {
20459
21043
  "title": "QRCode",
20460
- "description": "Inline QR code generator — renders a scannable code as inline SVG.\nTwo modes:\n\n**A. Auto-encode (default).** Set `[value]` to a string (URL, plain\ntext, share link, 2FA secret). The component encodes the data with\nthe built-in zero-deps QR encoder (byte mode, ECC level configurable,\nversions 1–10 up to ~150 byte chars) and renders an SVG.\n\n**B. Bring-your-own matrix.** Set `[matrix]` to a JSON string of a\n2-D 0/1 array (`[[1,0,1,...],[...],...]`). The component renders the\nsupplied matrix directly without invoking its own encoder. Use this\nwhen you need versions 11–40, kanji/alphanumeric mode, or any\nencoder feature beyond the built-in. When both `[value]` and\n`[matrix]` are set, the matrix wins (BYO override).\n\nOutput is a single `<svg>` with `viewBox=\"0 0 N N\"`. Crisp-edges\nrendering preserves the scannable cell boundaries at any size.\nSizing is controlled by the `[size]` prop (host CSS-pixel dimension);\ninternal cell size is computed from `size / (matrix-size + 2 ·\nmargin)`. ARIA: `role=\"img\"` with `aria-label` (default \"QR code\"\nor the `[label]` prop).\n",
21044
+ "description": "Inline QR code generator — renders a scannable code as inline SVG.\nTwo modes:\n\n**A. Auto-encode (default).** Set `[value]` to a string (URL, plain\ntext, share link, 2FA secret). The component encodes the data with\nthe built-in zero-deps QR encoder (byte mode, ECC level configurable,\nversions 1–10 up to ~150 byte chars) and renders an SVG.\n\n**B. Bring-your-own matrix.** Set `[matrix]` to a JSON string of a\n2-D 0/1 array (`[[1,0,1,...],[...],...]`). The component renders the\nsupplied matrix directly without invoking its own encoder. Use this\nwhen you need versions 11–40, kanji/alphanumeric mode, or any\nencoder feature beyond the built-in. When both `[value]` and\n`[matrix]` are set, the matrix wins (BYO override).\n\nOutput is a single `<svg>` with `viewBox=\"0 0 N N\"`. Crisp-edges\nrendering preserves the scannable cell boundaries at any size.\nSizing is controlled by the `[size]` prop (host CSS-pixel dimension);\ninternal cell size is computed from `size / (matrix-size + 2 ·\nquiet-zone)`. ARIA: `role=\"img\"` with `aria-label` (default \"QR code\"\nor the `[label]` prop).\n",
20461
21045
  "type": "object",
20462
21046
  "allOf": [
20463
21047
  {
@@ -20497,18 +21081,18 @@
20497
21081
  "type": "string",
20498
21082
  "default": "QR code"
20499
21083
  },
20500
- "margin": {
20501
- "description": "Quiet zone in cells around the QR pattern. QR spec requires a\nminimum 4-cell margin for reliable scanning; smaller values may\nnot scan on some devices. Default `4`.\n",
20502
- "type": "number",
20503
- "default": 4
20504
- },
20505
21084
  "matrix": {
20506
21085
  "description": "BYO precomputed bit matrix as JSON — a 2-D array of 0/1\n(`[[1,0,...],[0,1,...],...]`). When set, the built-in encoder is\nbypassed and this matrix renders directly. Useful for QR variants\nthe built-in doesn't support (versions 11–40, alphanumeric mode,\nkanji, etc.) — bring your own encoder, pass the matrix here.\n",
20507
21086
  "type": "string",
20508
21087
  "default": ""
20509
21088
  },
21089
+ "quietZone": {
21090
+ "description": "Quiet zone in cells around the QR pattern. QR spec requires a\nminimum 4-cell quiet zone for reliable scanning; smaller values\nmay not scan on some devices. Default `4`. (Renamed from\n`[margin]` — that name collided with the framework's global\n`[margin]` Scale attribute; `margin` on `qr-code-ui` now means\nthe global spacing attribute, per ADR-0053.)\n",
21091
+ "type": "number",
21092
+ "default": 4
21093
+ },
20510
21094
  "size": {
20511
- "description": "Host display size in CSS pixels (width and height; the SVG is\nalways square). Default 200. Internal cell size is computed from\nthis divided by `matrix-size + 2·margin`.\n",
21095
+ "description": "Host display size in CSS pixels (width and height; the SVG is\nalways square). Default 200. Internal cell size is computed from\nthis divided by `matrix-size + 2·quiet-zone`.\n",
20512
21096
  "type": "number",
20513
21097
  "default": 200
20514
21098
  },
@@ -20526,13 +21110,13 @@
20526
21110
  "anti_patterns": [
20527
21111
  {
20528
21112
  "fix": "Drop the ECC level (lower L gives more capacity for the same\nversion), OR shorten the URL (use a URL shortener), OR encode\nwith a BYO encoder library + pass the [matrix]:\n`<qr-code-ui matrix=\"[[1,0,1,...],...]\"></qr-code-ui>`\n",
20529
- "why": "Built-in encoder covers versions 1–10. Data beyond v10 capacity\nthrows + renders empty + sets [data-error]. Console warns with\nthe byte length so consumers can diagnose.\n",
21113
+ "why": "Built-in encoder covers versions 1–10. Data beyond v10 capacity\nis caught internally: the component renders empty and sets [error]\n(no exception reaches the consumer). Console warns with the value's\nUTF-16 code-unit length (String.length, not UTF-8 bytes) so\nconsumers can diagnose.\n",
20530
21114
  "wrong": "<qr-code-ui value=\"https://very.long.url.that.exceeds.150.bytes.of.utf8.encoded.length...\"></qr-code-ui>\n"
20531
21115
  },
20532
21116
  {
20533
- "fix": "<qr-code-ui value=\"...\" margin=\"4\"></qr-code-ui>\n",
20534
- "why": "Zero margin breaks scanning. QR spec requires a 4-cell quiet\nzone for reliable detection.\n",
20535
- "wrong": "<qr-code-ui value=\"...\" margin=\"0\"></qr-code-ui>\n"
21117
+ "fix": "<qr-code-ui value=\"...\" quiet-zone=\"4\"></qr-code-ui>\n",
21118
+ "why": "Zero quiet zone breaks scanning. QR spec requires a 4-cell quiet\nzone for reliable detection.\n",
21119
+ "wrong": "<qr-code-ui value=\"...\" quiet-zone=\"0\"></qr-code-ui>\n"
20536
21120
  }
20537
21121
  ],
20538
21122
  "category": "display",
@@ -20565,6 +21149,7 @@
20565
21149
  "share-link"
20566
21150
  ],
20567
21151
  "name": "UIQRCode",
21152
+ "parts": {},
20568
21153
  "related": [
20569
21154
  "link",
20570
21155
  "share"
@@ -20577,7 +21162,7 @@
20577
21162
  },
20578
21163
  {
20579
21164
  "description": "Auto-encode failed (data too long for v1–10 at requested ECC). Renders an empty placeholder; logs a console warning. Switch to a BYO matrix from an external encoder, or downgrade the ECC level.",
20580
- "attribute": "data-error",
21165
+ "attribute": "error",
20581
21166
  "name": "error"
20582
21167
  }
20583
21168
  ],
@@ -20708,18 +21293,19 @@
20708
21293
  "poll"
20709
21294
  ],
20710
21295
  "name": "UIRadio",
20711
- "related": [
20712
- "button",
20713
- "radio-group"
20714
- ],
20715
- "slots": {
21296
+ "parts": {
20716
21297
  "dot": {
20717
- "description": "Radio dot indicator, sized via --dot-size"
21298
+ "description": "Radio dot indicator, sized via --dot-size — template-owned anatomy part, not a light-DOM insertion point"
20718
21299
  },
20719
21300
  "label": {
20720
- "description": "Label text container, rendered via CSS attr(label) on ::after"
21301
+ "description": "Label text beside the dot — set via the `label` attribute (rendered by CSS `attr(label)` on `::after`); template-owned, not a light-DOM insertion point (gh#1435, gh#1447)"
20721
21302
  }
20722
21303
  },
21304
+ "related": [
21305
+ "button",
21306
+ "radio-group"
21307
+ ],
21308
+ "slots": {},
20723
21309
  "states": [
20724
21310
  {
20725
21311
  "description": "Default, ready for interaction.",
@@ -20907,6 +21493,11 @@
20907
21493
  "aria-labelledby"
20908
21494
  ],
20909
21495
  "name": "UIRadioGroup",
21496
+ "parts": {
21497
+ "label": {
21498
+ "description": "Auto-minted label element (mounted by radio-group-ui from the [label] prop) — do not author this slot directly; template-owned anatomy part, not a light-DOM insertion point (gh#1454). `#ensureLabelElement()` only recognizes its own `[data-radio-group-label]` marker, never a bare consumer-authored `[slot=\"label\"]` element."
21499
+ }
21500
+ },
20910
21501
  "related": [
20911
21502
  "radio",
20912
21503
  "field"
@@ -20914,9 +21505,6 @@
20914
21505
  "slots": {
20915
21506
  "default": {
20916
21507
  "description": "radio-ui children sharing one [name=] — exclusivity and arrow-key navigation are unchanged; they still resolve via closest('fieldset, [role=radiogroup]'), which now matches this host."
20917
- },
20918
- "label": {
20919
- "description": "Auto-minted label element (mounted by radio-group-ui from the [label] prop) — do not author this slot directly."
20920
21508
  }
20921
21509
  },
20922
21510
  "states": [
@@ -21055,6 +21643,7 @@
21055
21643
  "volume"
21056
21644
  ],
21057
21645
  "name": "UIRange",
21646
+ "parts": {},
21058
21647
  "related": [
21059
21648
  "input",
21060
21649
  "button"
@@ -21065,6 +21654,11 @@
21065
21654
  "description": "Default, ready for interaction.",
21066
21655
  "name": "idle"
21067
21656
  },
21657
+ {
21658
+ "description": "The field is mid-drag (pointer down through pointerup).",
21659
+ "attribute": "dragging",
21660
+ "name": "dragging"
21661
+ },
21068
21662
  {
21069
21663
  "description": "Non-interactive; dimmed.",
21070
21664
  "attribute": "disabled",
@@ -21204,6 +21798,7 @@
21204
21798
  "like"
21205
21799
  ],
21206
21800
  "name": "UIRating",
21801
+ "parts": {},
21207
21802
  "related": [
21208
21803
  "Field",
21209
21804
  "AgentFeedbackBar"
@@ -21318,6 +21913,7 @@
21318
21913
  "duration"
21319
21914
  ],
21320
21915
  "name": "UIRelativeTime",
21916
+ "parts": {},
21321
21917
  "related": [
21322
21918
  "text",
21323
21919
  "badge",
@@ -21386,7 +21982,7 @@
21386
21982
  "unevaluatedProperties": false,
21387
21983
  "x-adiaui": {
21388
21984
  "anti_patterns": [],
21389
- "category": "forms",
21985
+ "category": "display",
21390
21986
  "composes": [],
21391
21987
  "events": {},
21392
21988
  "examples": [
@@ -21415,6 +22011,7 @@
21415
22011
  "richtext"
21416
22012
  ],
21417
22013
  "name": "UIRichText",
22014
+ "parts": {},
21418
22015
  "related": [
21419
22016
  "Code",
21420
22017
  "Text",
@@ -21522,6 +22119,7 @@
21522
22119
  "row"
21523
22120
  ],
21524
22121
  "name": "UIRow",
22122
+ "parts": {},
21525
22123
  "related": [
21526
22124
  "avatar",
21527
22125
  "input",
@@ -21648,6 +22246,7 @@
21648
22246
  "combobox"
21649
22247
  ],
21650
22248
  "name": "UISearch",
22249
+ "parts": {},
21651
22250
  "related": [
21652
22251
  "Input",
21653
22252
  "Command",
@@ -21793,6 +22392,7 @@
21793
22392
  "section"
21794
22393
  ],
21795
22394
  "name": "UISection",
22395
+ "parts": {},
21796
22396
  "related": [
21797
22397
  "avatar",
21798
22398
  "input",
@@ -21827,7 +22427,7 @@
21827
22427
  },
21828
22428
  "Segment": {
21829
22429
  "title": "Segment",
21830
- "description": "Individual segment child of <segmented-ui> — carries the [value],\n[text], optional [icon], and [selected] state for one option in\na horizontal segmented selector. Distinct from <tab-ui> (a view\nswitcher's child) and <option> (native option for <select-ui>).\nUse segment-ui only as a direct child of <segmented-ui>; never\nstandalone.\n",
22430
+ "description": "Individual segment child of <segmented-ui> — carries the [value],\n[text], optional [icon], and [selected] state for one option in\na horizontal segmented selector, single- or multi-select\n(<segmented-ui multiple>, gh#1369). Distinct from <tab-ui> (a view\nswitcher's child) and <option> (native option for <select-ui>).\nUse segment-ui only as a direct child of <segmented-ui>; never\nstandalone.\n",
21831
22431
  "type": "object",
21832
22432
  "allOf": [
21833
22433
  {
@@ -21872,6 +22472,9 @@
21872
22472
  ],
21873
22473
  "unevaluatedProperties": false,
21874
22474
  "x-adiaui": {
22475
+ "allowedParents": [
22476
+ "Segmented"
22477
+ ],
21875
22478
  "anti_patterns": [],
21876
22479
  "category": "navigation",
21877
22480
  "composes": [
@@ -21881,36 +22484,39 @@
21881
22484
  "examples": [
21882
22485
  {
21883
22486
  "description": "Segmented control with 3 segment options for tab-like switching.",
21884
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"SegmentedControl\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"text\": \"Overview\",\n \"active\": true\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"text\": \"Features\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"text\": \"Pricing\"\n }\n]",
22487
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Segmented\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"text\": \"Overview\",\n \"selected\": true\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"text\": \"Features\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"text\": \"Pricing\"\n }\n]",
21885
22488
  "name": "segmented-control"
21886
22489
  },
21887
22490
  {
21888
22491
  "description": "Three segments inside a segmented control for view switching.",
21889
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"SegmentedControl\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"overview\",\n \"text\": \"Overview\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"features\",\n \"text\": \"Features\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"pricing\",\n \"text\": \"Pricing\"\n }\n]",
22492
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Segmented\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"overview\",\n \"text\": \"Overview\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"features\",\n \"text\": \"Features\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"pricing\",\n \"text\": \"Pricing\"\n }\n]",
21890
22493
  "name": "basic"
21891
22494
  },
21892
22495
  {
21893
22496
  "description": "Segmented control showing four time-range segments labeled via text attribute.",
21894
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"SegmentedControl\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\",\n \"s4\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"d\",\n \"text\": \"Daily\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"w\",\n \"text\": \"Weekly\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"m\",\n \"text\": \"Monthly\"\n },\n {\n \"id\": \"s4\",\n \"component\": \"Segment\",\n \"value\": \"y\",\n \"text\": \"Yearly\"\n }\n]",
22497
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Segmented\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\",\n \"s4\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"d\",\n \"text\": \"Daily\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"w\",\n \"text\": \"Weekly\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"m\",\n \"text\": \"Monthly\"\n },\n {\n \"id\": \"s4\",\n \"component\": \"Segment\",\n \"value\": \"y\",\n \"text\": \"Yearly\"\n }\n]",
21895
22498
  "name": "text"
21896
22499
  },
21897
22500
  {
21898
22501
  "description": "Segmented control with one disabled segment that cannot be selected.",
21899
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"SegmentedControl\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"free\",\n \"text\": \"Free\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"pro\",\n \"text\": \"Pro\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"enterprise\",\n \"text\": \"Enterprise\",\n \"disabled\": true\n }\n]",
22502
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Segmented\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"free\",\n \"text\": \"Free\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"pro\",\n \"text\": \"Pro\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"enterprise\",\n \"text\": \"Enterprise\",\n \"disabled\": true\n }\n]",
21900
22503
  "name": "disabled"
21901
22504
  },
21902
22505
  {
21903
22506
  "description": "Segmented control with icon+text segments for view-mode toggles (list, grid, board).",
21904
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"SegmentedControl\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"list\",\n \"text\": \"List\",\n \"icon\": \"list\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"grid\",\n \"text\": \"Grid\",\n \"icon\": \"squares-four\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"board\",\n \"text\": \"Board\",\n \"icon\": \"kanban\"\n }\n]",
22507
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Segmented\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"list\",\n \"text\": \"List\",\n \"icon\": \"list\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"grid\",\n \"text\": \"Grid\",\n \"icon\": \"squares-four\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"board\",\n \"text\": \"Board\",\n \"icon\": \"kanban\"\n }\n]",
21905
22508
  "name": "icons"
21906
22509
  }
21907
22510
  ],
21908
22511
  "keywords": [
21909
- "segment"
22512
+ "segment",
22513
+ "toggle-option"
21910
22514
  ],
21911
22515
  "name": "UISegment",
22516
+ "parts": {},
21912
22517
  "related": [
21913
- "segmented-control"
22518
+ "segmented-control",
22519
+ "ToggleOption"
21914
22520
  ],
21915
22521
  "slots": {},
21916
22522
  "states": [
@@ -21929,18 +22535,23 @@
21929
22535
  "segment": [
21930
22536
  "segment-button",
21931
22537
  "segmented-option",
21932
- "option-button"
22538
+ "option-button",
22539
+ "toggle-option"
21933
22540
  ]
21934
22541
  },
21935
22542
  "tag": "segment-ui",
21936
- "tokens": {},
22543
+ "tokens": {
22544
+ "--segment-bg-selected": {
22545
+ "description": "Background color of a selected segment under the parent's [multiple] mode (no sliding indicator in that mode)."
22546
+ }
22547
+ },
21937
22548
  "traits": [],
21938
22549
  "version": 1
21939
22550
  }
21940
22551
  },
21941
22552
  "Segmented": {
21942
22553
  "title": "Segmented",
21943
- "description": "Single-select toggle group with an animated sliding indicator. Children must be segment-ui elements.",
22554
+ "description": "Toggle group with an animated sliding indicator (single-select) or independently-toggleable segments (multi-select via [multiple]). Children must be segment-ui elements.",
21944
22555
  "type": "object",
21945
22556
  "allOf": [
21946
22557
  {
@@ -21952,15 +22563,20 @@
21952
22563
  ],
21953
22564
  "properties": {
21954
22565
  "allowEmpty": {
21955
- "description": "Suppresses the connect-time self-select of the first enabled segment when value is falsy. Without it, an empty value silently selects the first segment; with it, a falsy value renders every segment unselected until a real value arrives — for path-bound consumers whose bound value can be a genuine empty state.",
22566
+ "description": "Suppresses the connect-time self-select of the first enabled segment when value is falsy. Without it, an empty value silently selects the first segment; with it, a falsy value renders every segment unselected until a real value arrives — for path-bound consumers whose bound value can be a genuine empty state. No effect under [multiple] — multi-select never self-selects (empty value already means \"nothing chosen\").",
21956
22567
  "type": "boolean",
21957
22568
  "default": false
21958
22569
  },
21959
22570
  "component": {
21960
22571
  "const": "Segmented"
21961
22572
  },
22573
+ "multiple": {
22574
+ "description": "Enables multi-select — value becomes a comma-separated set, the sliding indicator is suppressed (each selected segment carries its own background instead), and Space/Enter toggles a focused segment instead of arrow-move selecting it. Positive polarity, matching select-ui[multiple]. Absorbs the role of the deprecated <toggle-group-ui> + <toggle-option-ui> pair (gh#1369, #1363 C1). Unlike <toggle-group-ui single>, re-clicking an already-selected segment does NOT clear the selection — segmented-ui's single-select is standard radiogroup semantics (always exactly one selected once a value is set).",
22575
+ "type": "boolean",
22576
+ "default": false
22577
+ },
21962
22578
  "value": {
21963
- "description": "Value of the currently selected segment.",
22579
+ "description": "Value of the currently selected segment. Under [multiple], a comma-separated set of selected values (same encoding as select-ui[multiple]).",
21964
22580
  "type": "string",
21965
22581
  "default": ""
21966
22582
  }
@@ -21970,6 +22586,9 @@
21970
22586
  ],
21971
22587
  "unevaluatedProperties": false,
21972
22588
  "x-adiaui": {
22589
+ "allowedChildren": [
22590
+ "Segment"
22591
+ ],
21973
22592
  "anti_patterns": [],
21974
22593
  "category": "navigation",
21975
22594
  "composes": [],
@@ -21983,6 +22602,11 @@
21983
22602
  "description": "Segmented control with three segment-ui children for view switching.",
21984
22603
  "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"id\": \"comp\",\n \"component\": \"Segmented\",\n \"value\": \"daily\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"daily\",\n \"text\": \"Daily\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"weekly\",\n \"text\": \"Weekly\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"monthly\",\n \"text\": \"Monthly\"\n }\n]",
21985
22604
  "name": "basic-segmented"
22605
+ },
22606
+ {
22607
+ "description": "Multi-select segmented control (gh#1369) for filter chips — [multiple] set, value is a comma-separated set of active segments.",
22608
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"id\": \"comp\",\n \"component\": \"Segmented\",\n \"multiple\": true,\n \"value\": \"bold,italic\",\n \"children\": [\n \"s1\",\n \"s2\",\n \"s3\"\n ]\n },\n {\n \"id\": \"s1\",\n \"component\": \"Segment\",\n \"value\": \"bold\",\n \"text\": \"Bold\"\n },\n {\n \"id\": \"s2\",\n \"component\": \"Segment\",\n \"value\": \"italic\",\n \"text\": \"Italic\"\n },\n {\n \"id\": \"s3\",\n \"component\": \"Segment\",\n \"value\": \"underline\",\n \"text\": \"Underline\"\n }\n]",
22609
+ "name": "multi-select-filter-chips"
21986
22610
  }
21987
22611
  ],
21988
22612
  "keywords": [
@@ -21993,21 +22617,27 @@
21993
22617
  "switch",
21994
22618
  "tab",
21995
22619
  "tabs",
21996
- "button-group"
22620
+ "button-group",
22621
+ "filter",
22622
+ "multi-select",
22623
+ "filter-chips"
21997
22624
  ],
21998
22625
  "name": "UISegmented",
22626
+ "parts": {
22627
+ "indicator": {
22628
+ "description": "Auto-created sliding indicator element prepended on first render — template-owned anatomy part, not a light-DOM insertion point (gh#1454). Lazily created once via an internal-field guard, never adopted from a consumer-authored element."
22629
+ }
22630
+ },
21999
22631
  "related": [
22000
22632
  "Segment",
22001
22633
  "ToggleGroup",
22634
+ "ToggleOption",
22002
22635
  "Tabs",
22003
22636
  "Radio"
22004
22637
  ],
22005
22638
  "slots": {
22006
22639
  "default": {
22007
22640
  "description": "Child segment-ui elements that form the toggle group. Children MUST be segment-ui — bare segment tags render text but are silently ignored for the sliding indicator and role/aria-checked state."
22008
- },
22009
- "indicator": {
22010
- "description": "Auto-created sliding indicator element prepended on first render."
22011
22641
  }
22012
22642
  },
22013
22643
  "states": [
@@ -22023,6 +22653,16 @@
22023
22653
  "button",
22024
22654
  "segmented"
22025
22655
  ],
22656
+ "filter": [
22657
+ "segmented",
22658
+ "toggle-group",
22659
+ "filter-chips"
22660
+ ],
22661
+ "multi-select": [
22662
+ "segmented",
22663
+ "toggle-group",
22664
+ "select"
22665
+ ],
22026
22666
  "options": [
22027
22667
  "settings",
22028
22668
  "radio",
@@ -22148,7 +22788,10 @@
22148
22788
  },
22149
22789
  "maxlength": {
22150
22790
  "description": "Maximum character length for validation",
22151
- "type": "number",
22791
+ "type": [
22792
+ "number",
22793
+ "null"
22794
+ ],
22152
22795
  "default": null
22153
22796
  },
22154
22797
  "min": {
@@ -22158,7 +22801,10 @@
22158
22801
  },
22159
22802
  "minlength": {
22160
22803
  "description": "Minimum character length for validation",
22161
- "type": "number",
22804
+ "type": [
22805
+ "number",
22806
+ "null"
22807
+ ],
22162
22808
  "default": null
22163
22809
  },
22164
22810
  "multiple": {
@@ -22223,7 +22869,7 @@
22223
22869
  "summary-label": {
22224
22870
  "description": "Multi-select only (gh#442). Replaces the chip trigger with one\ntext line: a single selection shows its own label; N > 1 shows\n\"<summary-label> (N)\" — e.g. \"Organizations (2)\"; none shows the\nplaceholder. Popover checkbox rows, Backspace-removes-last, the\ncomma-separated form value, [select-all], and [clearable] are\nunchanged. Absent (default) = tag-ui chip trigger. Prefer this\nform for narrow triggers (filter bars) where wrapping chips\nwould balloon the control.\n",
22225
22871
  "type": "string",
22226
- "default": null
22872
+ "default": ""
22227
22873
  },
22228
22874
  "value": {
22229
22875
  "description": "Currently selected option value. With declarative <option> children, a child carrying the native `selected` attribute sets the initial value when this attribute is absent (native <select> parity).",
@@ -22291,6 +22937,14 @@
22291
22937
  "picker"
22292
22938
  ],
22293
22939
  "name": "UISelect",
22940
+ "parts": {
22941
+ "hint": {
22942
+ "description": "Override slot for hint markup richer than the plain [hint] attribute string (inline links, code spans). Renders beneath the trigger at body-subtle typography. Mutually exclusive with [hint] per this description, but template-owned in practice (gh#1454): the trigger stamp is an unconditional `this.innerHTML = …` with no capture-before-wipe for `hint` (unlike `leading`/`trailing` on input-ui), so any pre-existing [slot=\"hint\"] content is discarded, not adopted, on first render."
22943
+ },
22944
+ "listbox": {
22945
+ "description": "Popover container for options (role=listbox) — template-owned anatomy part, not a light-DOM insertion point (gh#1454). Its contents are always wiped (`innerHTML = ''`) and rebuilt wholesale from `.options`/ parsed `<option>` children on every options render."
22946
+ }
22947
+ },
22294
22948
  "related": [
22295
22949
  "image",
22296
22950
  "button",
@@ -22299,17 +22953,8 @@
22299
22953
  "upload"
22300
22954
  ],
22301
22955
  "slots": {
22302
- "hint": {
22303
- "description": "Override slot for hint markup richer than the plain [hint] attribute string (inline links, code spans). Renders beneath the trigger at body-subtle typography. Mutually exclusive with [hint]."
22304
- },
22305
- "label": {
22306
- "description": "Label element above the trigger"
22307
- },
22308
- "listbox": {
22309
- "description": "Popover container for options (role=listbox)"
22310
- },
22311
22956
  "trigger": {
22312
- "description": "Button that opens the listbox"
22957
+ "description": "Button that opens the listbox. Stamped only if no consumer-authored [slot=\"trigger\"] is already present at first render (adopt-or-stamp) — a genuine light-DOM insertion point."
22313
22958
  }
22314
22959
  },
22315
22960
  "states": [
@@ -22388,6 +23033,9 @@
22388
23033
  ],
22389
23034
  "unevaluatedProperties": false,
22390
23035
  "x-adiaui": {
23036
+ "allowedParents": [
23037
+ "SimpleShell"
23038
+ ],
22391
23039
  "anti_patterns": [],
22392
23040
  "category": "shells",
22393
23041
  "composes": [],
@@ -22403,6 +23051,7 @@
22403
23051
  "marketing-body"
22404
23052
  ],
22405
23053
  "name": "SimpleContent",
23054
+ "parts": {},
22406
23055
  "related": [
22407
23056
  "SimpleShell",
22408
23057
  "SimpleHero"
@@ -22455,6 +23104,9 @@
22455
23104
  ],
22456
23105
  "unevaluatedProperties": false,
22457
23106
  "x-adiaui": {
23107
+ "allowedParents": [
23108
+ "SimpleShell"
23109
+ ],
22458
23110
  "anti_patterns": [],
22459
23111
  "category": "shells",
22460
23112
  "composes": [],
@@ -22470,6 +23122,7 @@
22470
23122
  "page-title"
22471
23123
  ],
22472
23124
  "name": "SimpleHero",
23125
+ "parts": {},
22473
23126
  "related": [
22474
23127
  "SimpleShell",
22475
23128
  "SimpleContent"
@@ -22541,6 +23194,9 @@
22541
23194
  ],
22542
23195
  "unevaluatedProperties": false,
22543
23196
  "x-adiaui": {
23197
+ "allowedParents": [
23198
+ "Surface"
23199
+ ],
22544
23200
  "anti_patterns": [],
22545
23201
  "category": "shells",
22546
23202
  "composes": [],
@@ -22556,6 +23212,7 @@
22556
23212
  "minimal-shell"
22557
23213
  ],
22558
23214
  "name": "SimpleShell",
23215
+ "parts": {},
22559
23216
  "related": [
22560
23217
  "SimpleHero",
22561
23218
  "SimpleContent",
@@ -22612,13 +23269,8 @@
22612
23269
  "component": {
22613
23270
  "const": "Skeleton"
22614
23271
  },
22615
- "height": {
22616
- "description": "Height of the placeholder.",
22617
- "type": "string",
22618
- "default": "1.2em"
22619
- },
22620
- "radius": {
22621
- "description": "Border radius",
23272
+ "cornerRadius": {
23273
+ "description": "Border radius. Renamed from `[radius]` (gh#1335) — a preset-enum can't share a name with the global Enum·preset `[radius]` attribute (`sharp`/`rounded`/`round`), whose vocabulary is unrelated (ADR-0053); mirrors chart-ui's own `[corner-radius]` fix (ADR-0054).",
22622
23274
  "type": "string",
22623
23275
  "enum": [
22624
23276
  "none",
@@ -22629,6 +23281,11 @@
22629
23281
  ],
22630
23282
  "default": "sm"
22631
23283
  },
23284
+ "height": {
23285
+ "description": "Height of the placeholder.",
23286
+ "type": "string",
23287
+ "default": "1.2em"
23288
+ },
22632
23289
  "static": {
22633
23290
  "description": "When true, suppress the shimmer animation.",
22634
23291
  "type": "boolean",
@@ -22664,6 +23321,7 @@
22664
23321
  "shimmer"
22665
23322
  ],
22666
23323
  "name": "UISkeleton",
23324
+ "parts": {},
22667
23325
  "related": [
22668
23326
  "EmptyState",
22669
23327
  "Card",
@@ -22768,6 +23426,7 @@
22768
23426
  "keyboard-navigation"
22769
23427
  ],
22770
23428
  "name": "UISkipNav",
23429
+ "parts": {},
22771
23430
  "related": [
22772
23431
  "visually-hidden"
22773
23432
  ],
@@ -22926,6 +23585,7 @@
22926
23585
  "volume"
22927
23586
  ],
22928
23587
  "name": "UISlider",
23588
+ "parts": {},
22929
23589
  "related": [
22930
23590
  "input",
22931
23591
  "select",
@@ -22951,6 +23611,11 @@
22951
23611
  "description": "Default, ready for interaction.",
22952
23612
  "name": "idle"
22953
23613
  },
23614
+ {
23615
+ "description": "A thumb is mid-drag (pointer down through pointerup).",
23616
+ "attribute": "dragging",
23617
+ "name": "dragging"
23618
+ },
22954
23619
  {
22955
23620
  "description": "Non-interactive; dimmed.",
22956
23621
  "attribute": "disabled",
@@ -23106,6 +23771,7 @@
23106
23771
  "circular"
23107
23772
  ],
23108
23773
  "name": "UISpinner",
23774
+ "parts": {},
23109
23775
  "related": [
23110
23776
  "Progress",
23111
23777
  "Skeleton",
@@ -23243,6 +23909,7 @@
23243
23909
  "stack"
23244
23910
  ],
23245
23911
  "name": "UIStack",
23912
+ "parts": {},
23246
23913
  "related": [
23247
23914
  "Col",
23248
23915
  "Row",
@@ -23373,6 +24040,7 @@
23373
24040
  "scoreboard"
23374
24041
  ],
23375
24042
  "name": "UIStat",
24043
+ "parts": {},
23376
24044
  "related": [
23377
24045
  "Card",
23378
24046
  "Badge",
@@ -23552,7 +24220,7 @@
23552
24220
  },
23553
24221
  "Stepper": {
23554
24222
  "title": "Stepper",
23555
- "description": "Wizard / process stepper — parent step index drives numbered children's complete/current/upcoming states automatically. Renders horizontally as a labeled step bar with connectors. Use for multi-step forms, onboarding, or pipelines; for read-only event history use <timeline-ui> instead. Add [interactive] to opt into click-to-navigate + roving- tabindex keyboard (arrow keys / Home / End) — the host still owns whether navigation is permitted: listen for the cancelable [step-request] event and call preventDefault() to veto a step before it lands, or set [disabled] on a stepper-item-ui to phase-gate it out of reach entirely.",
24223
+ "description": "Wizard / process stepper — parent step index drives numbered children's complete/current/upcoming states automatically. Renders horizontally as a labeled step bar with connectors. Use for multi-step forms, onboarding, or pipelines; for read-only event history use <timeline-ui> instead. Add [interactive] to opt into click-to-navigate + roving-tabindex keyboard (arrow keys / Home / End) — the host still owns whether navigation is permitted: listen for the cancelable [step-request] event and call preventDefault() to veto a step before it lands, or set [disabled] on a stepper-item-ui to phase-gate it out of reach entirely.",
23556
24224
  "type": "object",
23557
24225
  "allOf": [
23558
24226
  {
@@ -23587,6 +24255,9 @@
23587
24255
  ],
23588
24256
  "unevaluatedProperties": false,
23589
24257
  "x-adiaui": {
24258
+ "allowedChildren": [
24259
+ "StepperItem"
24260
+ ],
23590
24261
  "anti_patterns": [],
23591
24262
  "category": "navigation",
23592
24263
  "composes": [
@@ -23639,6 +24310,7 @@
23639
24310
  "click-to-navigate"
23640
24311
  ],
23641
24312
  "name": "UIStepper",
24313
+ "parts": {},
23642
24314
  "related": [
23643
24315
  "timeline-ui",
23644
24316
  "progress-ui"
@@ -23717,6 +24389,9 @@
23717
24389
  ],
23718
24390
  "unevaluatedProperties": false,
23719
24391
  "x-adiaui": {
24392
+ "allowedParents": [
24393
+ "Stepper"
24394
+ ],
23720
24395
  "anti_patterns": [],
23721
24396
  "category": "navigation",
23722
24397
  "composes": [],
@@ -23730,6 +24405,7 @@
23730
24405
  "step-row"
23731
24406
  ],
23732
24407
  "name": "UIStepperItem",
24408
+ "parts": {},
23733
24409
  "related": [
23734
24410
  "Stepper",
23735
24411
  "Timeline",
@@ -23737,13 +24413,13 @@
23737
24413
  ],
23738
24414
  "slots": {
23739
24415
  "description": {
23740
- "description": "Custom description content; falls through to `[description]` prop if not slotted."
24416
+ "description": "Custom secondary-line content; falls through to [description] prop if not slotted. Same adopt-or-stamp guard as `label` (gh#1462)."
23741
24417
  },
23742
24418
  "icon": {
23743
- "description": "Override the step-status glyph with a custom slotted element. By default the step renders a numeral / check / x indicator based on [status]; slot an `<icon-ui>` or image to customize."
24419
+ "description": "Override the step-status glyph with a custom slotted element (custom icon-ui, image). Mutually exclusive with the [icon] attribute a consumer-authored slot child wins and is never renamed or removed by render() (gh#1462 adopt-or-stamp guard)."
23744
24420
  },
23745
24421
  "label": {
23746
- "description": "Custom label content; falls through to `[text]` prop if not slotted."
24422
+ "description": "Custom label content; falls through to [text] prop if not slotted. Adopt-or-stamp guarded (gh#1462): render() only writes into the component-stamped fallback span — a consumer-authored `[slot=\"label\"]` child is adopted as source of truth and never overwritten."
23747
24423
  }
23748
24424
  },
23749
24425
  "states": [],
@@ -23830,6 +24506,7 @@
23830
24506
  "indicator"
23831
24507
  ],
23832
24508
  "name": "UIStepProgress",
24509
+ "parts": {},
23833
24510
  "related": [
23834
24511
  "progress-ui",
23835
24512
  "stepper-ui"
@@ -23941,6 +24618,7 @@
23941
24618
  "stream"
23942
24619
  ],
23943
24620
  "name": "UIStream",
24621
+ "parts": {},
23944
24622
  "related": [
23945
24623
  "ChatThreadUI",
23946
24624
  "Text",
@@ -24132,6 +24810,7 @@
24132
24810
  "token"
24133
24811
  ],
24134
24812
  "name": "UISwatch",
24813
+ "parts": {},
24135
24814
  "related": [
24136
24815
  "chart-legend-ui",
24137
24816
  "tag-ui"
@@ -24325,6 +25004,7 @@
24325
25004
  "swiper"
24326
25005
  ],
24327
25006
  "name": "UISwiper",
25007
+ "parts": {},
24328
25008
  "related": [
24329
25009
  "image-gallery",
24330
25010
  "hero-section",
@@ -24440,7 +25120,7 @@
24440
25120
  "wrong": "<field-ui inline label=\"Email notifications\">\n <switch-ui></switch-ui>\n</field-ui>\n"
24441
25121
  }
24442
25122
  ],
24443
- "category": "layout",
25123
+ "category": "input",
24444
25124
  "composes": [],
24445
25125
  "events": {
24446
25126
  "change": {
@@ -24458,25 +25138,26 @@
24458
25138
  "switch"
24459
25139
  ],
24460
25140
  "name": "UISwitch",
24461
- "related": [
24462
- "Check",
24463
- "Radio",
24464
- "Field"
24465
- ],
24466
- "slots": {
25141
+ "parts": {
24467
25142
  "hint": {
24468
- "description": "Help text below the label"
25143
+ "description": "Help text below the label — set via the `hint` attribute (template renders the span and wires aria-describedby); template-owned, not a light-DOM insertion point"
24469
25144
  },
24470
25145
  "label": {
24471
- "description": "Label text beside the toggle"
25146
+ "description": "Label text beside the toggle — set via the `label` attribute (template renders the span); template-owned, not a light-DOM insertion point (gh#1435, gh#1447)"
24472
25147
  },
24473
25148
  "thumb": {
24474
- "description": "Sliding thumb indicator inside track"
25149
+ "description": "Sliding thumb indicator inside track — template-owned anatomy part"
24475
25150
  },
24476
25151
  "track": {
24477
- "description": "Toggle track container (holds thumb)"
25152
+ "description": "Toggle track container (holds thumb) — template-owned anatomy part"
24478
25153
  }
24479
25154
  },
25155
+ "related": [
25156
+ "Check",
25157
+ "Radio",
25158
+ "Field"
25159
+ ],
25160
+ "slots": {},
24480
25161
  "states": [
24481
25162
  {
24482
25163
  "description": "Default, ready for interaction.",
@@ -24545,6 +25226,11 @@
24545
25226
  "description": "Optional leading icon name (Phosphor) for the tab button.",
24546
25227
  "type": "string"
24547
25228
  },
25229
+ "selected": {
25230
+ "description": "Whether this tab's panel is the active one. Managed by the parent <tabs-ui> container — don't set directly; the parent's [value] is the single source of truth (ADR-0056).",
25231
+ "type": "boolean",
25232
+ "default": false
25233
+ },
24548
25234
  "text": {
24549
25235
  "description": "Tab button label (rendered by parent <tabs-ui>).",
24550
25236
  "type": "string"
@@ -24559,6 +25245,9 @@
24559
25245
  ],
24560
25246
  "unevaluatedProperties": false,
24561
25247
  "x-adiaui": {
25248
+ "allowedParents": [
25249
+ "Tabs"
25250
+ ],
24562
25251
  "anti_patterns": [],
24563
25252
  "category": "navigation",
24564
25253
  "composes": [],
@@ -24571,6 +25260,7 @@
24571
25260
  "tabs-child"
24572
25261
  ],
24573
25262
  "name": "UITab",
25263
+ "parts": {},
24574
25264
  "related": [
24575
25265
  "Tabs",
24576
25266
  "Nav",
@@ -24615,16 +25305,6 @@
24615
25305
  "description": "JS property (set programmatically — `el.data = [...]`) — row records, an array of plain objects keyed to columns[].key. May also be supplied declaratively as a JSON-array `data=\"[…]\"` attribute, hydrated once at connect (gh#288) — the same pattern chart-ui's `data` attribute uses. Custom accessor on the element class, not a reflected attribute.",
24616
25306
  "$ref": "#/$defs/DynamicObjectList"
24617
25307
  },
24618
- "density": {
24619
- "description": "Controls cell padding and row height. 'compact' for dense data, 'standard' for default spacing, 'comfortable' for spacious rows.",
24620
- "type": "string",
24621
- "enum": [
24622
- "compact",
24623
- "standard",
24624
- "comfortable"
24625
- ],
24626
- "default": "standard"
24627
- },
24628
25308
  "expandable": {
24629
25309
  "description": "Enable row expansion",
24630
25310
  "type": "boolean",
@@ -24878,6 +25558,7 @@
24878
25558
  "manage"
24879
25559
  ],
24880
25560
  "name": "UITable",
25561
+ "parts": {},
24881
25562
  "related": [
24882
25563
  "button",
24883
25564
  "input",
@@ -25271,6 +25952,7 @@
25271
25952
  "heading-nav"
25272
25953
  ],
25273
25954
  "name": "UITableOfContents",
25955
+ "parts": {},
25274
25956
  "related": [
25275
25957
  "aside",
25276
25958
  "nav",
@@ -25468,6 +26150,7 @@
25468
26150
  "records"
25469
26151
  ],
25470
26152
  "name": "UITableToolbar",
26153
+ "parts": {},
25471
26154
  "related": [
25472
26155
  "table",
25473
26156
  "search",
@@ -25585,8 +26268,11 @@
25585
26268
  ],
25586
26269
  "unevaluatedProperties": false,
25587
26270
  "x-adiaui": {
26271
+ "allowedChildren": [
26272
+ "Tab"
26273
+ ],
25588
26274
  "anti_patterns": [],
25589
- "category": "container",
26275
+ "category": "navigation",
25590
26276
  "composes": [
25591
26277
  "icon-ui"
25592
26278
  ],
@@ -25616,15 +26302,17 @@
25616
26302
  "tab"
25617
26303
  ],
25618
26304
  "name": "UITabs",
26305
+ "parts": {
26306
+ "indicator": {
26307
+ "description": "Auto-created sliding indicator element (line variant only) — template-owned anatomy part, not a light-DOM insertion point (gh#1454). Lazily created once via an internal-field guard (`!this.#indicator`), never adopted from a consumer-authored element."
26308
+ }
26309
+ },
25619
26310
  "related": [
25620
26311
  "tab"
25621
26312
  ],
25622
26313
  "slots": {
25623
26314
  "default": {
25624
26315
  "description": "Child tab-ui elements that form the tab strip"
25625
- },
25626
- "indicator": {
25627
- "description": "Auto-created sliding indicator element (line variant only)"
25628
26316
  }
25629
26317
  },
25630
26318
  "states": [
@@ -25835,6 +26523,7 @@
25835
26523
  "pill"
25836
26524
  ],
25837
26525
  "name": "UITag",
26526
+ "parts": {},
25838
26527
  "related": [
25839
26528
  "Badge",
25840
26529
  "NavGroup",
@@ -25946,7 +26635,7 @@
25946
26635
  "default": 0
25947
26636
  },
25948
26637
  "minLength": {
25949
- "description": "Minimum per-token character count after `transform` is applied.",
26638
+ "description": "Minimum per-token character count after `normalize` is applied.",
25950
26639
  "type": "number",
25951
26640
  "default": 1
25952
26641
  },
@@ -25955,6 +26644,17 @@
25955
26644
  "type": "string",
25956
26645
  "default": ""
25957
26646
  },
26647
+ "normalize": {
26648
+ "description": "Normalize tokens on commit, applied AFTER every candidate is\nalready trimmed of leading/trailing whitespace (unconditional,\nindependent of this attribute). `lowercase` lowercases, `trim`\nis then a no-op (the trim already happened), `strip-spaces`\nremoves all remaining interior whitespace, `\"\"` (default)\napplies no further normalization beyond that unconditional trim\n— case and interior spacing are preserved verbatim. Renamed\nfrom `[transform]` (gh#1335) — this is a value-commit\nnormalization step, a different concept from the global\nEnum·semantic `[transform]` (CSS text-transform display styling:\nuppercase/lowercase/capitalize/none), not merely a colliding\nvocabulary.",
26649
+ "type": "string",
26650
+ "enum": [
26651
+ "",
26652
+ "lowercase",
26653
+ "trim",
26654
+ "strip-spaces"
26655
+ ],
26656
+ "default": ""
26657
+ },
25958
26658
  "pasteSplit": {
25959
26659
  "description": "Regex character-class fragment matched against pasted text to\nsplit it into multiple tokens. Default `,\\n` splits on commas\nand newlines. Use `\"\"` to disable paste-splitting entirely.",
25960
26660
  "type": "string",
@@ -25984,17 +26684,6 @@
25984
26684
  "description": "Optional autocomplete strings rendered in a popover below the\nfield. Suggestions are hints, not gates — the typed value still\nwins on commit. JS property only (array reflection skipped).",
25985
26685
  "$ref": "#/$defs/DynamicStringList"
25986
26686
  },
25987
- "transform": {
25988
- "description": "Normalize tokens on commit. `lowercase` lowercases, `trim` strips\nleading + trailing whitespace, `strip-spaces` removes all\nwhitespace, `\"\"` (default) preserves the typed value.",
25989
- "type": "string",
25990
- "enum": [
25991
- "",
25992
- "lowercase",
25993
- "trim",
25994
- "strip-spaces"
25995
- ],
25996
- "default": ""
25997
- },
25998
26687
  "unique": {
25999
26688
  "description": "Reject duplicate tokens silently (no `invalid` event for accidental dups).",
26000
26689
  "type": "boolean",
@@ -26002,8 +26691,12 @@
26002
26691
  },
26003
26692
  "validateFn": {
26004
26693
  "description": "Per-token validator. Sync `(value, index) => boolean` rejects\nfalse synchronously; async `(value, index) => Promise<boolean>`\nflips the host into `[validating]` while pending. JS property\nonly — not serializable in A2UI JSON; wire post-mount.",
26005
- "type": "object",
26006
- "default": null
26694
+ "type": [
26695
+ "object",
26696
+ "null"
26697
+ ],
26698
+ "default": null,
26699
+ "x-ts-type": "((value: string, index: number) => boolean | Promise<boolean>) | null"
26007
26700
  },
26008
26701
  "value": {
26009
26702
  "description": "Current token list (string array). Setting `.value = ['a','b']`\nreplaces the rendered chips. Reflection skipped — array values\ndo not round-trip through attribute strings.",
@@ -26063,7 +26756,7 @@
26063
26756
  "type": "boolean"
26064
26757
  },
26065
26758
  "value": {
26066
- "description": "Candidate token text (post-transform).",
26759
+ "description": "Candidate token text (post-normalize).",
26067
26760
  "type": "string"
26068
26761
  }
26069
26762
  }
@@ -26094,12 +26787,12 @@
26094
26787
  "examples": [
26095
26788
  {
26096
26789
  "description": "Label input with lowercase normalization + max 10 tags + 2 pre-committed values.",
26097
- "a2ui": "[\n {\"id\": \"root\", \"component\": \"Card\", \"children\": [\"sec\"]},\n {\"id\": \"sec\", \"component\": \"Section\", \"children\": [\"field\"]},\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Labels\",\n \"children\": [\"tags\"]\n },\n {\n \"id\": \"tags\",\n \"component\": \"TagsInput\",\n \"name\": \"labels\",\n \"placeholder\": \"Add a label, press Enter\",\n \"transform\": \"lowercase\",\n \"max\": 10,\n \"value\": [\"bug\", \"high-priority\"]\n }\n]",
26790
+ "a2ui": "[\n {\"id\": \"root\", \"component\": \"Card\", \"children\": [\"sec\"]},\n {\"id\": \"sec\", \"component\": \"Section\", \"children\": [\"field\"]},\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Labels\",\n \"children\": [\"tags\"]\n },\n {\n \"id\": \"tags\",\n \"component\": \"TagsInput\",\n \"name\": \"labels\",\n \"placeholder\": \"Add a label, press Enter\",\n \"normalize\": \"lowercase\",\n \"max\": 10,\n \"value\": [\"bug\", \"high-priority\"]\n }\n]",
26098
26791
  "name": "canonical-labels"
26099
26792
  },
26100
26793
  {
26101
26794
  "description": "Recipient picker with Enter-only commit (commas are legal in display names).",
26102
- "a2ui": "[\n {\n \"id\": \"to\",\n \"component\": \"TagsInput\",\n \"name\": \"to\",\n \"placeholder\": \"Email…\",\n \"delimiter\": \"enter\",\n \"transform\": \"trim\"\n }\n]",
26795
+ "a2ui": "[\n {\n \"id\": \"to\",\n \"component\": \"TagsInput\",\n \"name\": \"to\",\n \"placeholder\": \"Email…\",\n \"delimiter\": \"enter\",\n \"normalize\": \"trim\"\n }\n]",
26103
26796
  "name": "email-recipients"
26104
26797
  }
26105
26798
  ],
@@ -26117,6 +26810,7 @@
26117
26810
  "multi-value-input"
26118
26811
  ],
26119
26812
  "name": "UITagsInput",
26813
+ "parts": {},
26120
26814
  "related": [
26121
26815
  "tag",
26122
26816
  "select",
@@ -26285,12 +26979,12 @@
26285
26979
  "default": false
26286
26980
  },
26287
26981
  "text-align": {
26288
- "description": "Override text alignment. Note: text-ui defaults to display:inline, so this only takes effect when text-ui is block-like (wrapping or parent display:block/grid). Added v0.6.18 (FB-10).",
26982
+ "description": "Override text alignment. Note: text-ui defaults to display:inline, so this only takes effect when text-ui is block-like (wrapping or parent display:block/grid). Added v0.6.18 (FB-10). Converged onto the global Enum·semantic `[text-align]` physical vocabulary (gh#1335) — `start`/`end` renamed to `left`/`right`; `justify` kept (a genuine physical alignment value, now also supported by the global grammar).",
26289
26983
  "type": "string",
26290
26984
  "enum": [
26291
- "start",
26985
+ "left",
26292
26986
  "center",
26293
- "end",
26987
+ "right",
26294
26988
  "justify"
26295
26989
  ],
26296
26990
  "default": ""
@@ -26338,10 +27032,10 @@
26338
27032
  }
26339
27033
  },
26340
27034
  "weight": {
26341
- "description": "Override the variant's font-weight. Maps to --a-weight / --a-weight-medium / --a-weight-semibold / --a-weight-bold. Permissive: unknown values are no-ops (variant weight wins). Added v0.6.18 (FB-10).",
27035
+ "description": "Override the variant's font-weight. Maps to --a-weight / --a-weight-medium / --a-weight-semibold / --a-weight-bold. Permissive: unknown values are no-ops (variant weight wins). Added v0.6.18 (FB-10). `normal` (was `regular`, gh#1335 — converged onto the global Enum·semantic `[weight]` vocabulary's spelling).",
26342
27036
  "type": "string",
26343
27037
  "enum": [
26344
- "regular",
27038
+ "normal",
26345
27039
  "medium",
26346
27040
  "semibold",
26347
27041
  "bold"
@@ -26374,6 +27068,7 @@
26374
27068
  "text"
26375
27069
  ],
26376
27070
  "name": "UIText",
27071
+ "parts": {},
26377
27072
  "related": [
26378
27073
  "avatar",
26379
27074
  "input",
@@ -26492,7 +27187,7 @@
26492
27187
  "unevaluatedProperties": false,
26493
27188
  "x-adiaui": {
26494
27189
  "anti_patterns": [],
26495
- "category": "layout",
27190
+ "category": "input",
26496
27191
  "composes": [],
26497
27192
  "events": {
26498
27193
  "change": {
@@ -26513,6 +27208,7 @@
26513
27208
  "textarea"
26514
27209
  ],
26515
27210
  "name": "UITextarea",
27211
+ "parts": {},
26516
27212
  "related": [
26517
27213
  "Input",
26518
27214
  "Field",
@@ -26682,6 +27378,7 @@
26682
27378
  "skin"
26683
27379
  ],
26684
27380
  "name": "ThemePanel",
27381
+ "parts": {},
26685
27382
  "related": [
26686
27383
  "Popover",
26687
27384
  "Button",
@@ -26741,7 +27438,7 @@
26741
27438
  },
26742
27439
  "ThemeProvider": {
26743
27440
  "title": "ThemeProvider",
26744
- "description": "Foundation-providing wrapper — adopts the AdiaUI foundation (design tokens +\nresets + page-frame + every primitive's CSS) into the document from anywhere\nin the DOM, so a surface renders fully-styled WITHOUT a hand-wired\n<link rel=\"stylesheet\"> in <head>. Layout-transparent (display: contents): the\nelement owns no box; children lay out as if it weren't there.\n\nMechanism: it imports the constructable-stylesheet twin of web-components.min.css\n(byte-identical to the CDN bundle, emitted from the same build buffer) and\nadopts it once into document.adoptedStyleSheets, deduped — adoption fires at\nmodule load, before paint. Coexists with the render-blocking <link> path; both\ndeliver the same bytes. Use a <link> (-> the CDN web-components.min.css) for\nmulti-page / top-level surfaces (cacheable across navigations, zero flash); use\n<theme-provider> for SPA roots, embedded apps, and dynamic mounts where you do\nnot control <head> (e.g. <embed-shell>, an A2UI surface, a micro-frontend).\n\nTheming: the base foundation is OS light/dark via light-dark() tokens. Two opt-in\nattributes adopt their layer on demand — theme=\"ocean|forest|slate|…\" applies a\nnamed preset (adopts the themes layer; matches the [theme] hook) and\nscale=\"verse|prose\" sets the compact / long-form typographic register (adopts the\nmatching register layer; maps onto the [verse]/[prose] attribute). Each layer is\nfetched only when its attribute is set, so a bare provider stays lean.\nOpt-in infra: NOT in the all-in-one @adia-ai/web-components barrel (it carries\nthe whole foundation); import @adia-ai/web-components/components/theme-provider\nexplicitly. Distinct from <frame-ui> (a layout skeleton, owns no CSS delivery)\nand the page shells (chrome over the same foundation).\n",
27441
+ "description": "Foundation-providing wrapper — adopts the AdiaUI foundation (design tokens +\nresets + page-frame + every primitive's CSS) into the document from anywhere\nin the DOM, so a surface renders fully-styled WITHOUT a hand-wired\n<link rel=\"stylesheet\"> in <head>. Layout-transparent (display: contents): the\nelement owns no box; children lay out as if it weren't there.\n\nMechanism: it imports the constructable-stylesheet twin of web-components.min.css\n(byte-identical to the CDN bundle, emitted from the same build buffer) and\nadopts it once into document.adoptedStyleSheets, deduped — adoption fires at\nmodule load, before paint. Coexists with the render-blocking <link> path; both\ndeliver the same bytes. Use a <link> (-> the CDN web-components.min.css) for\nmulti-page / top-level surfaces (cacheable across navigations, zero flash); use\n<theme-provider> for SPA roots, embedded apps, and dynamic mounts where you do\nnot control <head> (e.g. <embed-shell>, an A2UI surface, a micro-frontend).\n\nTheming: the base foundation is OS light/dark via light-dark() tokens. Two opt-in\nattributes adopt their layer on demand — theme=\"ocean|forest|slate|…\" applies a\nnamed preset (adopts the themes layer; matches the [theme] hook) and\nscale=\"ui-sm|ui-md|ui-lg|content-sm|content-md|content-lg\" sets the sizing\nregister (adopts the matching register layer). Deprecated aliases \"verse\"\n( ui-sm) and \"prose\" (→ content-md) still map onto the legacy\n[verse]/[prose] attributes; removed at v1.0. Each layer is fetched only\nwhen its attribute is set, so a bare provider stays lean.\nOpt-in infra: NOT in the all-in-one @adia-ai/web-components barrel (it carries\nthe whole foundation); import @adia-ai/web-components/components/theme-provider\nexplicitly. Distinct from <frame-ui> (a layout skeleton, owns no CSS delivery)\nand the page shells (chrome over the same foundation).\n",
26745
27442
  "type": "object",
26746
27443
  "allOf": [
26747
27444
  {
@@ -26805,6 +27502,7 @@
26805
27502
  "spa"
26806
27503
  ],
26807
27504
  "name": "UIThemeProvider",
27505
+ "parts": {},
26808
27506
  "related": [
26809
27507
  "Frame",
26810
27508
  "Card"
@@ -26875,6 +27573,9 @@
26875
27573
  ],
26876
27574
  "unevaluatedProperties": false,
26877
27575
  "x-adiaui": {
27576
+ "allowedChildren": [
27577
+ "TimelineItem"
27578
+ ],
26878
27579
  "anti_patterns": [],
26879
27580
  "category": "display",
26880
27581
  "composes": [
@@ -26903,6 +27604,7 @@
26903
27604
  "timeline"
26904
27605
  ],
26905
27606
  "name": "UITimeline",
27607
+ "parts": {},
26906
27608
  "related": [
26907
27609
  "timeline-item"
26908
27610
  ],
@@ -26966,8 +27668,14 @@
26966
27668
  "default": false
26967
27669
  },
26968
27670
  "status": {
26969
- "description": "Lifecycle state (idle | active | completed | error). Pairs with `spinner` on \"active\" for an in-progress step.",
27671
+ "description": "Lifecycle state (idle | active | completed | error) — the values timeline.css currently styles. Pairs with `spinner` on \"active\" for an in-progress step.",
26970
27672
  "type": "string",
27673
+ "enum": [
27674
+ "idle",
27675
+ "active",
27676
+ "completed",
27677
+ "error"
27678
+ ],
26971
27679
  "default": "idle"
26972
27680
  },
26973
27681
  "text": {
@@ -26981,6 +27689,13 @@
26981
27689
  "variant": {
26982
27690
  "description": "Visual variant (default | accent | success | warning | danger).",
26983
27691
  "type": "string",
27692
+ "enum": [
27693
+ "default",
27694
+ "accent",
27695
+ "success",
27696
+ "warning",
27697
+ "danger"
27698
+ ],
26984
27699
  "default": "default"
26985
27700
  }
26986
27701
  },
@@ -26989,6 +27704,9 @@
26989
27704
  ],
26990
27705
  "unevaluatedProperties": false,
26991
27706
  "x-adiaui": {
27707
+ "allowedParents": [
27708
+ "Timeline"
27709
+ ],
26992
27710
  "anti_patterns": [],
26993
27711
  "category": "feedback",
26994
27712
  "composes": [],
@@ -27002,6 +27720,7 @@
27002
27720
  "history-row"
27003
27721
  ],
27004
27722
  "name": "UITimelineItem",
27723
+ "parts": {},
27005
27724
  "related": [
27006
27725
  "Timeline",
27007
27726
  "FeedItem",
@@ -27009,10 +27728,16 @@
27009
27728
  ],
27010
27729
  "slots": {
27011
27730
  "description": {
27012
- "description": "Override slot for rich description markup (inline links, code spans, embedded badges). Renders beneath the primary text at body-subtle typography."
27731
+ "description": "Custom secondary-line content; falls through to [description] prop if not slotted. render() only writes into the component-stamped fallback span (gh#1462 adopt-or-stamp guard)."
27013
27732
  },
27014
27733
  "icon": {
27015
- "description": "Override the [icon] glyph with a custom slotted element. Use for branded icons, avatars, or non-Phosphor sources. Mutually exclusive with the [icon] attribute."
27734
+ "description": "Override the [icon] glyph with a custom slotted element (custom icon-ui, image, avatar). Mutually exclusive with the [icon] attribute — a consumer-authored slot child wins and is never renamed or removed by render() (gh#1462 adopt-or-stamp guard)."
27735
+ },
27736
+ "label": {
27737
+ "description": "Custom primary-line content; falls through to the [text] prop if not slotted. render() only writes into the component-stamped fallback span (gh#1462 adopt-or-stamp guard)."
27738
+ },
27739
+ "time": {
27740
+ "description": "Custom timestamp/duration content; falls through to the [duration] or [time] prop if not slotted. render() only writes into the component-stamped fallback span (gh#1462 adopt-or-stamp guard)."
27016
27741
  }
27017
27742
  },
27018
27743
  "states": [],
@@ -27210,6 +27935,7 @@
27210
27935
  "spinbutton"
27211
27936
  ],
27212
27937
  "name": "UITimePicker",
27938
+ "parts": {},
27213
27939
  "related": [
27214
27940
  "CalendarPicker",
27215
27941
  "Field",
@@ -27354,14 +28080,20 @@
27354
28080
  ],
27355
28081
  "unevaluatedProperties": false,
27356
28082
  "x-adiaui": {
27357
- "anti_patterns": [],
28083
+ "anti_patterns": [
28084
+ {
28085
+ "fix": "{\"component\": \"Toast\", \"variant\": \"success\", \"text\": \"Saved successfully.\"}\n",
28086
+ "why": "<feed-item-ui> is the underlying imperative-channel item — every\nfeed.yaml/feed-item.yaml a2ui rule says not to place it\ndeclaratively. It is meant to be created via UIFeed.post() (or a\ndeclared <toast-ui>, which forwards into it), never authored\ndirectly in generated markup.\n",
28087
+ "wrong": "{\"component\": \"FeedItem\", \"variant\": \"success\", \"text\": \"Saved successfully.\"}\n"
28088
+ }
28089
+ ],
27358
28090
  "category": "container",
27359
28091
  "composes": [],
27360
28092
  "events": {},
27361
28093
  "examples": [
27362
28094
  {
27363
- "description": "Column of three toast notification components showing success, warning, and error variants.",
27364
- "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Column\",\n \"gap\": \"2\",\n \"children\": [\n \"t1\",\n \"t2\",\n \"t3\"\n ]\n },\n {\n \"id\": \"t1\",\n \"component\": \"Toast\",\n \"variant\": \"success\",\n \"title\": \"Saved successfully\",\n \"description\": \"Your changes have been saved.\",\n \"dismissible\": true\n },\n {\n \"id\": \"t2\",\n \"component\": \"Toast\",\n \"variant\": \"warning\",\n \"title\": \"Storage almost full\",\n \"description\": \"You are using 90% of your available storage.\",\n \"dismissible\": true\n },\n {\n \"id\": \"t3\",\n \"component\": \"Toast\",\n \"variant\": \"error\",\n \"title\": \"Upload failed\",\n \"description\": \"The file could not be uploaded. Please try again.\",\n \"dismissible\": true\n }\n]",
28095
+ "description": "Column of three toast notification components showing success, warning, and danger variants.",
28096
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Column\",\n \"gap\": \"2\",\n \"children\": [\n \"t1\",\n \"t2\",\n \"t3\"\n ]\n },\n {\n \"id\": \"t1\",\n \"component\": \"Toast\",\n \"variant\": \"success\",\n \"text\": \"Saved successfully. Your changes have been saved.\"\n },\n {\n \"id\": \"t2\",\n \"component\": \"Toast\",\n \"variant\": \"warning\",\n \"text\": \"Storage almost full you are using 90% of your available storage.\"\n },\n {\n \"id\": \"t3\",\n \"component\": \"Toast\",\n \"variant\": \"danger\",\n \"text\": \"Upload failed. The file could not be uploaded. Please try again.\",\n \"duration\": 0\n }\n]",
27365
28097
  "name": "toast-notification"
27366
28098
  }
27367
28099
  ],
@@ -27380,6 +28112,7 @@
27380
28112
  "alert"
27381
28113
  ],
27382
28114
  "name": "UIToast",
28115
+ "parts": {},
27383
28116
  "related": [
27384
28117
  "Feed",
27385
28118
  "Alert",
@@ -27479,7 +28212,7 @@
27479
28212
  },
27480
28213
  "ToggleGroup": {
27481
28214
  "title": "ToggleGroup",
27482
- "description": "Multi-select button group (unlike <segmented-ui> which is single-select). Hosts <toggle-option-ui> children, each independently toggleable; emits change events with the active value set. Use for filter chips or feature flag clusters; for single-select option groups use <segmented-ui> instead.",
28215
+ "description": "DEPRECATED (gh#1369) — use <segmented-ui multiple> + <segment-ui> instead. Multi-select button group (unlike <segmented-ui> which is single-select by default). Hosts <toggle-option-ui> children, each independently toggleable; emits change events with the active value set.",
27483
28216
  "type": "object",
27484
28217
  "allOf": [
27485
28218
  {
@@ -27494,7 +28227,7 @@
27494
28227
  "const": "ToggleGroup"
27495
28228
  },
27496
28229
  "single": {
27497
- "description": "When true, restrict to one active option (single-select).",
28230
+ "description": "When true, restrict to one active option (single-select) — clicking the already-selected option again CLEARS it (empty value), unlike a native radiogroup. Migration (gh#1369): [single]=true maps to plain <segmented-ui> (no [multiple]) — note segmented-ui's single-select never clears on re-click, it's standard radiogroup semantics; the default (false, multi-select) maps to <segmented-ui multiple>.",
27498
28231
  "type": "boolean",
27499
28232
  "default": false
27500
28233
  },
@@ -27509,6 +28242,9 @@
27509
28242
  ],
27510
28243
  "unevaluatedProperties": false,
27511
28244
  "x-adiaui": {
28245
+ "allowedChildren": [
28246
+ "ToggleOption"
28247
+ ],
27512
28248
  "anti_patterns": [],
27513
28249
  "category": "navigation",
27514
28250
  "composes": [],
@@ -27537,6 +28273,7 @@
27537
28273
  "group"
27538
28274
  ],
27539
28275
  "name": "UIToggleGroup",
28276
+ "parts": {},
27540
28277
  "related": [
27541
28278
  "ToggleOption",
27542
28279
  "Segmented",
@@ -27553,7 +28290,7 @@
27553
28290
  "name": "idle"
27554
28291
  }
27555
28292
  ],
27556
- "status": "stable",
28293
+ "status": "deprecated",
27557
28294
  "synonyms": {
27558
28295
  "toggle-group": [
27559
28296
  "segmented-control",
@@ -27621,7 +28358,7 @@
27621
28358
  },
27622
28359
  "ToggleOption": {
27623
28360
  "title": "ToggleOption",
27624
- "description": "Child of `<toggle-group-ui>`. One toggleable option inside a single-select or multi-select group. Pressed state mirrors `value` against the parent's selection.",
28361
+ "description": "DEPRECATED (gh#1369) — use `<segment-ui>` inside `<segmented-ui multiple>` instead. Child of `<toggle-group-ui>`. One toggleable option inside a single-select or multi-select group. Pressed state mirrors `value` against the parent's selection.",
27625
28362
  "type": "object",
27626
28363
  "allOf": [
27627
28364
  {
@@ -27646,7 +28383,7 @@
27646
28383
  "default": ""
27647
28384
  },
27648
28385
  "selected": {
27649
- "description": "Whether this option is currently selected. Managed by the parent\n<toggle-group-ui> container (ADR-0056) — don't set directly; the group's\n`value` is the single source of truth. Converges onto <segment-ui>'s\ndeclared reflected-prop mechanism (was previously a private\n`data-selected` stamp with no declared API surface).",
28386
+ "description": "Whether this option is currently selected. Managed by the parent\n<toggle-group-ui> container (ADR-0056) — don't set directly; the group's\n`value` is the single source of truth. Converges onto <segment-ui>'s\ndeclared reflected-prop mechanism.",
27650
28387
  "type": "boolean",
27651
28388
  "default": false
27652
28389
  },
@@ -27666,8 +28403,11 @@
27666
28403
  ],
27667
28404
  "unevaluatedProperties": false,
27668
28405
  "x-adiaui": {
28406
+ "allowedParents": [
28407
+ "ToggleGroup"
28408
+ ],
27669
28409
  "anti_patterns": [],
27670
- "category": "forms",
28410
+ "category": "form",
27671
28411
  "composes": [],
27672
28412
  "events": {},
27673
28413
  "examples": [],
@@ -27678,6 +28418,7 @@
27678
28418
  "segmented-option"
27679
28419
  ],
27680
28420
  "name": "UIToggleOption",
28421
+ "parts": {},
27681
28422
  "related": [
27682
28423
  "ToggleGroup",
27683
28424
  "Segment",
@@ -27685,7 +28426,7 @@
27685
28426
  ],
27686
28427
  "slots": {},
27687
28428
  "states": [],
27688
- "status": "stable",
28429
+ "status": "deprecated",
27689
28430
  "synonyms": {
27690
28431
  "toggle-option": [
27691
28432
  "toggle-segment",
@@ -27820,7 +28561,7 @@
27820
28561
  "unevaluatedProperties": false,
27821
28562
  "x-adiaui": {
27822
28563
  "anti_patterns": [],
27823
- "category": "control",
28564
+ "category": "action",
27824
28565
  "composes": [
27825
28566
  "button-ui"
27826
28567
  ],
@@ -27857,6 +28598,7 @@
27857
28598
  "sun"
27858
28599
  ],
27859
28600
  "name": "UIToggleScheme",
28601
+ "parts": {},
27860
28602
  "related": [
27861
28603
  "Button",
27862
28604
  "Switch"
@@ -27973,6 +28715,7 @@
27973
28715
  "actions"
27974
28716
  ],
27975
28717
  "name": "UIToolbar",
28718
+ "parts": {},
27976
28719
  "related": [
27977
28720
  "button",
27978
28721
  "divider"
@@ -28050,6 +28793,7 @@
28050
28793
  "toolbar-cluster"
28051
28794
  ],
28052
28795
  "name": "UIToolbarGroup",
28796
+ "parts": {},
28053
28797
  "related": [
28054
28798
  "Toolbar",
28055
28799
  "Button",
@@ -28166,6 +28910,7 @@
28166
28910
  "popover"
28167
28911
  ],
28168
28912
  "name": "UITooltip",
28913
+ "parts": {},
28169
28914
  "related": [
28170
28915
  "button"
28171
28916
  ],
@@ -28276,6 +29021,9 @@
28276
29021
  ],
28277
29022
  "unevaluatedProperties": false,
28278
29023
  "x-adiaui": {
29024
+ "allowedChildren": [
29025
+ "TourStep"
29026
+ ],
28279
29027
  "anti_patterns": [
28280
29028
  {
28281
29029
  "fix": "<tour-ui><tour-step target=\"#dashboard\" title=\"Dashboard\">Tour the dashboard…</tour-step>…</tour-ui>",
@@ -28324,6 +29072,7 @@
28324
29072
  "feature-introduction"
28325
29073
  ],
28326
29074
  "name": "UITour",
29075
+ "parts": {},
28327
29076
  "related": [
28328
29077
  "tooltip",
28329
29078
  "popover",
@@ -28455,6 +29204,9 @@
28455
29204
  ],
28456
29205
  "unevaluatedProperties": false,
28457
29206
  "x-adiaui": {
29207
+ "allowedParents": [
29208
+ "Tour"
29209
+ ],
28458
29210
  "anti_patterns": [
28459
29211
  {
28460
29212
  "fix": "<tour-step target=\"#dashboard\">",
@@ -28472,6 +29224,7 @@
28472
29224
  "guided-step"
28473
29225
  ],
28474
29226
  "name": "UITourStep",
29227
+ "parts": {},
28475
29228
  "related": [
28476
29229
  "tour"
28477
29230
  ],
@@ -28516,6 +29269,9 @@
28516
29269
  ],
28517
29270
  "unevaluatedProperties": false,
28518
29271
  "x-adiaui": {
29272
+ "allowedChildren": [
29273
+ "TreeItem"
29274
+ ],
28519
29275
  "anti_patterns": [],
28520
29276
  "category": "data",
28521
29277
  "composes": [
@@ -28564,6 +29320,7 @@
28564
29320
  "folder"
28565
29321
  ],
28566
29322
  "name": "UITree",
29323
+ "parts": {},
28567
29324
  "related": [
28568
29325
  "TreeItem",
28569
29326
  "Nav",
@@ -28710,6 +29467,10 @@
28710
29467
  ],
28711
29468
  "unevaluatedProperties": false,
28712
29469
  "x-adiaui": {
29470
+ "allowedParents": [
29471
+ "Tree",
29472
+ "TreeItem"
29473
+ ],
28713
29474
  "anti_patterns": [],
28714
29475
  "category": "data",
28715
29476
  "composes": [],
@@ -28722,6 +29483,7 @@
28722
29483
  "hierarchy-item"
28723
29484
  ],
28724
29485
  "name": "UITreeItem",
29486
+ "parts": {},
28725
29487
  "related": [
28726
29488
  "Tree",
28727
29489
  "List",
@@ -28754,6 +29516,202 @@
28754
29516
  "version": 1
28755
29517
  }
28756
29518
  },
29519
+ "UIChatThread": {
29520
+ "title": "UIChatThread",
29521
+ "description": "Primitive chat message thread surface — a minimal scroll container\nfor ad-hoc message rendering. Distinct from the bespoke shell\nchild <chat-thread> (module-tier, lives inside <chat-shell>, owns\nscroll-to-bottom + [streaming] + [empty] reflected state). Use\nchat-thread-ui when embedding chat-like rows OUTSIDE a chat-shell\n(e.g. a comment thread inside <card-ui>); use <chat-thread> when\nauthoring a chat-shell.\n",
29522
+ "type": "object",
29523
+ "allOf": [
29524
+ {
29525
+ "$ref": "#/$defs/ComponentCommon"
29526
+ },
29527
+ {
29528
+ "$ref": "#/$defs/CatalogComponentCommon"
29529
+ }
29530
+ ],
29531
+ "properties": {
29532
+ "component": {
29533
+ "const": "UIChatThread"
29534
+ },
29535
+ "streaming": {
29536
+ "description": "Component property: streaming.",
29537
+ "type": "boolean",
29538
+ "default": false
29539
+ }
29540
+ },
29541
+ "required": [
29542
+ "component"
29543
+ ],
29544
+ "unevaluatedProperties": false,
29545
+ "x-adiaui": {
29546
+ "anti_patterns": [],
29547
+ "category": "agent",
29548
+ "composes": [],
29549
+ "events": {
29550
+ "submit": {
29551
+ "description": "Fired when the user submits a chat message via Enter or send button. Detail: { text, model }.",
29552
+ "detail": {
29553
+ "model": {
29554
+ "description": "Selected model identifier.",
29555
+ "type": "string"
29556
+ },
29557
+ "text": {
29558
+ "description": "Submitted message text.",
29559
+ "type": "string"
29560
+ }
29561
+ }
29562
+ }
29563
+ },
29564
+ "examples": [
29565
+ {
29566
+ "description": "Basic Chat usage",
29567
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"id\": \"comp\",\n \"component\": \"UIChatThread\"\n }\n]",
29568
+ "name": "basic-chat"
29569
+ },
29570
+ {
29571
+ "description": "Chat transcript with user and assistant messages; textContent prefixes the speaker (Text has no role/streaming prop).",
29572
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"UIChatThread\",\n \"children\": [\n \"m1\",\n \"m2\"\n ]\n },\n {\n \"id\": \"m1\",\n \"component\": \"Text\",\n \"textContent\": \"User: What's the capital of France?\"\n },\n {\n \"id\": \"m2\",\n \"component\": \"Text\",\n \"textContent\": \"Assistant: The capital of France is Paris.\"\n }\n]",
29573
+ "name": "basic"
29574
+ },
29575
+ {
29576
+ "description": "Chat with the container's own streaming indicator on while an assistant message is in progress (streaming is a UIChatThread prop, not a Text prop).",
29577
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"UIChatThread\",\n \"streaming\": true,\n \"children\": [\n \"m1\",\n \"m2\"\n ]\n },\n {\n \"id\": \"m1\",\n \"component\": \"Text\",\n \"textContent\": \"User: Explain black holes briefly.\"\n },\n {\n \"id\": \"m2\",\n \"component\": \"Text\",\n \"textContent\": \"Assistant: A black hole is a region of spacetime where gravity is so strong that\"\n }\n]",
29578
+ "name": "streaming"
29579
+ },
29580
+ {
29581
+ "description": "Chat transcript composed with ChatInput for a full conversation surface.",
29582
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Column\",\n \"gap\": \"2\",\n \"children\": [\n \"chat\",\n \"input\"\n ]\n },\n {\n \"id\": \"chat\",\n \"component\": \"UIChatThread\",\n \"children\": [\n \"m1\",\n \"m2\"\n ]\n },\n {\n \"id\": \"m1\",\n \"component\": \"Text\",\n \"textContent\": \"User: Give me a short haiku about the ocean.\"\n },\n {\n \"id\": \"m2\",\n \"component\": \"Text\",\n \"textContent\": \"Assistant: Waves whisper secrets — the tide retreats then returns, carrying the moon.\"\n },\n {\n \"id\": \"input\",\n \"component\": \"ChatInput\",\n \"placeholder\": \"Type a message...\"\n }\n]",
29583
+ "name": "with-input"
29584
+ }
29585
+ ],
29586
+ "keywords": [
29587
+ "chat",
29588
+ "message",
29589
+ "messaging",
29590
+ "sms",
29591
+ "chatbot",
29592
+ "conversation",
29593
+ "ai-chat",
29594
+ "messenger",
29595
+ "assistant",
29596
+ "copilot",
29597
+ "gpt",
29598
+ "llm",
29599
+ "ai",
29600
+ "bot",
29601
+ "prompt",
29602
+ "comment",
29603
+ "support"
29604
+ ],
29605
+ "name": "UIChatThread",
29606
+ "parts": {},
29607
+ "related": [
29608
+ "ChatThread",
29609
+ "List",
29610
+ "Feed"
29611
+ ],
29612
+ "slots": {
29613
+ "default": {
29614
+ "description": "Default slot — primary child content."
29615
+ }
29616
+ },
29617
+ "states": [
29618
+ {
29619
+ "description": "Default, ready for interaction.",
29620
+ "name": "idle"
29621
+ }
29622
+ ],
29623
+ "status": "stable",
29624
+ "synonyms": {
29625
+ "ai": [
29626
+ "chat",
29627
+ "streaming",
29628
+ "response",
29629
+ "command"
29630
+ ],
29631
+ "ai-chat": [
29632
+ "chat",
29633
+ "streaming",
29634
+ "response"
29635
+ ],
29636
+ "assistant": [
29637
+ "chat",
29638
+ "streaming",
29639
+ "response",
29640
+ "command"
29641
+ ],
29642
+ "bot": [
29643
+ "chat",
29644
+ "streaming",
29645
+ "response"
29646
+ ],
29647
+ "chatbot": [
29648
+ "chat",
29649
+ "streaming",
29650
+ "response"
29651
+ ],
29652
+ "comment": [
29653
+ "social",
29654
+ "post",
29655
+ "chat"
29656
+ ],
29657
+ "conversation": [
29658
+ "chat",
29659
+ "streaming",
29660
+ "response"
29661
+ ],
29662
+ "copilot": [
29663
+ "chat",
29664
+ "streaming",
29665
+ "response",
29666
+ "command"
29667
+ ],
29668
+ "gpt": [
29669
+ "chat",
29670
+ "streaming",
29671
+ "response"
29672
+ ],
29673
+ "llm": [
29674
+ "chat",
29675
+ "streaming",
29676
+ "response"
29677
+ ],
29678
+ "message": [
29679
+ "chat",
29680
+ "notification",
29681
+ "toast",
29682
+ "alert"
29683
+ ],
29684
+ "messaging": [
29685
+ "chat",
29686
+ "notification",
29687
+ "streaming"
29688
+ ],
29689
+ "messenger": [
29690
+ "chat",
29691
+ "streaming"
29692
+ ],
29693
+ "prompt": [
29694
+ "chat",
29695
+ "streaming",
29696
+ "command",
29697
+ "palette"
29698
+ ],
29699
+ "sms": [
29700
+ "chat",
29701
+ "notification"
29702
+ ],
29703
+ "support": [
29704
+ "faq",
29705
+ "accordion",
29706
+ "chat"
29707
+ ]
29708
+ },
29709
+ "tag": "chat-thread-ui",
29710
+ "tokens": {},
29711
+ "traits": [],
29712
+ "version": 1
29713
+ }
29714
+ },
28757
29715
  "Upload": {
28758
29716
  "title": "Upload",
28759
29717
  "description": "File upload with drag-and-drop. Uses showOpenFilePicker with input[type=file] fallback. Form-associated.",
@@ -28777,6 +29735,11 @@
28777
29735
  "type": "string",
28778
29736
  "default": ""
28779
29737
  },
29738
+ "compact": {
29739
+ "description": "Icon-only trigger mode (sanctioned mode attribute, gh#1493) — collapses the dropzone to a compact icon button. The prompt text and visible label hide; [label] feeds the trigger's aria-label (\"Upload files\" when unset).",
29740
+ "type": "boolean",
29741
+ "default": false
29742
+ },
28780
29743
  "component": {
28781
29744
  "const": "Upload"
28782
29745
  },
@@ -28844,9 +29807,11 @@
28844
29807
  "import",
28845
29808
  "transfer",
28846
29809
  "file-manager",
28847
- "files"
29810
+ "files",
29811
+ "compact"
28848
29812
  ],
28849
29813
  "name": "UIUpload",
29814
+ "parts": {},
28850
29815
  "related": [
28851
29816
  "progress",
28852
29817
  "button",
@@ -28970,6 +29935,7 @@
28970
29935
  "accessibility"
28971
29936
  ],
28972
29937
  "name": "UIVisuallyHidden",
29938
+ "parts": {},
28973
29939
  "related": [
28974
29940
  "text"
28975
29941
  ],
@@ -29505,6 +30471,10 @@
29505
30471
  "description": "Accessibility label (maps to aria-label at runtime).",
29506
30472
  "$ref": "#/$defs/DynamicString"
29507
30473
  },
30474
+ "ariaLive": {
30475
+ "description": "ARIA live-region politeness (maps to aria-live at runtime). Values: off | polite | assertive (A2UI v1.0 vocabulary, SPEC REQ-013). Use polite for status/progress text that updates in place, assertive only for urgent errors.",
30476
+ "$ref": "#/$defs/DynamicString"
30477
+ },
29508
30478
  "children": {
29509
30479
  "description": "Ordered list of child component ids (or a template binding).",
29510
30480
  "$ref": "#/$defs/ChildList"
@@ -29834,5 +30804,6 @@
29834
30804
  ],
29835
30805
  "additionalProperties": false
29836
30806
  }
29837
- }
30807
+ },
30808
+ "protocolVersion": "1.0"
29838
30809
  }