@adia-ai/web-components 0.8.34 → 0.8.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/components/agent-questions/agent-questions.class.js +0 -1
  3. package/components/badge/badge.css +27 -3
  4. package/components/badge/badge.examples.md +4 -4
  5. package/components/card/card.css +44 -1
  6. package/components/check/check.a2ui.json +25 -11
  7. package/components/check/check.class.js +5 -0
  8. package/components/check/check.css +21 -0
  9. package/components/check/check.d.ts +2 -0
  10. package/components/check/check.examples.md +4 -4
  11. package/components/check/check.yaml +26 -7
  12. package/components/demo-toggle/demo-toggle.css +4 -0
  13. package/components/demo-toggle/demo-toggle.examples.md +4 -4
  14. package/components/feed/feed-item.a2ui.json +3 -2
  15. package/components/feed/feed-item.yaml +7 -1
  16. package/components/feed/feed.css +28 -5
  17. package/components/field/field.examples.md +4 -4
  18. package/components/image/image.class.js +8 -0
  19. package/components/nav-group/nav-group.css +12 -1
  20. package/components/option-card/option-card.a2ui.json +10 -10
  21. package/components/option-card/option-card.css +32 -16
  22. package/components/option-card/option-card.yaml +19 -15
  23. package/components/radio/radio.examples.md +4 -4
  24. package/components/range/range.css +8 -4
  25. package/components/slider/slider.a2ui.json +6 -3
  26. package/components/slider/slider.css +28 -12
  27. package/components/slider/slider.yaml +11 -3
  28. package/components/stat/stat.examples.md +4 -4
  29. package/components/swatch/swatch.css +14 -6
  30. package/components/switch/switch.examples.md +4 -4
  31. package/components/table-toolbar/table-toolbar.css +10 -1
  32. package/components/tabs/tabs.css +10 -4
  33. package/components/tag/tag.class.js +14 -1
  34. package/components/tag/tag.css +63 -5
  35. package/components/text/text.examples.md +4 -4
  36. package/components/timeline/timeline-item.a2ui.json +2 -2
  37. package/components/timeline/timeline-item.yaml +2 -2
  38. package/components/timeline/timeline.css +33 -5
  39. package/components/timeline/timeline.d.ts +2 -2
  40. package/components/toast/toast.css +28 -5
  41. package/custom-elements.json +469 -46
  42. package/dist/theme-provider.min.js +1 -1
  43. package/dist/web-components.min.css +1 -1
  44. package/dist/web-components.min.js +4 -4
  45. package/dist/web-components.sheet.js +1 -1
  46. package/package.json +1 -1
  47. package/patterns/access-requests/access-requests.examples.html +3 -3
  48. package/patterns/admin-keys-and-export/admin-keys-and-export.examples.html +3 -3
  49. package/patterns/admin-shell/admin-shell.examples.html +3 -4
  50. package/patterns/agent-cost/agent-cost.examples.html +3 -3
  51. package/patterns/agent-memory/agent-memory.examples.html +3 -3
  52. package/patterns/agent-prompt-library/agent-prompt-library.examples.html +3 -3
  53. package/patterns/agent-tool-call/agent-tool-call.examples.html +3 -3
  54. package/patterns/alert-dialog/alert-dialog.examples.html +3 -3
  55. package/patterns/app-nav/app-nav.examples.html +4 -4
  56. package/patterns/approvals/approvals.examples.html +3 -3
  57. package/patterns/audit-log/audit-log.examples.html +3 -3
  58. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.html +19 -9
  59. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.js +2 -2
  60. package/patterns/changelog-feed/changelog-feed.examples.html +3 -3
  61. package/patterns/chart-in-card/chart-in-card.examples.html +37 -3
  62. package/patterns/chart-in-card/chart-in-card.examples.js +12 -0
  63. package/patterns/chart-in-card/chart-in-card.html +6 -0
  64. package/patterns/chat-shell/chat-shell.examples.html +3 -4
  65. package/patterns/comments-and-collaboration/comments-and-collaboration.examples.html +3 -3
  66. package/patterns/conversion-funnel/conversion-funnel.examples.html +3 -3
  67. package/patterns/data-tables-inline-edit-and-tree/data-tables-inline-edit-and-tree.examples.html +3 -3
  68. package/patterns/diff-review/diff-review.examples.html +3 -3
  69. package/patterns/editor-shell/editor-shell.examples.html +3 -4
  70. package/patterns/export-flow/export-flow.examples.html +3 -3
  71. package/patterns/filter-bar/filter-bar.examples.html +3 -3
  72. package/patterns/form-drawer/form-drawer.examples.html +3 -3
  73. package/patterns/forms-conditional-and-autocomplete/forms-conditional-and-autocomplete.examples.html +3 -3
  74. package/patterns/inline-dialog/inline-dialog.examples.html +3 -3
  75. package/patterns/kanban-board/kanban-board.examples.html +3 -3
  76. package/patterns/layout/layout.examples.html +4 -7
  77. package/patterns/marketing-engagement/marketing-engagement.examples.html +3 -3
  78. package/patterns/notifications-bell-and-digest/notifications-bell-and-digest.examples.html +3 -3
  79. package/patterns/permissions-matrix/permissions-matrix.examples.html +3 -3
  80. package/patterns/permissions-role-picker/permissions-role-picker.examples.html +3 -3
  81. package/patterns/permissions-sharing/permissions-sharing.examples.html +3 -3
  82. package/patterns/profile-public-and-verification/profile-public-and-verification.examples.html +3 -3
  83. package/patterns/record-detail-drawer/record-detail-drawer.examples.html +3 -3
  84. package/patterns/responsive-shell-sidebar/responsive-shell-sidebar.examples.html +3 -3
  85. package/patterns/retention-cohort/retention-cohort.examples.html +3 -3
  86. package/patterns/search-discovery/search-discovery.examples.html +3 -3
  87. package/patterns/system-banners/system-banners.examples.html +3 -3
  88. package/patterns/timezone-selector/timezone-selector.examples.html +3 -3
  89. package/patterns/wizard-drawer/wizard-drawer.examples.html +3 -3
@@ -30,6 +30,14 @@
30
30
  },
31
31
  "default": "false",
32
32
  "description": "Whether the section is expanded."
33
+ },
34
+ {
35
+ "name": "variant",
36
+ "type": {
37
+ "text": "string"
38
+ },
39
+ "default": "flat",
40
+ "description": "Per-item posture override. Items normally inherit their host accordion-ui's [variant] — set this directly on ONE item only to opt it out of (`flat`) or into (`contained`) the host's posture."
33
41
  }
34
42
  ],
35
43
  "slots": [
@@ -41,6 +49,10 @@
41
49
  "name": "action",
42
50
  "description": "§206 (v0.5.7): action buttons inside a custom header (e.g. Copy / Download / settings). Children placed at `[slot=\"action\"]` (or `[slot=\"actions\"]`, or marked `[data-no-toggle]`) are excluded from the toggle-on-click cascade — clicking them fires their own handler without also toggling the section."
43
51
  },
52
+ {
53
+ "name": "caret",
54
+ "description": "The disclosure indicator icon. Auto-stamped (a caret-down icon-ui) when absent — under BOTH the default header and an authored [slot=\"header\"]. Author your own [slot=\"caret\"] element (even empty) to opt out of the auto-stamp; no separate attribute needed."
55
+ },
44
56
  {
45
57
  "name": "body",
46
58
  "description": "The section's collapsible content. Renders below the header; hidden when `[open]` is unset. Author-fills with prose, lists, embedded forms, or any rich markup the panel needs."
@@ -73,6 +85,14 @@
73
85
  },
74
86
  "default": "false",
75
87
  "description": "Allow multiple panels to be open simultaneously"
88
+ },
89
+ {
90
+ "name": "variant",
91
+ "type": {
92
+ "text": "string"
93
+ },
94
+ "default": "flat",
95
+ "description": "Visual posture, inherited by child accordion-item-ui elements unless a child sets its own [variant]. `flat` (default) renders items with no chrome — settings pages, FAQ blocks, anywhere the accordion sits directly on the page canvas. `contained` gives every item a bounded surface (background + border + radius spanning header and open body, plus a divider between them when open) — the composition to reach for when nesting the accordion inside <card-ui>."
76
96
  }
77
97
  ],
78
98
  "slots": [
@@ -215,6 +235,94 @@
215
235
  }
216
236
  ]
217
237
  },
238
+ {
239
+ "kind": "javascript-module",
240
+ "path": "components/adia-mark/adia-mark.js",
241
+ "declarations": [
242
+ {
243
+ "kind": "class",
244
+ "description": "The Adia brand mark — a rounded square with the \"Adia\" wordmark cut out in a contrasting color. Token-driven: the background always reads as the current scheme's inverse surface, and the wordmark always reads as the current scheme's inverse foreground, so a single asset replaces separate light/dark/transparent static exports (gh `icon-ui` registry entry — icon-ui is the Phosphor-glyph registry only; this is a fixed, one-off brand image, a separate delivery shape.",
245
+ "name": "UIAdiaMark",
246
+ "tagName": "adia-mark-ui",
247
+ "superclass": {
248
+ "name": "UIElement",
249
+ "module": "/core/element.js"
250
+ },
251
+ "attributes": [
252
+ {
253
+ "name": "size",
254
+ "type": {
255
+ "text": "string"
256
+ },
257
+ "default": "md",
258
+ "description": "Diameter of the square mark. Matches avatar-ui's size ladder for visual consistency when the two sit side by side (e.g. an app switcher row)."
259
+ },
260
+ {
261
+ "name": "inline",
262
+ "type": {
263
+ "text": "boolean"
264
+ },
265
+ "default": "false",
266
+ "description": "Renders as `display:inline-block` instead of the block-level default (ADR-0037) — set this when the mark sits beside a text run (a topbar brand slot) rather than standing alone."
267
+ }
268
+ ]
269
+ }
270
+ ],
271
+ "exports": [
272
+ {
273
+ "kind": "custom-element-definition",
274
+ "name": "adia-mark-ui",
275
+ "declaration": {
276
+ "name": "UIAdiaMark",
277
+ "module": "./components/adia-mark/adia-mark.js"
278
+ }
279
+ }
280
+ ]
281
+ },
282
+ {
283
+ "kind": "javascript-module",
284
+ "path": "components/adia-wordmark/adia-wordmark.js",
285
+ "declarations": [
286
+ {
287
+ "kind": "class",
288
+ "description": "The Adia wordmark — the \"Adia\" text logotype rendered as inline SVG. Unlike `adia-mark-ui` (gh this is a standalone mark meant to sit directly on a surface: its fill defaults to the current scheme's on-surface foreground token (`--a-fg-strong`) rather than a fixed inverse pairing, so it reads correctly wherever it's placed — a login header, a footer, a splash screen — without needing a background chip (gh",
289
+ "name": "UIAdiaWordmark",
290
+ "tagName": "adia-wordmark-ui",
291
+ "superclass": {
292
+ "name": "UIElement",
293
+ "module": "/core/element.js"
294
+ },
295
+ "attributes": [
296
+ {
297
+ "name": "size",
298
+ "type": {
299
+ "text": "string"
300
+ },
301
+ "default": "md",
302
+ "description": "Height of the wordmark; width follows via the fixed aspect ratio. Matches adia-mark-ui's size ladder for visual consistency when the two sit side by side."
303
+ },
304
+ {
305
+ "name": "inline",
306
+ "type": {
307
+ "text": "boolean"
308
+ },
309
+ "default": "false",
310
+ "description": "Renders as `display:inline-block` instead of the block-level default (ADR-0037) — set this when the wordmark sits beside a text run rather than standing alone."
311
+ }
312
+ ]
313
+ }
314
+ ],
315
+ "exports": [
316
+ {
317
+ "kind": "custom-element-definition",
318
+ "name": "adia-wordmark-ui",
319
+ "declaration": {
320
+ "name": "UIAdiaWordmark",
321
+ "module": "./components/adia-wordmark/adia-wordmark.js"
322
+ }
323
+ }
324
+ ]
325
+ },
218
326
  {
219
327
  "kind": "javascript-module",
220
328
  "path": "components/agent-artifact/agent-artifact.js",
@@ -498,7 +606,7 @@
498
606
  "slots": [
499
607
  {
500
608
  "name": "default",
501
- "description": "Default slot — primary child content."
609
+ "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)."
502
610
  }
503
611
  ],
504
612
  "events": [
@@ -726,7 +834,7 @@
726
834
  "text": "string"
727
835
  },
728
836
  "default": "default",
729
- "description": "Semantic color variant."
837
+ "description": "Semantic severity family — the only color axis alert exposes. A quiet/passive banner is the family-less `default` (no attribute): the retired `muted`/`neutral` values were exact aliases of it."
730
838
  },
731
839
  {
732
840
  "name": "pattern",
@@ -776,7 +884,7 @@
776
884
  "slots": [
777
885
  {
778
886
  "name": "content",
779
- "description": "Alert body. For single-line text use the `text=` attribute (alert.js stamps a `<span slot=\"content\">` automatically). For rich content with title + description, wrap in `<col-ui slot=\"content\">` — the alert root is `display: flex` row, so multiple bare children would lay out side-by-side instead of stacking."
887
+ "description": "Alert body. For single-line text use the `text=` attribute (alert.js stamps a `<span slot=\"content\">` automatically). For structured banners use card-ui's section rhythm INSIDE the content element (gh `<footer>` (actions right-aligned with its own step of air) children of the slotted wrapper; the component owns the gaps (`--alert-section-gap`, `--alert-footer-gap`), so spacing balances without per-banner col-ui/row-ui improvisation. Free-form content without those children lays out exactly as before."
780
888
  },
781
889
  {
782
890
  "name": "leading",
@@ -824,6 +932,88 @@
824
932
  }
825
933
  ]
826
934
  },
935
+ {
936
+ "kind": "javascript-module",
937
+ "path": "components/anchor-bar/anchor-bar.js",
938
+ "declarations": [
939
+ {
940
+ "kind": "class",
941
+ "description": "Persistent, anchored, elevated surface for chrome that must stay visible while a condition holds — floating bulk-action toolbars, undo bars, sticky wizard/commit footers. Distinct from <toast-ui> (auto-dismissing, notification semantics) and <modal-ui>/<drawer-ui> (blocking overlays with backdrop + focus-trap semantics). Default mode anchors [anchor] to the nearest scroll container via `position: sticky` — the shape gh bulk-action-toolbar pattern hand-rolled with card-ui + position:sticky. Opt into [viewport] for a surface that anchors to the browser viewport instead, promoted to the top layer via the Popover API (`popover=\"manual\"`) so it wins stacking over shell chrome without a z-index war. Visibility is [open] (default false, no auto-dismiss timer) — arbitrary content (typically <toolbar-ui> or <text-ui> + <button-ui>) rides the default slot.",
942
+ "name": "UIAnchorBar",
943
+ "tagName": "anchor-bar-ui",
944
+ "superclass": {
945
+ "name": "UIElement",
946
+ "module": "/core/element.js"
947
+ },
948
+ "attributes": [
949
+ {
950
+ "name": "anchor",
951
+ "type": {
952
+ "text": "string"
953
+ },
954
+ "default": "bottom",
955
+ "description": "Viewport/container edge the bar sticks to."
956
+ },
957
+ {
958
+ "name": "align",
959
+ "type": {
960
+ "text": "string"
961
+ },
962
+ "default": "center",
963
+ "description": "Horizontal alignment along the anchored edge."
964
+ },
965
+ {
966
+ "name": "viewport",
967
+ "type": {
968
+ "text": "boolean"
969
+ },
970
+ "default": "false",
971
+ "description": "false (default) anchors to the nearest scroll container via `position: sticky` — safe for content with ResizeObserver-driven children (e.g. <toolbar-ui>'s overflow measurement never sees a display:none reset). true anchors to the browser viewport via `position: fixed` + Popover API top-layer promotion — note the native Popover UA stylesheet applies `display:none` while closed, which DOES reset ResizeObserver-driven children on first open; prefer the default for content wrapping <toolbar-ui>."
972
+ },
973
+ {
974
+ "name": "open",
975
+ "type": {
976
+ "text": "boolean"
977
+ },
978
+ "default": "false",
979
+ "description": "Controls visibility. No auto-dismiss — caller toggles explicitly."
980
+ }
981
+ ],
982
+ "slots": [
983
+ {
984
+ "name": "default",
985
+ "description": "Arbitrary bar content — typically <toolbar-ui> (bulk-action bars) or <text-ui> + <button-ui> (undo bars, wizard footers). The bar owns only the elevated surface chrome (bg/border/radius/shadow) and positioning; content layout is the slotted children's own."
986
+ }
987
+ ],
988
+ "events": [
989
+ {
990
+ "name": "open",
991
+ "type": {
992
+ "text": "CustomEvent"
993
+ },
994
+ "description": "Fired when [open] becomes true."
995
+ },
996
+ {
997
+ "name": "close",
998
+ "type": {
999
+ "text": "CustomEvent"
1000
+ },
1001
+ "description": "Fired when [open] becomes false."
1002
+ }
1003
+ ]
1004
+ }
1005
+ ],
1006
+ "exports": [
1007
+ {
1008
+ "kind": "custom-element-definition",
1009
+ "name": "anchor-bar-ui",
1010
+ "declaration": {
1011
+ "name": "UIAnchorBar",
1012
+ "module": "./components/anchor-bar/anchor-bar.js"
1013
+ }
1014
+ }
1015
+ ]
1016
+ },
827
1017
  {
828
1018
  "kind": "javascript-module",
829
1019
  "path": "components/avatar/avatar.js",
@@ -851,7 +1041,7 @@
851
1041
  "type": {
852
1042
  "text": "string"
853
1043
  },
854
- "description": "Forwards to each child <avatar-ui> (xs|sm|md|lg|xl). Empty uses the per-avatar size."
1044
+ "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."
855
1045
  }
856
1046
  ]
857
1047
  },
@@ -893,7 +1083,7 @@
893
1083
  "text": "string"
894
1084
  },
895
1085
  "default": "md",
896
- "description": "Avatar size canonical scale."
1086
+ "description": "Avatar size (sm/md/lg). The former xs/xl diameters are the ancestor-[scale] grid cells (scale=\"ui-sm\", size=\"sm\") / (scale=\"ui-lg\", size=\"lg\")."
897
1087
  },
898
1088
  {
899
1089
  "name": "src",
@@ -944,7 +1134,7 @@
944
1134
  "declarations": [
945
1135
  {
946
1136
  "kind": "class",
947
- "description": "Inline pill-shaped badge — READ-ONLY status flag, count, or notification dot. Text rendered via CSS `attr(text)`. Distinct from <tag-ui>, which is INTERACTIVE / removable and fires a `remove` event. Use badge-ui for status flags (Beta / New / Deprecated), notification counts, and unread indicators; use tag-ui for filter chips or user-managed labels.",
1137
+ "description": "Inline pill-shaped badge — READ-ONLY status flag, count, or notification dot. Text rendered via CSS `attr(text)`. Distinct from <tag-ui>, which is INTERACTIVE / removable and fires a `remove` event. Use badge-ui for status flags (Beta / New / Deprecated), notification counts, and unread indicators; use tag-ui for filter chips or user-managed labels. REGISTER (gh issue 845; weight revised gh the same geometry family — pill radius (`--a-radius-full`) and padding token rhythm are identical, so shape is NOT how you tell them apart. Typography is: badge is UPPERCASE, mono (kbd-ui's `--a-font-family-code` stack), medium weight, wide-tracked (`--a-font-tracking-wider`, 0.06em), tabular numerals for counts. Tag stays proportional sentence-case, also weight 500 — weight no longer distinguishes the two (gh the register split now. Neither component exposes a prop that crosses this line; the registers cannot be mixed à la carte. Remaining distinctions: badge is non-interactive and carries the semantic-color voice (status tones ARE the message, solid by default — gh default for family variants (gh family-less variant (gh",
948
1138
  "name": "UIBadge",
949
1139
  "tagName": "badge-ui",
950
1140
  "superclass": {
@@ -965,7 +1155,7 @@
965
1155
  "text": "string"
966
1156
  },
967
1157
  "default": "md",
968
- "description": "Badge size"
1158
+ "description": "Badge size (sm/md/lg). For a denser or larger register, set [scale] on an ancestor."
969
1159
  },
970
1160
  {
971
1161
  "name": "status",
@@ -1001,8 +1191,8 @@
1001
1191
  "type": {
1002
1192
  "text": "string"
1003
1193
  },
1004
- "default": "muted",
1005
- "description": "Fill style — orthogonal to [variant]. Badge defaults to `muted` (quiet metadata is the primitive's identity — counts, IDs, status pills in dense rows). Three values: - `muted` (default) — tinted bg + scheme-paired text. Same as the existing family-variant rules. - `solid` — saturated bg + on-strong text. Use for hero badges where the badge IS the state (e.g. a single inline error). The existing `primary` variant is a shortcut for accent + solid. - `outline` — transparent bg + family-colored border + family- colored text. Lightest visual weight; good in dense data rows. Vocabulary mirrors `<tag-ui>` (which defaults to solid, given its different role as filter / autocomplete chip)."
1194
+ "default": "solid",
1195
+ "description": "Fill style — orthogonal to [variant]. Badge defaults to `solid` (gh default formulas; this restores badge's own). Three values: - `solid` (default) — saturated bg + on-strong text. The badge IS the state (status stamp). `primary` is badge's sole brand-emphasis variant (`accent` retired, gh - `muted` — tinted bg + scheme-paired text. Use for quiet metadata counts, IDs, status pills in dense rows. Family-tinted `muted` (e.g. `variant=\"info\" tone=\"muted\"`) shares `<tag-ui>`'s `[tone=\"muted\"]` shape; family-less `tone=\"muted\"` does NOT (gh `<tag-ui>`'s family-less muted stays on the lighter `--a-bg-muted` pair (gh - `outline` — transparent bg + family-colored border + family- colored text. Lightest visual weight; good in dense data rows. Vocabulary mirrors `<tag-ui>` (which now defaults to `muted` for its family variants, gh autocomplete chip)."
1006
1196
  }
1007
1197
  ]
1008
1198
  }
@@ -1232,7 +1422,7 @@
1232
1422
  "text": "string"
1233
1423
  },
1234
1424
  "default": "md",
1235
- "description": "Sizing scale (xs/sm/md/lg/xl)."
1425
+ "description": "Sizing scale (sm/md/lg). For a denser or larger register, set [scale] on an ancestor (scale=\\\"ui-sm\\\" … \\\"content-lg\\\") — scale picks the table, size picks the row."
1236
1426
  },
1237
1427
  {
1238
1428
  "name": "text",
@@ -1254,7 +1444,7 @@
1254
1444
  "text": "string"
1255
1445
  },
1256
1446
  "default": "solid",
1257
- "description": "Visual style — `solid` (default fill), `outline`, `ghost`. `default` / `primary` are aliases of `solid`. Style is independent of semantic intent — to express destructive / success / info / warning intent, set [color=\"…\"] alongside. For **inline navigation** (Terms of Service, Privacy Policy, footer links, \"Sign in\" / \"Sign up\" cross-page affordances) use `<link-ui>` instead — it carries proper `<a href>` semantics, keyboard handling (Enter only, no Space), middle-click open-new-tab, and screen-reader announces \"link\" instead of \"button\". Mixing navigation and action affordances under the same primitive is a category error fixed at this junction."
1447
+ "description": "Visual style — `solid` (default fill), `tonal` (soft container fill with in-family text — the emphasis tier between solid and outline; default rides the primary family), `outline`, `ghost`. `default` / `primary` are aliases of `solid`. Style is independent of semantic intent — to express destructive / success / info / warning intent, set [color=\"…\"] alongside (`variant=\"tonal\" color=\"danger\"` = the danger family's container fill). There is deliberately no `variant=\"secondary\"`: `secondary` names a color family in this system, and an unset variant already IS the secondary-rank look (compose-constitution); `tonal` is the named tier for a softer-than-solid filled action. For **inline navigation** (Terms of Service, Privacy Policy, footer links, \"Sign in\" / \"Sign up\" cross-page affordances) use `<link-ui>` instead — it carries proper `<a href>` semantics, keyboard handling (Enter only, no Space), middle-click open-new-tab, and screen-reader announces \"link\" instead of \"button\". Mixing navigation and action affordances under the same primitive is a category error fixed at this junction."
1258
1448
  },
1259
1449
  {
1260
1450
  "name": "color",
@@ -1860,6 +2050,21 @@
1860
2050
  "default": "0.4",
1861
2051
  "description": "Line smoothing factor"
1862
2052
  },
2053
+ {
2054
+ "name": "dots",
2055
+ "type": {
2056
+ "text": "string"
2057
+ },
2058
+ "default": "all",
2059
+ "description": "Marker (dot) visibility for line and multi-line series. `all` draws a circle[data-dot] on every datum (default — matches pre-gh behavior). `none` hides all dots so a dense series reads as a clean line. `hover` shows only the currently-hovered datum's dot. `last` shows only the terminal point per series (sparkline convention). Tooltip hit targets ([data-hit]) are a separate always-rendered layer — every mode keeps hover/click working along the whole line."
2060
+ },
2061
+ {
2062
+ "name": "seriesEmphasis",
2063
+ "type": {
2064
+ "text": "string"
2065
+ },
2066
+ "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"
2067
+ },
1863
2068
  {
1864
2069
  "name": "loading",
1865
2070
  "type": {
@@ -2156,6 +2361,14 @@
2156
2361
  },
2157
2362
  "description": "Label text beside the checkbox"
2158
2363
  },
2364
+ {
2365
+ "name": "labelHidden",
2366
+ "type": {
2367
+ "text": "boolean"
2368
+ },
2369
+ "default": "false",
2370
+ "description": "When true, [label] still sets the accessible name (aria-label) but the visible text is suppressed via the canonical sr-only technique (gh visually (e.g. a title next to a check-ui used as a list-item icon) and the plain-visible label would paint it twice."
2371
+ },
2159
2372
  {
2160
2373
  "name": "value",
2161
2374
  "type": {
@@ -2952,6 +3165,14 @@
2952
3165
  },
2953
3166
  "default": "Type a command...",
2954
3167
  "description": "Placeholder text for the search input"
3168
+ },
3169
+ {
3170
+ "name": "options",
3171
+ "type": {
3172
+ "text": "array"
3173
+ },
3174
+ "default": "[]",
3175
+ "description": "Programmatic item list. Array of {value, label, icon?, shortcut?, disabled?} or grouped {label, options:[…]}. `icon` renders as a leading icon-ui, `shortcut` as a trailing keyboard-shortcut hint — the same fields as the data-icon/data-shortcut attributes on declarative <option> children. Alternative to declarative <option data-icon data-shortcut> / <optgroup label> children."
2955
3176
  }
2956
3177
  ],
2957
3178
  "slots": [
@@ -3083,7 +3304,7 @@
3083
3304
  "declarations": [
3084
3305
  {
3085
3306
  "kind": "class",
3086
- "description": "Compound form primitive for selecting a start + end date pair with optional named preset shortcuts (\"Today\", \"Last 7 days\", \"This month\", ...). Default presentation is a trigger button showing the formatted range; on activation a popover opens with two synchronized calendar panes + a preset side rail. Composes <calendar-picker-ui> twice; emits {from, to} ISO 8601 dates. Optional comparison-range mode emits a secondary range for analytics surfaces.",
3307
+ "description": "Compound form primitive for selecting a start + end date pair with optional named preset shortcuts (\"Today\", \"Last 7 days\", \"This month\", ...). Default presentation is a trigger button showing the formatted range; on activation a popover opens with two synchronized calendar panes + a preset side rail. Composes <calendar-grid-ui> twice; emits {from, to} ISO 8601 dates. Both panes are ONE selection surface: first click = start, second click = end, in either grid; a second click earlier than the start restarts the range there. Optional comparison-range mode emits a secondary range for analytics surfaces.",
3087
3308
  "name": "UIDateRangePicker",
3088
3309
  "tagName": "date-range-picker-ui",
3089
3310
  "superclass": {
@@ -4032,7 +4253,7 @@
4032
4253
  "text": "string"
4033
4254
  },
4034
4255
  "default": "default",
4035
- "description": "Semantic variant"
4256
+ "description": "Semantic variant — `default | info | success | warning | danger | primary`. `primary` is the brand-emphasis fill (accent-filled bg + on-accent text), ported from toast.css's `primary` variant (gh posted toasts."
4036
4257
  },
4037
4258
  {
4038
4259
  "name": "duration",
@@ -4563,7 +4784,7 @@
4563
4784
  "type": {
4564
4785
  "text": "string"
4565
4786
  },
4566
- "description": "Icon size. Accepts the named scale (`xs` 12px / `sm` 14px / `md` 16px / `lg` 20px / `xl` 32px / `2xl` 48px / `3xl` 64px / `4xl` 96px / `fill` 100% of parent) or a free-form pixel / rem / em value as a string (\"48\", \"3rem\", \"1.25em\"). Overrides the inherited `--a-icon-size` from the universal `[size]` system on ancestors."
4787
+ "description": "Icon size. Named tiers `sm` 14px / `md` 16px / `lg` 20px ride the universal `[size]` system (`--a-icon-size`), which the ancestor `[scale]` tiers re-table. Anything beyond the row is a free-form pixel / rem / em / percent string (\"48\", \"3rem\", \"1.25em\", \"100%\" fills the parent box)."
4567
4788
  },
4568
4789
  {
4569
4790
  "name": "weight",
@@ -4572,6 +4793,13 @@
4572
4793
  },
4573
4794
  "default": "regular",
4574
4795
  "description": "Icon weight — selects the Phosphor weight variant (thin/light/regular/bold/fill/duotone)."
4796
+ },
4797
+ {
4798
+ "name": "tone",
4799
+ "type": {
4800
+ "text": "string"
4801
+ },
4802
+ "description": "Semantic color role. Empty (default) inherits currentColor — unchanged from pre-tone behavior. Maps to the L3 role text tokens (--a-{family}-text / --a-fg-muted). Vocabulary mirrors <badge-ui>'s [variant] enum so a status color reads the same whether it comes from a Badge chip or a bare status/trend icon."
4575
4803
  }
4576
4804
  ]
4577
4805
  }
@@ -5255,6 +5483,13 @@
5255
5483
  "text": "string"
5256
5484
  },
5257
5485
  "description": "Sizing scale: sm, md (default), lg."
5486
+ },
5487
+ {
5488
+ "name": "textContent",
5489
+ "type": {
5490
+ "text": "string"
5491
+ },
5492
+ "description": "Key label text, extracted from innerHTML (e.g. \"Ctrl+K\"). The main payload field for Kbd components extracted from HTML — mirrors Text/Code's textContent prop."
5258
5493
  }
5259
5494
  ],
5260
5495
  "slots": [
@@ -5574,6 +5809,14 @@
5574
5809
  }
5575
5810
  ],
5576
5811
  "slots": [
5812
+ {
5813
+ "name": "text",
5814
+ "description": "Override slot for richer primary-text markup than the plain [text] attribute string. Styled by `:scope [slot=\"text\"]` (list.css) and honored by UIListItem's stamping logic — a consumer-provided [slot=\"text\"] child is never overwritten (only component-stamped ones are). Undeclared until gh"
5815
+ },
5816
+ {
5817
+ "name": "content",
5818
+ "description": "Full-row escape hatch: when a [slot=\"content\"] child is present the component stamps NOTHING (no icon/text/description spans) and the child owns the entire row. Use for cards, rows, or any custom composition that the icon | content | action grid cannot express."
5819
+ },
5577
5820
  {
5578
5821
  "name": "icon",
5579
5822
  "description": "Override the [icon] glyph with a custom slotted element (e.g. a colored <icon-ui>, an image, or an avatar-ui). Mutually exclusive with the [icon] attribute — slot child wins if both are present."
@@ -5754,7 +5997,7 @@
5754
5997
  "text": "string"
5755
5998
  },
5756
5999
  "default": "warning",
5757
- "description": "Highlight color variant. Default `warning` is the conventional yellow-marker tone."
6000
+ "description": "Highlight color family — the only color axis mark exposes. Default `warning` is the conventional yellow-marker tone and IS mark's family-less identity, so there is no `default` member. For a neutral (non-semantic) highlight, override the public tokens instead of the variant: `--mark-bg: var(--a-bg-muted); --mark-fg: var(--md-sys-color-neutral-on-surface)` — the successor to the retired `variant=\"muted\"` (gh#881)."
5758
6001
  }
5759
6002
  ],
5760
6003
  "slots": [
@@ -5792,7 +6035,7 @@
5792
6035
  },
5793
6036
  {
5794
6037
  "kind": "class",
5795
- "description": "Child of `<menu-ui>`. One actionable row inside a menu, with optional leading icon + label + value.",
6038
+ "description": "Child of `<menu-ui>`. One actionable row inside a menu, with optional leading icon + label + subtitle + value.",
5796
6039
  "name": "UIMenuItem",
5797
6040
  "tagName": "menu-item-ui",
5798
6041
  "superclass": {
@@ -5814,6 +6057,13 @@
5814
6057
  },
5815
6058
  "description": "Item label text."
5816
6059
  },
6060
+ {
6061
+ "name": "subtitle",
6062
+ "type": {
6063
+ "text": "string"
6064
+ },
6065
+ "description": "Optional secondary description line rendered under the label."
6066
+ },
5817
6067
  {
5818
6068
  "name": "value",
5819
6069
  "type": {
@@ -5846,6 +6096,14 @@
5846
6096
  {
5847
6097
  "name": "text",
5848
6098
  "description": "Custom label content; falls through to `[text]` prop if not slotted."
6099
+ },
6100
+ {
6101
+ "name": "subtitle",
6102
+ "description": "Custom secondary-line content override; falls through to `[subtitle]` prop if not slotted."
6103
+ },
6104
+ {
6105
+ "name": "trailing",
6106
+ "description": "Trailing element pinned to the far edge (shortcut hint, check mark)."
5849
6107
  }
5850
6108
  ]
5851
6109
  },
@@ -6001,7 +6259,7 @@
6001
6259
  "text": "string"
6002
6260
  },
6003
6261
  "default": "md",
6004
- "description": "Width preset. sm=24rem, md=32rem, lg=48rem, full=95vw."
6262
+ "description": "Width preset. sm=24rem, md=32rem, lg=48rem (each capped at 90vw)."
6005
6263
  },
6006
6264
  {
6007
6265
  "name": "text",
@@ -6094,6 +6352,14 @@
6094
6352
  "default": "false",
6095
6353
  "description": "Inline-expanded state. Toggled by header click when [collapsible]."
6096
6354
  },
6355
+ {
6356
+ "name": "selected",
6357
+ "type": {
6358
+ "text": "boolean"
6359
+ },
6360
+ "default": "false",
6361
+ "description": "Marks the group containing the selected route (consumers set it from active-route logic). Drives the filled header glyph — selection, never mere expansion (gh#459)."
6362
+ },
6097
6363
  {
6098
6364
  "name": "collapsible",
6099
6365
  "type": {
@@ -6345,7 +6611,7 @@
6345
6611
  "type": {
6346
6612
  "text": "string"
6347
6613
  },
6348
- "description": "Noodle stroke color. Defaults to --a-accent"
6614
+ "description": "Noodle stroke color. Defaults to --a-primary-bg"
6349
6615
  },
6350
6616
  {
6351
6617
  "name": "curve",
@@ -6575,7 +6841,7 @@
6575
6841
  "declarations": [
6576
6842
  {
6577
6843
  "kind": "class",
6578
- "description": "Selectable card with radio semantics. A \"rich radio\" — single-select one of N where each option carries a heading, optional description, and optional leading icon. Siblings sharing a `name` form a radiogroup. The whole card is the click target; a CSS-rendered radio circle in the top-left signals state. Form-associated, so `name=value` submits with the parent form when checked.",
6844
+ "description": "Selectable card with radio semantics. A \"rich radio\" — single-select one of N where each option carries a heading, optional description, and an optional icon at the trailing end of the header row. Siblings sharing a `name` form a radiogroup. The whole card is the click target; a CSS-rendered radio circle in the top-left signals state. Renders on a container-low tonal surface (no outline as the primary boundary); the checked state keeps an accent border + fill so selection stays unmistakable. Form-associated, so `name=value` submits with the parent form when checked.",
6579
6845
  "name": "UIOptionCard",
6580
6846
  "tagName": "option-card-ui",
6581
6847
  "superclass": {
@@ -6640,7 +6906,7 @@
6640
6906
  "type": {
6641
6907
  "text": "string"
6642
6908
  },
6643
- "description": "Optional Phosphor icon name. Stamped as a leading <icon-ui slot=\"icon\"> when set."
6909
+ "description": "Optional Phosphor icon name. Stamped as a trailing <icon-ui slot=\"icon\"> when set."
6644
6910
  },
6645
6911
  {
6646
6912
  "name": "layout",
@@ -6648,7 +6914,7 @@
6648
6914
  "text": "string"
6649
6915
  },
6650
6916
  "default": "default",
6651
- "description": "Internal layout. `default` puts the indicator on the left and the icon adjacent. `tile` stacks vertically — icon top-left, indicator top-right, heading + description below — for hero pickers (source / role / plan tiles) where the icon is a primary brand cue."
6917
+ "description": "Internal layout. `default` puts the indicator on the left and, when [icon] is set, the icon at the trailing end of the header row alongside the heading. `tile` stacks vertically — icon top-left, indicator top-right, heading + description below — for hero pickers (source / role / plan tiles) where the icon is a primary brand cue."
6652
6918
  }
6653
6919
  ],
6654
6920
  "slots": [
@@ -7090,26 +7356,26 @@
7090
7356
  },
7091
7357
  "attributes": [
7092
7358
  {
7093
- "name": "complete",
7359
+ "name": "stage",
7094
7360
  "type": {
7095
- "text": "boolean"
7361
+ "text": "string"
7096
7362
  },
7097
- "default": "false",
7098
- "description": "Component property: complete."
7363
+ "description": "Current stage name (interpret, analyze, plan, generate, validate, render)."
7099
7364
  },
7100
7365
  {
7101
7366
  "name": "message",
7102
7367
  "type": {
7103
7368
  "text": "string"
7104
7369
  },
7105
- "description": "Component property: message."
7370
+ "description": "Current stage description shown alongside the stage label."
7106
7371
  },
7107
7372
  {
7108
- "name": "stage",
7373
+ "name": "status",
7109
7374
  "type": {
7110
7375
  "text": "string"
7111
7376
  },
7112
- "description": "Component property: stage."
7377
+ "default": "idle",
7378
+ "description": "Canonical stage-progress state. Set to `completed` to render the final state and collapse the history log."
7113
7379
  }
7114
7380
  ],
7115
7381
  "slots": [
@@ -7153,6 +7419,14 @@
7153
7419
  "default": "4",
7154
7420
  "description": "Pixel offset between the anchor and the popover"
7155
7421
  },
7422
+ {
7423
+ "name": "match-width",
7424
+ "type": {
7425
+ "text": "boolean"
7426
+ },
7427
+ "default": "false",
7428
+ "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."
7429
+ },
7156
7430
  {
7157
7431
  "name": "open",
7158
7432
  "type": {
@@ -7476,6 +7750,59 @@
7476
7750
  }
7477
7751
  ]
7478
7752
  },
7753
+ {
7754
+ "kind": "javascript-module",
7755
+ "path": "components/radio-group/radio-group.js",
7756
+ "declarations": [
7757
+ {
7758
+ "kind": "class",
7759
+ "description": "Groups a set of bare <radio-ui label=\"…\"> children under one accessible name — role=\"radiogroup\" on the host plus aria-labelledby pointing at its own [label]. Radio-ui already supports ancestor fieldset/[role=radiogroup] grouping for exclusivity + arrow-key navigation (unchanged by this wrapper); a plain layout container (Column) can carry neither the role nor the label association, which left the canonical questionnaire shape (radio.yaml's own example) with no programmatic question↔group link (gh mutually-exclusive radio-ui options — it is the ONLY primitive that carries the group's accessible name; radio-ui itself stays self-labeling per-option.",
7760
+ "name": "UIRadioGroup",
7761
+ "tagName": "radio-group-ui",
7762
+ "superclass": {
7763
+ "name": "UIElement",
7764
+ "module": "/core/element.js"
7765
+ },
7766
+ "attributes": [
7767
+ {
7768
+ "name": "label",
7769
+ "type": {
7770
+ "text": "string"
7771
+ },
7772
+ "description": "The question or prompt text — rendered above the options and wired to the host via aria-labelledby. This is the group's accessible name; without it the group has none."
7773
+ },
7774
+ {
7775
+ "name": "required",
7776
+ "type": {
7777
+ "text": "boolean"
7778
+ },
7779
+ "default": "false",
7780
+ "description": "Marks the group as requiring a selection for form validation (visual + aria-required only — the constraint itself lives on each radio-ui's own [required])."
7781
+ }
7782
+ ],
7783
+ "slots": [
7784
+ {
7785
+ "name": "default",
7786
+ "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."
7787
+ },
7788
+ {
7789
+ "name": "label",
7790
+ "description": "Auto-minted label element (mounted by radio-group-ui from the [label] prop) — do not author this slot directly."
7791
+ }
7792
+ ]
7793
+ }
7794
+ ],
7795
+ "exports": [
7796
+ {
7797
+ "kind": "custom-element-definition",
7798
+ "name": "radio-group-ui",
7799
+ "declaration": {
7800
+ "name": "UIRadioGroup",
7801
+ "module": "./components/radio-group/radio-group.js"
7802
+ }
7803
+ }
7804
+ ]
7805
+ },
7479
7806
  {
7480
7807
  "kind": "javascript-module",
7481
7808
  "path": "components/radio/radio.js",
@@ -7893,6 +8220,14 @@
7893
8220
  "text": "string"
7894
8221
  },
7895
8222
  "description": "Source URL (image, iframe, etc.)."
8223
+ },
8224
+ {
8225
+ "name": "flush",
8226
+ "type": {
8227
+ "text": "boolean"
8228
+ },
8229
+ "default": "false",
8230
+ "description": "Paragraph-grade embedding mode — removes the article chrome (body padding and the 45rem reading measure, plus the trailing paragraph margin) so the rendered markdown sits flush in a host column like a plain text block. Use when richtext carries a single paragraph or fragment inside an already-measured layout (doc pages, cards); leave off for standalone articles and chat transcripts."
7896
8231
  }
7897
8232
  ],
7898
8233
  "slots": [
@@ -8192,6 +8527,14 @@
8192
8527
  "text": "string"
8193
8528
  },
8194
8529
  "description": "Value of the currently selected segment."
8530
+ },
8531
+ {
8532
+ "name": "allowEmpty",
8533
+ "type": {
8534
+ "text": "boolean"
8535
+ },
8536
+ "default": "false",
8537
+ "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."
8195
8538
  }
8196
8539
  ],
8197
8540
  "slots": [
@@ -8232,7 +8575,7 @@
8232
8575
  "declarations": [
8233
8576
  {
8234
8577
  "kind": "class",
8235
- "description": "Single- and multi-select dropdown primitive — the canonical AdiaUI select control. Form-bearing via UIFormElement: [name], [value], [required], [disabled], fires `change`. Options via native <option> / <optgroup> children, programmatic `.options` array, or JSON [data-options] (hydrated by <editor-shell>'s wireSelects). Use for single-select with > 4 options; for ≤ 4 options use <segmented-ui> or <radio-ui>. Multi-select via [multiple]: trigger renders <tag-ui> chips per selection, popover shows checkbox-style option list, Backspace removes the last chip, [select-all] adds bulk controls, [max-chips] caps the visible chip count with a \"+N more\" pill. Form value stays a comma-separated string under [name] for native <form> compatibility (parse with .split(',')).",
8578
+ "description": "Single- and multi-select dropdown primitive — the canonical AdiaUI select control. Form-bearing via UIFormElement: [name], [value], [required], [disabled], fires `change`. Options via native <option> / <optgroup> children, programmatic `.options` array, or JSON [data-options] (hydrated by <editor-shell>'s wireSelects). Use for single-select with > 4 options; for ≤ 4 options use <segmented-ui> or <radio-ui>. Multi-select via [multiple]: trigger renders <tag-ui> chips per selection, popover shows checkbox-style option list, Backspace removes the last chip, [select-all] adds bulk controls, [max-chips] caps the visible chip count with a \"+N more\" pill, and [summary-label] swaps the chip trigger for one text line — the single selection's label, or \"Label (N)\" for more. Form value stays a comma-separated string under [name] for native <form> compatibility (parse with .split(',')).",
8236
8579
  "name": "UISelect",
8237
8580
  "tagName": "select-ui",
8238
8581
  "superclass": {
@@ -8278,6 +8621,14 @@
8278
8621
  },
8279
8622
  "description": "URL for leading avatar image (takes precedence over icon)"
8280
8623
  },
8624
+ {
8625
+ "name": "mark",
8626
+ "type": {
8627
+ "text": "boolean"
8628
+ },
8629
+ "default": "false",
8630
+ "description": "Renders the Adia brand mark (`<adia-mark-ui>`) as the leading visual — takes precedence over avatar and icon. Token-driven (light/dark handled internally), so it fits a scheme-switching workspace/app switcher where a static logo URL can't invert. Per-option `mark` on an `<option>`/options-array entry works the same way, scoped to that row."
8631
+ },
8281
8632
  {
8282
8633
  "name": "disabled",
8283
8634
  "type": {
@@ -8294,6 +8645,14 @@
8294
8645
  "default": "false",
8295
8646
  "description": "Reserved attribute on a select option that renders as a visual divider instead of a selectable row."
8296
8647
  },
8648
+ {
8649
+ "name": "no-radio",
8650
+ "type": {
8651
+ "text": "boolean"
8652
+ },
8653
+ "default": "false",
8654
+ "description": "Suppress the single-select radio indicator on option rows (gh For menu-shaped switchers — workspace or user identity menus — where the trigger already shows the committed value and a per-row radio reads as redundant selection language. Rows keep their layout and aria-selected state; the trigger and selected-row weight carry the signal. No effect under [multiple]. IMPLIED by [mark] — a mark declares an identity switcher, which is always menu-shaped (gh"
8655
+ },
8297
8656
  {
8298
8657
  "name": "error",
8299
8658
  "type": {
@@ -8362,6 +8721,14 @@
8362
8721
  "default": "0",
8363
8722
  "description": "Multi-select only. Caps the number of chips visible in the trigger. When `value.length > max-chips`, the first N chips render plus a \"+M more\" pill that opens the popover on click. `0` (default) = unlimited."
8364
8723
  },
8724
+ {
8725
+ "name": "summary-label",
8726
+ "type": {
8727
+ "text": "string"
8728
+ },
8729
+ "default": "null",
8730
+ "description": "Multi-select only (gh text line: a single selection shows its own label; N > 1 shows \"<summary-label> (N)\" — e.g. \"Organizations (2)\"; none shows the placeholder. Popover checkbox rows, Backspace-removes-last, the comma-separated form value, [select-all], and [clearable] are unchanged. Absent (default) = tag-ui chip trigger. Prefer this form for narrow triggers (filter bars) where wrapping chips would balloon the control."
8731
+ },
8365
8732
  {
8366
8733
  "name": "min",
8367
8734
  "type": {
@@ -8408,7 +8775,7 @@
8408
8775
  "text": "array"
8409
8776
  },
8410
8777
  "default": "[]",
8411
- "description": "Option list. Array of {value, label, disabled?, icon?, avatar?} or grouped {label, options: [...]}. Alternative to declarative <option> / <optgroup> children. Per-option icon/avatar render in the list AND reflect in the trigger's selected state."
8778
+ "description": "Option list. Array of {value, label, disabled?, icon?, avatar?, mark?} or grouped {label, options: [...]}. Alternative to declarative <option> / <optgroup> children. Per-option icon/avatar/mark render in the list AND reflect in the trigger's selected state (mark takes precedence over avatar, which takes precedence over icon). An {action, label} entry is a COMMAND row, not a selection: it dispatches the `action` event, never becomes the value, and renders without the single-select radio indicator (user menus: Account / Log out)."
8412
8779
  },
8413
8780
  {
8414
8781
  "name": "pattern",
@@ -8951,6 +9318,14 @@
8951
9318
  },
8952
9319
  "default": "false",
8953
9320
  "description": "Horizontal-bleed KPI layout. With a `slot=\"chart\"` child, the value / label / change stack on the left while the chart fills the right column at full height and bleeds to the card's top / right / bottom edges (the horizontal counterpart to a chart in a card `<section bleed>`). No effect without a chart slot."
9321
+ },
9322
+ {
9323
+ "name": "band",
9324
+ "type": {
9325
+ "text": "boolean"
9326
+ },
9327
+ "default": "false",
9328
+ "description": "Chart-band KPI layout. With a `slot=\"chart\"` child, label / value / change stack full width top to bottom and the chart forms a short full-width band between the value and the change row (the Gmail/Vercel/shadcn stat-card shape). Composes with `icon` exactly as the base layout does. No effect without a chart slot."
8954
9329
  }
8955
9330
  ],
8956
9331
  "slots": [
@@ -8994,7 +9369,7 @@
8994
9369
  "declarations": [
8995
9370
  {
8996
9371
  "kind": "class",
8997
- "description": "Discrete-dash step-progress indicator. One <span> dash per step in [total]; the first [value] dashes are filled with --a-accent. Used in multi-step flows (registration, onboarding, wizards). Replaces the bespoke `[data-onb-progress]` + `[data-reg-progress]` markup that lived in onboarding.css + registration.css with a single primitive.",
9372
+ "description": "Discrete-dash step-progress indicator. One <span> dash per step in [total]; the first [value] dashes are filled with --md-sys-color-primary. Used in multi-step flows (registration, onboarding, wizards). Replaces the bespoke `[data-onb-progress]` + `[data-reg-progress]` markup that lived in onboarding.css + registration.css with a single primitive.",
8998
9373
  "name": "UIStepProgress",
8999
9374
  "tagName": "step-progress-ui",
9000
9375
  "superclass": {
@@ -9091,6 +9466,14 @@
9091
9466
  },
9092
9467
  "default": "idle",
9093
9468
  "description": "Canonical stage-progress state. Mutually exclusive (prevents the `active && completed` footgun the prior multi-Boolean shape allowed)."
9469
+ },
9470
+ {
9471
+ "name": "disabled",
9472
+ "type": {
9473
+ "text": "boolean"
9474
+ },
9475
+ "default": "false",
9476
+ "description": "S2's phase-gating mechanism (gh#711 S1 review). Skipped in the parent's [interactive] roving tabindex/arrow order, unclickable, carries aria-disabled. Independent of [status] — a completed or upcoming step can still be disabled for a different reason (e.g. the visit phase hasn't unlocked it yet)."
9094
9477
  }
9095
9478
  ],
9096
9479
  "slots": [
@@ -9110,7 +9493,7 @@
9110
9493
  },
9111
9494
  {
9112
9495
  "kind": "class",
9113
- "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.",
9496
+ "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.",
9114
9497
  "name": "UIStepper",
9115
9498
  "tagName": "stepper-ui",
9116
9499
  "superclass": {
@@ -9133,6 +9516,14 @@
9133
9516
  },
9134
9517
  "default": "0",
9135
9518
  "description": "Current step index (0-based)."
9519
+ },
9520
+ {
9521
+ "name": "interactive",
9522
+ "type": {
9523
+ "text": "boolean"
9524
+ },
9525
+ "default": "false",
9526
+ "description": "Opt into click-to-navigate + roving-tabindex keyboard nav (arrow keys / Home / End / Enter / Space). Absent by default — a bare stepper is a read-only progress display, not a nav control (gh"
9136
9527
  }
9137
9528
  ],
9138
9529
  "slots": [
@@ -9140,6 +9531,22 @@
9140
9531
  "name": "default",
9141
9532
  "description": "Default slot — primary child content."
9142
9533
  }
9534
+ ],
9535
+ "events": [
9536
+ {
9537
+ "name": "step-request",
9538
+ "type": {
9539
+ "text": "CustomEvent"
9540
+ },
9541
+ "description": "Cancelable — fires BEFORE [step] mutates, on a click or keyboard navigation. call preventDefault() to veto: the step does not change, [change] does not fire, and focus/roving-tabindex stay exactly where they were. A host that never listens for this event keeps the pre-veto uncontrolled behavior unchanged (gh"
9542
+ },
9543
+ {
9544
+ "name": "change",
9545
+ "type": {
9546
+ "text": "CustomEvent"
9547
+ },
9548
+ "description": "Fired after a click or keyboard navigation changes [step] (i.e. only when the preceding [step-request] wasn't vetoed). Only fires when [interactive] is set."
9549
+ }
9143
9550
  ]
9144
9551
  }
9145
9552
  ],
@@ -9587,7 +9994,7 @@
9587
9994
  "type": {
9588
9995
  "text": "string"
9589
9996
  },
9590
- "description": "Sizing scale (full tier — xs / sm / md / lg / xl)."
9997
+ "description": "Sizing scale (sm / md / lg). For a denser or larger register, set [scale] on an ancestor."
9591
9998
  },
9592
9999
  {
9593
10000
  "name": "value",
@@ -9790,7 +10197,7 @@
9790
10197
  "text": "array"
9791
10198
  },
9792
10199
  "default": "[]",
9793
- "description": "Column definitions. Array of {key, label, type?, width?, minWidth?, maxWidth?, flex?, sortable?, resizable?, filterable?, pinned?, hidden?, wrap?, accessor?, format?, render?, sortFn?, filterType?, meta?}. Alternative to declarative <col-def> children."
10200
+ "description": "Column definitions. Array of {key, label, type?, width?, minWidth?, maxWidth?, flex?, sortable?, resizable?, filterable?, pinned?, hidden?, wrap?, valign?, accessor?, format?, render?, sortFn?, filterType?, meta?}. `valign` ('top'|'center') overrides the host [valign] for that column's body cells only — header cells always stay centered. Alternative to declarative <col-def> children (<col-def valign=\"top\">); col-def also accepts `meta` as a JSON attribute (gh#925) — e.g. <col-def type=\"badge\" meta='{\"variants\":{\"Online\":\"success\"}}'> — so cell-type meta (badge variant maps, currency codes) is expressible in static HTML."
9794
10201
  },
9795
10202
  {
9796
10203
  "name": "data",
@@ -9798,7 +10205,7 @@
9798
10205
  "text": "array"
9799
10206
  },
9800
10207
  "default": "[]",
9801
- "description": "Row records. Array of plain objects keyed to columns[].key."
10208
+ "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 Custom accessor on the element class, not a reflected attribute."
9802
10209
  },
9803
10210
  {
9804
10211
  "name": "density",
@@ -9838,7 +10245,7 @@
9838
10245
  "text": "boolean"
9839
10246
  },
9840
10247
  "default": "false",
9841
- "description": "Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom \"No data\" overlay. v0.6.33+ matches the documented contract."
10248
+ "description": "Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Note: a `<table-ui>` placed directly inside `<card-ui><section bleed>` drops the table's visual chrome automatically (card.css, gh#796) even without `raw` — `raw` is still required to also short-circuit the data lifecycle. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom \"No data\" overlay. v0.6.33+ matches the documented contract."
9842
10249
  },
9843
10250
  {
9844
10251
  "name": "search",
@@ -9871,6 +10278,22 @@
9871
10278
  "default": "false",
9872
10279
  "description": "Alternate row background colors for visual scanning."
9873
10280
  },
10281
+ {
10282
+ "name": "frameless",
10283
+ "type": {
10284
+ "text": "boolean"
10285
+ },
10286
+ "default": "false",
10287
+ "description": "Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance. Note: `<card-ui><section bleed>` already drops a direct-child table-ui's chrome automatically (card.css, gh instance still applies and is honored, but is no longer required just to avoid the doubled-edge look in that composition."
10288
+ },
10289
+ {
10290
+ "name": "valign",
10291
+ "type": {
10292
+ "text": "string"
10293
+ },
10294
+ "default": "center",
10295
+ "description": "Vertical alignment of body-cell content. 'center' (default) keeps today's behavior — every cell centers on the row's cross-axis, which reads well for single-line rows. 'top' aligns each cell's content to the top of its padding box instead, so tall/wrapped rows (a [wrap] title column, a stacked identity cell) share one first-line scan anchor across the row rather than each cell floating at a different vertical center (gh (or <col-def valign=\"…\">) overrides the host per-column — e.g. keep a checkbox column centered while data cells top-align. Header cells always stay centered regardless of this prop (single-line by contract) — the checkbox/expand structural columns also default to centered under [valign=\"top\"] since they're not part of columns[]."
10296
+ },
9874
10297
  {
9875
10298
  "name": "wrap",
9876
10299
  "type": {
@@ -10120,7 +10543,7 @@
10120
10543
  "text": "string"
10121
10544
  },
10122
10545
  "default": "md",
10123
- "description": "Size preset controlling font-size and padding."
10546
+ "description": "Size preset controlling font-size and padding (sm/md/lg — same size system as badge-ui). For a denser or larger register, set [scale] on an ancestor."
10124
10547
  },
10125
10548
  {
10126
10549
  "name": "text",
@@ -10142,15 +10565,15 @@
10142
10565
  "text": "string"
10143
10566
  },
10144
10567
  "default": "default",
10145
- "description": "Semantic variant — `default | info | success | warning | danger`."
10568
+ "description": "Semantic variant — `default | info | success | warning | danger | primary`."
10146
10569
  },
10147
10570
  {
10148
10571
  "name": "tone",
10149
10572
  "type": {
10150
10573
  "text": "string"
10151
10574
  },
10152
- "default": "solid",
10153
- "description": "Fill style — orthogonal to [variant]. Three values: - `solid` (default for family variants)saturated bg + on-strong (near-white) text. The chip IS the state. - `muted` — tinted bg with scheme-paired text. Matches <badge-ui>'s default look. Use on metadata chips in dense lists where the saturated default would compete for attention. - `outline` — transparent bg + family-colored border + family-colored text. The lightest visual weight; good in dense data tables or faceted filter rows where multiple chips would otherwise compete. The `default` variant (no family) stays quiet chrome regardless of tone unless `tone=\"solid\"` is set explicitly (high-contrast neutral inverse), or `tone=\"outline\"` (fg-muted text + subtle border)."
10575
+ "default": "muted",
10576
+ "description": "Fill style — orthogonal to [variant]. Three values: - `muted` (default for the family variants — info/success/warning/ danger/primary gh their reported default formulas; this restores tag's own) — tinted bg with scheme-paired text. Matches <badge-ui>'s `[tone=\"muted\"]` look. Use on metadata / citation chips in dense lists or tables where a saturated fill would compete for attention (gh the family-less `default` variant, which stays solid unconditionally (gh `<tag-ui text=\"…\">` still renders that solid look with no attributes at all. - `solid` — saturated bg + on-strong (near-white) text. The chip IS the state. Opt in explicitly for a family variant (gh or it's already the unconditional look for the family-less `default` variant (gh - `outline` — transparent bg + family-colored border + family-colored text. The lightest visual weight; good in dense data tables or faceted filter rows where multiple chips would otherwise compete. `tone` is a declarative presentational attribute (not a reactive prop see tag.class.js) so its schema `default` here is documentation of the rendered-by-default look, not a reflected attribute value."
10154
10577
  }
10155
10578
  ],
10156
10579
  "events": [
@@ -10327,7 +10750,7 @@
10327
10750
  "slots": [
10328
10751
  {
10329
10752
  "name": "chip",
10330
- "description": "Custom chip template receives `{value, index}` per token. When absent, each token renders as a default `<tag-ui removable text=\"<value>\">`."
10753
+ "description": "Custom per-token chip template (TKT-0023). Provide a single `<template slot=\"chip\">` child; it's cloned once per committed token, with `{{value}}` / `{{index}}` substituted into every text node and attribute value in the clone (e.g. `<tag-ui removable text=\"{{value}}\" title=\"Item #{{index}}\">`). The template's first element child is the reconcile unit — data-* bookkeeping attrs land on it, so removal / re-render still track by position the same way the default chip does. When absent, or when the template has no element content (malformed), each token renders as the default `<tag-ui removable text=\"<value>\">`. Readonly/disabled toggling of the built-in `removable` affordance only applies to the default chip — a custom template always owns its own removability, independent of the host's readonly/disabled state."
10331
10754
  }
10332
10755
  ],
10333
10756
  "events": [
@@ -10628,7 +11051,7 @@
10628
11051
  "type": {
10629
11052
  "text": "string"
10630
11053
  },
10631
- "description": "Typographic / density register for the subtree — \"verse\" (compact) or \"prose\" (long-form). Adopts the matching register layer on demand; maps onto the [verse]/[prose] attribute (additive)."
11054
+ "description": "Sizing register for the subtree — one of the six [scale] tiers: ui-sm (dense product UI), ui-md (base), ui-lg (touch/presentation), content-sm (compact article), content-md (long-form), content-lg (hero/marketing). Adopts the scale layer on demand; the reflected attribute is the [scale=\"…\"] CSS hook. Deprecated aliases \"verse\" (→ ui-sm) and \"prose\" (→ content-md) still map onto the legacy [verse]/[prose] attributes; removed at v1.0."
10632
11055
  }
10633
11056
  ]
10634
11057
  }
@@ -10858,7 +11281,7 @@
10858
11281
  "text": "string"
10859
11282
  },
10860
11283
  "default": "idle",
10861
- "description": "Lifecycle state (idle | pending | done | failed)."
11284
+ "description": "Lifecycle state (idle | active | completed | error). Pairs with `spinner` on \"active\" for an in-progress step."
10862
11285
  },
10863
11286
  {
10864
11287
  "name": "spinner",
@@ -10866,7 +11289,7 @@
10866
11289
  "text": "boolean"
10867
11290
  },
10868
11291
  "default": "false",
10869
- "description": "Show a spinner instead of the icon while status=pending."
11292
+ "description": "Show a spinner instead of the dot/icon while status=\"active\"."
10870
11293
  }
10871
11294
  ],
10872
11295
  "slots": [
@@ -10986,7 +11409,7 @@
10986
11409
  "text": "string"
10987
11410
  },
10988
11411
  "default": "info",
10989
- "description": "Semantic variant — `default | info | success | warning | danger`. `primary` and `muted` are style hints; canonical \"neutral but interesting\" tone is `info`."
11412
+ "description": "Semantic variant — `default | info | success | warning | danger | primary`. `primary` is the brand-emphasis fill (mirrors badge-ui/button-ui's `primary`); canonical \"neutral but interesting\" tone is `info`."
10990
11413
  }
10991
11414
  ]
10992
11415
  }
@@ -11267,7 +11690,7 @@
11267
11690
  "text": "string"
11268
11691
  },
11269
11692
  "default": "md",
11270
- "description": "Sizing scale forwarded to the internal <button-ui>."
11693
+ "description": "Sizing scale (sm/md/lg) forwarded to the internal <button-ui>."
11271
11694
  },
11272
11695
  {
11273
11696
  "name": "variant",