@adia-ai/web-components 0.8.37 → 0.8.39

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 (48) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/MIGRATION.md +9 -7
  3. package/README.md +3 -3
  4. package/bin/doc.mjs +27 -5
  5. package/components/calendar-picker/calendar-picker.css +4 -1
  6. package/components/card/card.css +1 -1
  7. package/components/combobox/combobox.css +6 -0
  8. package/components/command/command.a2ui.json +3 -0
  9. package/components/command/command.class.js +28 -6
  10. package/components/command/command.css +14 -3
  11. package/components/command/command.yaml +5 -0
  12. package/components/date-range-picker/date-range-picker.css +6 -0
  13. package/components/datetime-picker/datetime-picker.css +4 -0
  14. package/components/drilldown/drilldown.a2ui.json +244 -0
  15. package/components/drilldown/drilldown.class.js +550 -0
  16. package/components/drilldown/drilldown.css +304 -0
  17. package/components/drilldown/drilldown.d.ts +68 -0
  18. package/components/drilldown/drilldown.examples.md +20 -0
  19. package/components/drilldown/drilldown.js +17 -0
  20. package/components/drilldown/drilldown.yaml +273 -0
  21. package/components/index.js +1 -0
  22. package/components/modal/modal.class.js +68 -4
  23. package/components/nav/nav.a2ui.json +5 -0
  24. package/components/nav/nav.class.js +35 -12
  25. package/components/nav/nav.d.ts +2 -0
  26. package/components/nav/nav.yaml +18 -0
  27. package/components/nav-item/nav-item.class.js +9 -6
  28. package/components/page/page.a2ui.json +13 -1
  29. package/components/page/page.css +113 -0
  30. package/components/page/page.yaml +30 -3
  31. package/components/select/select.class.js +30 -12
  32. package/components/select/select.css +11 -2
  33. package/components/swatch/swatch.css +6 -4
  34. package/components/toggle-group/toggle-group.class.js +21 -11
  35. package/components/toggle-group/toggle-group.css +16 -8
  36. package/components/toggle-group/toggle-group.d.ts +6 -0
  37. package/components/toggle-group/toggle-group.yaml +10 -0
  38. package/components/toggle-group/toggle-option.a2ui.json +5 -0
  39. package/components/toggle-group/toggle-option.yaml +18 -2
  40. package/custom-elements.json +277 -100
  41. package/dist/theme-provider.min.js +3 -3
  42. package/dist/web-components.min.css +1 -1
  43. package/dist/web-components.min.js +110 -88
  44. package/dist/web-components.sheet.js +1 -1
  45. package/package.json +1 -1
  46. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.html +1 -1
  47. package/styles/components.css +1 -0
  48. package/traits/view-transition/view-transition.js +7 -0
@@ -241,7 +241,7 @@
241
241
  "declarations": [
242
242
  {
243
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.",
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#283). Not an `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
245
  "name": "UIAdiaMark",
246
246
  "tagName": "adia-mark-ui",
247
247
  "superclass": {
@@ -285,7 +285,7 @@
285
285
  "declarations": [
286
286
  {
287
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",
288
+ "description": "The Adia wordmark — the \"Adia\" text logotype rendered as inline SVG. Unlike `adia-mark-ui` (gh#283's fixed inverse-on-inverse square tile), 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#390).",
289
289
  "name": "UIAdiaWordmark",
290
290
  "tagName": "adia-wordmark-ui",
291
291
  "superclass": {
@@ -434,7 +434,7 @@
434
434
  "description": "Disable all actions."
435
435
  },
436
436
  {
437
- "name": "saveIcon",
437
+ "name": "save-icon",
438
438
  "type": {
439
439
  "text": "string"
440
440
  },
@@ -442,7 +442,7 @@
442
442
  "description": "Save button icon."
443
443
  },
444
444
  {
445
- "name": "saveLabel",
445
+ "name": "save-label",
446
446
  "type": {
447
447
  "text": "string"
448
448
  },
@@ -521,7 +521,7 @@
521
521
  "description": "Headline question."
522
522
  },
523
523
  {
524
- "name": "submitLabel",
524
+ "name": "submit-label",
525
525
  "type": {
526
526
  "text": "string"
527
527
  },
@@ -572,7 +572,7 @@
572
572
  },
573
573
  "attributes": [
574
574
  {
575
- "name": "noAutocollapse",
575
+ "name": "no-autocollapse",
576
576
  "type": {
577
577
  "text": "boolean"
578
578
  },
@@ -860,14 +860,14 @@
860
860
  "description": "Dunning mode only — ISO 4217 currency code driving the `Intl.NumberFormat` style=\"currency\" rendering. Defaults to `USD`."
861
861
  },
862
862
  {
863
- "name": "dueAt",
863
+ "name": "due-at",
864
864
  "type": {
865
865
  "text": "string"
866
866
  },
867
867
  "description": "Dunning mode only — ISO 8601 due / failed-at timestamp. Formatted via `Intl.DateTimeFormat`. Ignored when [pattern] is not `dunning`. Attribute spelling: `due-at`."
868
868
  },
869
869
  {
870
- "name": "cardLast4",
870
+ "name": "card-last4",
871
871
  "type": {
872
872
  "text": "string"
873
873
  },
@@ -884,7 +884,7 @@
884
884
  "slots": [
885
885
  {
886
886
  "name": "content",
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."
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#507): semantic `<header>` (title), `<section>` (body), and `<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."
888
888
  },
889
889
  {
890
890
  "name": "leading",
@@ -938,7 +938,7 @@
938
938
  "declarations": [
939
939
  {
940
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.",
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#494's 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
942
  "name": "UIAnchorBar",
943
943
  "tagName": "anchor-bar-ui",
944
944
  "superclass": {
@@ -1134,7 +1134,7 @@
1134
1134
  "declarations": [
1135
1135
  {
1136
1136
  "kind": "class",
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",
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#866): badge and tag share 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#866); case + tracking + mono carry 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#864); tag is interactive/removable, muted/tinted by default for family variants (gh#864), solid by default for the family-less variant (gh#794, unaffected by gh#864).",
1138
1138
  "name": "UIBadge",
1139
1139
  "tagName": "badge-ui",
1140
1140
  "superclass": {
@@ -1192,7 +1192,7 @@
1192
1192
  "text": "string"
1193
1193
  },
1194
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)."
1195
+ "description": "Fill style — orthogonal to [variant]. Badge defaults to `solid` (gh#864 — badge and tag were swapped relative to their reported 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#874). - `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#873) — it renders the stronger `neutral-low` fill, while `<tag-ui>`'s family-less muted stays on the lighter `--a-bg-muted` pair (gh#778 dense-list rationale). - `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#864 — different role as filter / autocomplete chip)."
1196
1196
  }
1197
1197
  ]
1198
1198
  }
@@ -1328,7 +1328,7 @@
1328
1328
  "description": "Collapse middle crumbs into a `…` overflow popover when there are 4+ items."
1329
1329
  },
1330
1330
  {
1331
- "name": "collapseKeepLeading",
1331
+ "name": "collapse-keep-leading",
1332
1332
  "type": {
1333
1333
  "text": "number"
1334
1334
  },
@@ -1336,7 +1336,7 @@
1336
1336
  "description": "Number of leading items to keep visible when [collapse] is active. The first item (often a home/icon link) sits before the overflow popover."
1337
1337
  },
1338
1338
  {
1339
- "name": "collapseKeepTrailing",
1339
+ "name": "collapse-keep-trailing",
1340
1340
  "type": {
1341
1341
  "text": "number"
1342
1342
  },
@@ -1549,14 +1549,14 @@
1549
1549
  "description": "Blocks selection but allows month navigation."
1550
1550
  },
1551
1551
  {
1552
- "name": "rangeStart",
1552
+ "name": "range-start",
1553
1553
  "type": {
1554
1554
  "text": "string"
1555
1555
  },
1556
1556
  "description": "Start of a date range (ISO YYYY-MM-DD). When both rangeStart and rangeEnd are set + ordered, day cells strictly between the endpoints get `[data-in-range]` stamped for visual continuity. Used by `<date-range-picker-ui>` which pushes the same from/to onto both calendar panes. Endpoints themselves render via the `value` prop's `[data-selected]` state."
1557
1557
  },
1558
1558
  {
1559
- "name": "rangeEnd",
1559
+ "name": "range-end",
1560
1560
  "type": {
1561
1561
  "text": "string"
1562
1562
  },
@@ -1930,7 +1930,7 @@
1930
1930
  "description": "When set, rows are non-interactive <span>s (no click, no toggle)."
1931
1931
  },
1932
1932
  {
1933
- "name": "onToggle",
1933
+ "name": "on-toggle",
1934
1934
  "type": {
1935
1935
  "text": "string"
1936
1936
  },
@@ -2004,7 +2004,7 @@
2004
2004
  "description": "Color scheme"
2005
2005
  },
2006
2006
  {
2007
- "name": "hideAverage",
2007
+ "name": "hide-average",
2008
2008
  "type": {
2009
2009
  "text": "boolean"
2010
2010
  },
@@ -2012,7 +2012,7 @@
2012
2012
  "description": "When true, suppress the overlaid average line"
2013
2013
  },
2014
2014
  {
2015
- "name": "hideGrid",
2015
+ "name": "hide-grid",
2016
2016
  "type": {
2017
2017
  "text": "boolean"
2018
2018
  },
@@ -2020,7 +2020,7 @@
2020
2020
  "description": "Hide gridlines"
2021
2021
  },
2022
2022
  {
2023
- "name": "hideValues",
2023
+ "name": "hide-values",
2024
2024
  "type": {
2025
2025
  "text": "boolean"
2026
2026
  },
@@ -2056,14 +2056,14 @@
2056
2056
  "text": "string"
2057
2057
  },
2058
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."
2059
+ "description": "Marker (dot) visibility for line and multi-line series. `all` draws a circle[data-dot] on every datum (default — matches pre-gh#561 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
2060
  },
2061
2061
  {
2062
- "name": "seriesEmphasis",
2062
+ "name": "series-emphasis",
2063
2063
  "type": {
2064
2064
  "text": "string"
2065
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"
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#561 behavior."
2067
2067
  },
2068
2068
  {
2069
2069
  "name": "loading",
@@ -2362,12 +2362,12 @@
2362
2362
  "description": "Label text beside the checkbox"
2363
2363
  },
2364
2364
  {
2365
- "name": "labelHidden",
2365
+ "name": "label-hidden",
2366
2366
  "type": {
2367
2367
  "text": "boolean"
2368
2368
  },
2369
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."
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#1010). Use when a sibling element already shows the same name 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
2371
  },
2372
2372
  {
2373
2373
  "name": "value",
@@ -2439,7 +2439,7 @@
2439
2439
  "description": "Language hint for syntax highlighting"
2440
2440
  },
2441
2441
  {
2442
- "name": "lineNumbers",
2442
+ "name": "line-numbers",
2443
2443
  "type": {
2444
2444
  "text": "boolean"
2445
2445
  },
@@ -2665,7 +2665,7 @@
2665
2665
  "text": "string"
2666
2666
  },
2667
2667
  "default": "hex",
2668
- "description": "Output format for the value property + event detail. Hex (`"
2668
+ "description": "Output format for the value property + event detail. Hex (`#rrggbb`) or OKLCH (`oklch(L C H)`)."
2669
2669
  },
2670
2670
  {
2671
2671
  "name": "disabled",
@@ -3184,6 +3184,10 @@
3184
3184
  "name": "footer",
3185
3185
  "description": "Keyboard hint bar"
3186
3186
  },
3187
+ {
3188
+ "name": "input",
3189
+ "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."
3190
+ },
3187
3191
  {
3188
3192
  "name": "list",
3189
3193
  "description": "Container for command items and groups"
@@ -3327,7 +3331,7 @@
3327
3331
  "description": "Selected range as `{from, to}` ISO 8601 dates. Null when empty. Emitted on commit."
3328
3332
  },
3329
3333
  {
3330
- "name": "compareValue",
3334
+ "name": "compare-value",
3331
3335
  "type": {
3332
3336
  "text": "string"
3333
3337
  },
@@ -3404,7 +3408,7 @@
3404
3408
  "description": "Trigger button date format. `short`: `Jan 1, 2026`; `long`: `January 1, 2026`; `iso`: `2026-01-01`."
3405
3409
  },
3406
3410
  {
3407
- "name": "noPresets",
3411
+ "name": "no-presets",
3408
3412
  "type": {
3409
3413
  "text": "boolean"
3410
3414
  },
@@ -3543,7 +3547,7 @@
3543
3547
  "description": "Time-pane precision. `minute` (default) emits `HH:mm`; `second` exposes the seconds segment and emits `HH:mm:ss`."
3544
3548
  },
3545
3549
  {
3546
- "name": "hourcycle",
3550
+ "name": "hour-cycle",
3547
3551
  "type": {
3548
3552
  "text": "string"
3549
3553
  },
@@ -3688,7 +3692,7 @@
3688
3692
  },
3689
3693
  "attributes": [
3690
3694
  {
3691
- "name": "labelOn",
3695
+ "name": "label-on",
3692
3696
  "type": {
3693
3697
  "text": "string"
3694
3698
  },
@@ -3696,7 +3700,7 @@
3696
3700
  "description": "Header label rendered when state is \"on\"."
3697
3701
  },
3698
3702
  {
3699
- "name": "labelOff",
3703
+ "name": "label-off",
3700
3704
  "type": {
3701
3705
  "text": "string"
3702
3706
  },
@@ -4065,6 +4069,147 @@
4065
4069
  }
4066
4070
  ]
4067
4071
  },
4072
+ {
4073
+ "kind": "javascript-module",
4074
+ "path": "components/drilldown/drilldown.js",
4075
+ "declarations": [
4076
+ {
4077
+ "kind": "class",
4078
+ "description": "Single-panel, multi-level drill-in menu. One list panel slides between levels (a level header with back navigation replaces stacking a column per level) — for hierarchical data where miller columns don't fit the viewport (>2 levels, >12 top-level entries, or narrow layouts). Rows compose a leading dot/icon, primary label, optional meta line, and trailing row-native count chips (not full <badge-ui>, which reads oversized at row density) — plus a drill-in chevron on branch items. Set `.items` to a tree of `{value, label, meta?, dot?, counts?, children?}` nodes; `children` may be an array (sync) or a function returning an array/Promise (lazy, fetched on drill-in — a loading level is shown via <skeleton-ui> while it resolves). Distinct from <tree-ui> (inline expand/collapse — right for file-tree shapes, wrong for wide/deep data where the expanded tree becomes a wall of rows), <nav-ui> (flat app navigation, not hierarchical drill-in), and <context-menu> (transient popover submenus, not a persistent content panel).",
4079
+ "name": "UIDrilldown",
4080
+ "tagName": "drilldown-ui",
4081
+ "superclass": {
4082
+ "name": "UIElement",
4083
+ "module": "/core/element.js"
4084
+ },
4085
+ "attributes": [
4086
+ {
4087
+ "name": "items",
4088
+ "type": {
4089
+ "text": "array"
4090
+ },
4091
+ "default": "[]",
4092
+ "description": "Root-level array of node objects: {value, label, meta?, dot?, counts?, children?, leaf?}. `value` is the stable id used in `path` and event details. `dot` names a semantic tone (info, success, warning, danger, primary, neutral) rendered as a small leading color swatch. `counts` is an array of {variant?, value} rendered as compact trailing chips. `children` is either an array of child nodes (resolved synchronously) or a function `(item) => array | Promise<array>` for lazy per-level fetch — a loading level renders while the promise is pending. `leaf: true` forces no drill chevron even when `children` is present (rare — normally omit `children` instead)."
4093
+ },
4094
+ {
4095
+ "name": "path",
4096
+ "type": {
4097
+ "text": "array"
4098
+ },
4099
+ "default": "[]",
4100
+ "description": "Current drilled-in level, as an array of ancestor item `value`s (root = `[]`). Setting `.path` restores directly to that nested level without animating through every intermediate level — the deep-link/URL-restore path. Hand-managed (not the generic `reflect:` mechanism, which can't JSON-encode arrays) — it still genuinely reflects to a JSON-encoded `path` attribute both ways (property → attribute and attribute → property), unlike most array props on this kit."
4101
+ },
4102
+ {
4103
+ "name": "rootLabel",
4104
+ "type": {
4105
+ "text": "string"
4106
+ },
4107
+ "description": "Level-header title shown at the root level (depth 0). Empty by default (no title row)."
4108
+ },
4109
+ {
4110
+ "name": "filterable",
4111
+ "type": {
4112
+ "text": "boolean"
4113
+ },
4114
+ "default": "false",
4115
+ "description": "Show a filter input pinned above the list, filtering the current level's rows by label/meta."
4116
+ },
4117
+ {
4118
+ "name": "placeholder",
4119
+ "type": {
4120
+ "text": "string"
4121
+ },
4122
+ "default": "Filter…",
4123
+ "description": "Placeholder text for the filter input (only rendered when `[filterable]`)."
4124
+ },
4125
+ {
4126
+ "name": "select-on-drill",
4127
+ "type": {
4128
+ "text": "boolean"
4129
+ },
4130
+ "default": "false",
4131
+ "description": "When true, clicking/activating a branch item (one with children) BOTH fires `select` and drills into it — the Schema Manager shape, where picking a namespace is both a selection and a navigation. Default false: branch activation only drills in; only leaf activation fires `select`."
4132
+ },
4133
+ {
4134
+ "name": "static",
4135
+ "type": {
4136
+ "text": "boolean"
4137
+ },
4138
+ "default": "false",
4139
+ "description": "Suppress the horizontal slide transition between levels — instant swap. Also honored automatically under `prefers-reduced-motion: reduce`."
4140
+ }
4141
+ ],
4142
+ "slots": [
4143
+ {
4144
+ "name": "breadcrumb",
4145
+ "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."
4146
+ },
4147
+ {
4148
+ "name": "header",
4149
+ "description": "Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable."
4150
+ },
4151
+ {
4152
+ "name": "back",
4153
+ "description": "Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level."
4154
+ },
4155
+ {
4156
+ "name": "title",
4157
+ "description": "Auto-stamped title cluster (current-level label + item count) inside the header."
4158
+ },
4159
+ {
4160
+ "name": "filter",
4161
+ "description": "Auto-stamped filter-input row, shown only when `[filterable]` is set."
4162
+ },
4163
+ {
4164
+ "name": "viewport",
4165
+ "description": "Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip)."
4166
+ },
4167
+ {
4168
+ "name": "dot",
4169
+ "description": "Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone."
4170
+ },
4171
+ {
4172
+ "name": "main",
4173
+ "description": "Auto-stamped per-row content column (label + optional meta line)."
4174
+ },
4175
+ {
4176
+ "name": "meta",
4177
+ "description": "Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta`."
4178
+ },
4179
+ {
4180
+ "name": "counts",
4181
+ "description": "Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts`."
4182
+ }
4183
+ ],
4184
+ "events": [
4185
+ {
4186
+ "name": "select",
4187
+ "type": {
4188
+ "text": "CustomEvent"
4189
+ },
4190
+ "description": "Fired when a leaf item is activated (click/Enter), or when a branch item is activated with `[select-on-drill]` set. detail: { path, item }. `path` is the drilled-in level the item lives at (the current `.path` at the time of activation); `item` is the raw node object."
4191
+ },
4192
+ {
4193
+ "name": "navigate",
4194
+ "type": {
4195
+ "text": "CustomEvent"
4196
+ },
4197
+ "description": "Fired whenever the shown level changes — drill-in, back, breadcrumb jump, or a programmatic `.path` assignment. detail: { path }. Hosts mirror this to the URL instead of listening to `select`."
4198
+ }
4199
+ ]
4200
+ }
4201
+ ],
4202
+ "exports": [
4203
+ {
4204
+ "kind": "custom-element-definition",
4205
+ "name": "drilldown-ui",
4206
+ "declaration": {
4207
+ "name": "UIDrilldown",
4208
+ "module": "./components/drilldown/drilldown.js"
4209
+ }
4210
+ }
4211
+ ]
4212
+ },
4068
4213
  {
4069
4214
  "kind": "javascript-module",
4070
4215
  "path": "components/embed/embed.js",
@@ -4253,7 +4398,7 @@
4253
4398
  "text": "string"
4254
4399
  },
4255
4400
  "default": "default",
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."
4401
+ "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#1104) now that feed-item-ui is the real paint site for posted toasts."
4257
4402
  },
4258
4403
  {
4259
4404
  "name": "duration",
@@ -4553,7 +4698,7 @@
4553
4698
  "description": "Block-axis alignment of grid items (start/center/end/stretch) via align-items — e.g. vertically centering a text column against a visual in a 2-column hero. Sets grid-item alignment, NOT text alignment."
4554
4699
  },
4555
4700
  {
4556
- "name": "columnGap",
4701
+ "name": "column-gap",
4557
4702
  "type": {
4558
4703
  "text": "string"
4559
4704
  },
@@ -4584,14 +4729,14 @@
4584
4729
  "description": "Inline-axis alignment of grid items (start/center/end/stretch) via justify-items. Default stretch (items fill their column track)."
4585
4730
  },
4586
4731
  {
4587
- "name": "minColumnWidth",
4732
+ "name": "min-column-width",
4588
4733
  "type": {
4589
4734
  "text": "string"
4590
4735
  },
4591
4736
  "description": "Minimum track width for columns=\"auto-fit\"/\"auto-fill\" (any CSS length, e.g. \"240px\", \"16rem\"). Sets the minmax() floor so cards don't shrink below it before wrapping; unset uses the 12rem default. No effect on numeric columns."
4592
4737
  },
4593
4738
  {
4594
- "name": "rowGap",
4739
+ "name": "row-gap",
4595
4740
  "type": {
4596
4741
  "text": "string"
4597
4742
  },
@@ -4648,7 +4793,7 @@
4648
4793
  "description": "Aspect ratio"
4649
4794
  },
4650
4795
  {
4651
- "name": "colorScheme",
4796
+ "name": "color-scheme",
4652
4797
  "type": {
4653
4798
  "text": "string"
4654
4799
  },
@@ -4664,7 +4809,7 @@
4664
4809
  "description": "Column count"
4665
4810
  },
4666
4811
  {
4667
- "name": "noLegend",
4812
+ "name": "no-legend",
4668
4813
  "type": {
4669
4814
  "text": "boolean"
4670
4815
  },
@@ -4688,7 +4833,7 @@
4688
4833
  "description": "Value-to-bucket scale"
4689
4834
  },
4690
4835
  {
4691
- "name": "startDate",
4836
+ "name": "start-date",
4692
4837
  "type": {
4693
4838
  "text": "string"
4694
4839
  },
@@ -5517,7 +5662,7 @@
5517
5662
  "declarations": [
5518
5663
  {
5519
5664
  "kind": "class",
5520
- "description": "Inline navigation primitive — semantic `<a href>` wrapper. Use for cross-page navigation, footer / Terms-of-Service / Privacy-Policy inline references, \"Sign in\" / \"Sign up\" cross-page links, and any affordance whose purpose is to take the user somewhere (not to perform an action). Sibling of `<button-ui>` — they have separate semantics and must not be substituted for each other: | Affordance | Use | |---------------------------|----------------| | Submit form | `<button-ui>` | | Trigger action / modal | `<button-ui>` | | Copy to clipboard | `<button-ui>` | | Open modal / drawer | `<button-ui>` | | Navigate to another page | `<link-ui>` | | Open external URL | `<link-ui>` | | Anchor jump ( | Inline reference in prose | `<link-ui>` | Renders `<a href=\"…\">` internally so middle-click open-in-new-tab, right-click context menu, hover URL preview, search-engine crawlability, and bookmark-ability all work without any custom wiring. ARIA role is \"link\" (set automatically by `<a>` element).",
5665
+ "description": "Inline navigation primitive — semantic `<a href>` wrapper. Use for cross-page navigation, footer / Terms-of-Service / Privacy-Policy inline references, \"Sign in\" / \"Sign up\" cross-page links, and any affordance whose purpose is to take the user somewhere (not to perform an action). Sibling of `<button-ui>` — they have separate semantics and must not be substituted for each other: | Affordance | Use | |---------------------------|----------------| | Submit form | `<button-ui>` | | Trigger action / modal | `<button-ui>` | | Copy to clipboard | `<button-ui>` | | Open modal / drawer | `<button-ui>` | | Navigate to another page | `<link-ui>` | | Open external URL | `<link-ui>` | | Anchor jump (#section) | `<link-ui>` | | Inline reference in prose | `<link-ui>` | Renders `<a href=\"…\">` internally so middle-click open-in-new-tab, right-click context menu, hover URL preview, search-engine crawlability, and bookmark-ability all work without any custom wiring. ARIA role is \"link\" (set automatically by `<a>` element).",
5521
5666
  "name": "UILink",
5522
5667
  "tagName": "link-ui",
5523
5668
  "superclass": {
@@ -5636,7 +5781,7 @@
5636
5781
  "description": "The items to virtualize. Required for prop-driven authoring; ignored when data-stream-src is set."
5637
5782
  },
5638
5783
  {
5639
- "name": "itemSize",
5784
+ "name": "item-size",
5640
5785
  "type": {
5641
5786
  "text": "number"
5642
5787
  },
@@ -5644,7 +5789,7 @@
5644
5789
  "description": "Fixed item height in pixels. When > 0, uses the constant-time fast path (avoids per-row measurement)."
5645
5790
  },
5646
5791
  {
5647
- "name": "itemSizeRem",
5792
+ "name": "item-size-rem",
5648
5793
  "type": {
5649
5794
  "text": "number"
5650
5795
  },
@@ -5652,7 +5797,7 @@
5652
5797
  "description": "Fixed item height in rem. Useful for typographic-scale rows that should track the body type."
5653
5798
  },
5654
5799
  {
5655
- "name": "estimatedSize",
5800
+ "name": "estimated-size",
5656
5801
  "type": {
5657
5802
  "text": "number"
5658
5803
  },
@@ -5676,7 +5821,7 @@
5676
5821
  "description": "Scroll axis — vertical (default) or horizontal carousel."
5677
5822
  },
5678
5823
  {
5679
- "name": "pinBottom",
5824
+ "name": "pin-bottom",
5680
5825
  "type": {
5681
5826
  "text": "boolean"
5682
5827
  },
@@ -5684,7 +5829,7 @@
5684
5829
  "description": "When appending items, keep scroll pinned to the bottom (chat-thread / log-tail pattern)."
5685
5830
  },
5686
5831
  {
5687
- "name": "startIndex",
5832
+ "name": "start-index",
5688
5833
  "type": {
5689
5834
  "text": "number"
5690
5835
  },
@@ -5811,7 +5956,7 @@
5811
5956
  "slots": [
5812
5957
  {
5813
5958
  "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"
5959
+ "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#653; the element source always supported it."
5815
5960
  },
5816
5961
  {
5817
5962
  "name": "content",
@@ -5866,7 +6011,7 @@
5866
6011
  "description": "Enable selection on child listitems (roving tabindex + aria-selected)."
5867
6012
  },
5868
6013
  {
5869
- "name": "selectedKey",
6014
+ "name": "selected-key",
5870
6015
  "type": {
5871
6016
  "text": "string"
5872
6017
  },
@@ -6554,6 +6699,14 @@
6554
6699
  "text": "string"
6555
6700
  },
6556
6701
  "description": "Optional kicker label. Section variant renders it via ::before; primary uses it as aria-label only."
6702
+ },
6703
+ {
6704
+ "name": "multi-expand",
6705
+ "type": {
6706
+ "text": "boolean"
6707
+ },
6708
+ "default": "false",
6709
+ "description": "Opt out of the default single-expanded-group behavior. When unset, selecting a nav-item-ui collapses every nav-group-ui except the one containing the newly selected item (all, when the selection is ungrouped); manual multi-expansion still works up until the next selection."
6557
6710
  }
6558
6711
  ],
6559
6712
  "slots": [
@@ -6638,7 +6791,7 @@
6638
6791
  "description": "Port indicator dot size in pixels"
6639
6792
  },
6640
6793
  {
6641
- "name": "portSize",
6794
+ "name": "port-size",
6642
6795
  "type": {
6643
6796
  "text": "number"
6644
6797
  },
@@ -6662,7 +6815,7 @@
6662
6815
  "description": "Show port indicator dots. Defaults to true when editable"
6663
6816
  },
6664
6817
  {
6665
- "name": "showPorts",
6818
+ "name": "show-ports",
6666
6819
  "type": {
6667
6820
  "text": "boolean"
6668
6821
  },
@@ -6678,7 +6831,7 @@
6678
6831
  "description": "Stroke width in pixels"
6679
6832
  },
6680
6833
  {
6681
- "name": "strokeWidth",
6834
+ "name": "stroke-width",
6682
6835
  "type": {
6683
6836
  "text": "number"
6684
6837
  },
@@ -6753,7 +6906,7 @@
6753
6906
  "description": "The numeric value to format. Empty string or non-numeric value renders nothing."
6754
6907
  },
6755
6908
  {
6756
- "name": "numberStyle",
6909
+ "name": "number-style",
6757
6910
  "type": {
6758
6911
  "text": "string"
6759
6912
  },
@@ -6783,7 +6936,7 @@
6783
6936
  "description": "`Intl.NumberFormat` `notation` option. `standard` is the thousands-grouped form (1,234,567); `compact` is the abbreviated form (1.2M); `scientific` and `engineering` are the exponent forms. Defaults to `standard`."
6784
6937
  },
6785
6938
  {
6786
- "name": "compactDisplay",
6939
+ "name": "compact-display",
6787
6940
  "type": {
6788
6941
  "text": "string"
6789
6942
  },
@@ -6791,7 +6944,7 @@
6791
6944
  "description": "When [notation=\"compact\"], controls the compact-form length. `short` = \"1.2M\" (default); `long` = \"1.2 million\"."
6792
6945
  },
6793
6946
  {
6794
- "name": "minimumFractionDigits",
6947
+ "name": "minimum-fraction-digits",
6795
6948
  "type": {
6796
6949
  "text": "number"
6797
6950
  },
@@ -6799,7 +6952,7 @@
6799
6952
  "description": "Minimum fractional digits (0–20). Padded with trailing zeros. Useful for currency display to force \".00\" suffix."
6800
6953
  },
6801
6954
  {
6802
- "name": "maximumFractionDigits",
6955
+ "name": "maximum-fraction-digits",
6803
6956
  "type": {
6804
6957
  "text": "number"
6805
6958
  },
@@ -6814,7 +6967,7 @@
6814
6967
  "description": "BCP-47 locale tag for the formatter. Empty defaults to the document locale (`<html lang>`) then to browser default."
6815
6968
  },
6816
6969
  {
6817
- "name": "signDisplay",
6970
+ "name": "sign-display",
6818
6971
  "type": {
6819
6972
  "text": "string"
6820
6973
  },
@@ -7071,7 +7224,7 @@
7071
7224
  "description": "Sets the page as a scroll container. `overflow-y: auto`, full height, contained overscroll. Use when the page IS the scroll surface (standalone pages); leave off when nested inside a parent that already manages scroll (e.g. inside an `<admin-shell>`'s main `<section>`)."
7072
7225
  },
7073
7226
  {
7074
- "name": "maxWidth",
7227
+ "name": "max-width",
7075
7228
  "type": {
7076
7229
  "text": "string"
7077
7230
  },
@@ -7085,7 +7238,7 @@
7085
7238
  "description": "Page-padding scale from the spacing system. Accepts `0`–`8` (mapped to `--a-space-N`). Empty (no value) applies the `--page-padding` token; `0` removes padding."
7086
7239
  },
7087
7240
  {
7088
- "name": "stickyHeader",
7241
+ "name": "sticky-header",
7089
7242
  "type": {
7090
7243
  "text": "boolean"
7091
7244
  },
@@ -7096,7 +7249,23 @@
7096
7249
  "slots": [
7097
7250
  {
7098
7251
  "name": "default",
7099
- "description": "Composes from the slot primitives — `<header-ui>` (page header), `<section-ui>` (main content), optional `<footer-ui>`. Native `<header>` / `<section>` / `<footer>` also work; the @scope rules target both via `:where(header, header-ui)`."
7252
+ "description": "Composes from the slot primitives — `<header-ui>` (page header), `<section-ui>` (main content), optional `<footer-ui>`. Native `<header>` / `<section>` / `<footer>` also work; the @scope rules target both via `:where(header, header-ui)`. The page header also activates the named slot-gated grid (`slot=\"icon\"` / `slot=\"heading\"` / `slot=\"description\"` / `slot=\"action\"`) once any DIRECT header child carries a `slot` attribute — same contract as `<card-ui>`'s header (gh#1253)."
7253
+ },
7254
+ {
7255
+ "name": "icon",
7256
+ "description": "Leading icon for the page header — status, brand, or type marker. Placed in column 1 of the header grid when present; heading + description shift to column 2. Direct child of `<header>` / `<header-ui>` only, per the :has(> [slot=\"icon\"]) gate."
7257
+ },
7258
+ {
7259
+ "name": "heading",
7260
+ "description": "Primary title — grid row 1 inside the page header. Also accepts bare `<h1>`–`<h6>` tags (or A2UI's transpiled display/title/heading/subsection `<text-ui>` variants) as direct children without slot=\"heading\". A slot=\"heading\" wrapper can contain inline badges or metadata alongside the title text."
7261
+ },
7262
+ {
7263
+ "name": "description",
7264
+ "description": "Secondary metadata — grid row 2 beneath the heading inside the page header. Also accepts bare `<p>` / `<small>` / body-variant `<text-ui>` as direct children without slot=\"description\"."
7265
+ },
7266
+ {
7267
+ "name": "action",
7268
+ "description": "Trailing control cluster inside the page header (icon-buttons, menu trigger, scheme toggle, more-options). Aligns to the flex-end edge — the fix for gh#1253's dropped `<toggle-scheme-ui>`."
7100
7269
  }
7101
7270
  ]
7102
7271
  }
@@ -7212,7 +7381,7 @@
7212
7381
  "description": "Component property: collapsed."
7213
7382
  },
7214
7383
  {
7215
- "name": "maxWidth",
7384
+ "name": "max-width",
7216
7385
  "type": {
7217
7386
  "text": "number"
7218
7387
  },
@@ -7220,7 +7389,7 @@
7220
7389
  "description": "Component property: maxWidth."
7221
7390
  },
7222
7391
  {
7223
- "name": "minWidth",
7392
+ "name": "min-width",
7224
7393
  "type": {
7225
7394
  "text": "number"
7226
7395
  },
@@ -7297,7 +7466,7 @@
7297
7466
  "description": "The password string to score. JS-property only — NOT reflected to a DOM attribute (so the password never leaks into rendered HTML). Wire to an input via `input.addEventListener('input', e => meter.value = e.target.value)`."
7298
7467
  },
7299
7468
  {
7300
- "name": "minScore",
7469
+ "name": "min-score",
7301
7470
  "type": {
7302
7471
  "text": "number"
7303
7472
  },
@@ -7305,7 +7474,7 @@
7305
7474
  "description": "Minimum acceptable score (0–3). The `score-change` event's `detail.satisfied` boolean reflects whether the current score meets this threshold. Useful for gating a submit button."
7306
7475
  },
7307
7476
  {
7308
- "name": "showLabel",
7477
+ "name": "show-label",
7309
7478
  "type": {
7310
7479
  "text": "boolean"
7311
7480
  },
@@ -7497,7 +7666,7 @@
7497
7666
  "description": "Pane arrangement. Defaults to `split` — render and code side-by-side in a responsive 2-column grid that collapses to stacked on narrow widths (a bare `<preview-ui>` stamps `layout=\"split\"` on connect). Use `stack` to force the render stacked above the code; the docs auto-apply `stack` to wide self-framing demos (card / shell / table) that read cramped at half width. The `rows` attribute is a separate gallery mode and overrides this."
7498
7667
  },
7499
7668
  {
7500
- "name": "codeFirst",
7669
+ "name": "code-first",
7501
7670
  "type": {
7502
7671
  "text": "boolean"
7503
7672
  },
@@ -7699,7 +7868,7 @@
7699
7868
  "description": "Host display size in CSS pixels (width and height; the SVG is always square). Default 200. Internal cell size is computed from this divided by `matrix-size + 2·margin`."
7700
7869
  },
7701
7870
  {
7702
- "name": "errorCorrection",
7871
+ "name": "error-correction",
7703
7872
  "type": {
7704
7873
  "text": "string"
7705
7874
  },
@@ -7719,14 +7888,14 @@
7719
7888
  "type": {
7720
7889
  "text": "string"
7721
7890
  },
7722
- "description": "Foreground (dark-cell) color. Any CSS color string (hex, rgb, token reference). **Empty defaults to ` for guaranteed scanability** (theme-aware `currentColor` would produce light-on-dark in dark mode, which most phone scanners refuse to decode). Override for branded QRs only when you've verified the chosen color/background pair scans on the target devices."
7891
+ "description": "Foreground (dark-cell) color. Any CSS color string (hex, rgb, token reference). **Empty defaults to `#000000` — hardcoded black for guaranteed scanability** (theme-aware `currentColor` would produce light-on-dark in dark mode, which most phone scanners refuse to decode). Override for branded QRs only when you've verified the chosen color/background pair scans on the target devices."
7723
7892
  },
7724
7893
  {
7725
7894
  "name": "background",
7726
7895
  "type": {
7727
7896
  "text": "string"
7728
7897
  },
7729
- "description": "Background (light-cell) color. **Empty defaults to ` hardcoded white** alongside the black foreground, for guaranteed scanability. Override only when paired with an explicit [color] (the contrast pair must scan)."
7898
+ "description": "Background (light-cell) color. **Empty defaults to `#ffffff` hardcoded white** alongside the black foreground, for guaranteed scanability. Override only when paired with an explicit [color] (the contrast pair must scan)."
7730
7899
  },
7731
7900
  {
7732
7901
  "name": "label",
@@ -7756,7 +7925,7 @@
7756
7925
  "declarations": [
7757
7926
  {
7758
7927
  "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.",
7928
+ "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#729). Use this wherever a question/prompt introduces a set of 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
7929
  "name": "UIRadioGroup",
7761
7930
  "tagName": "radio-group-ui",
7762
7931
  "superclass": {
@@ -8059,7 +8228,7 @@
8059
8228
  "description": "Form participation — field name when submitted"
8060
8229
  },
8061
8230
  {
8062
- "name": "allowHalf",
8231
+ "name": "allow-half",
8063
8232
  "type": {
8064
8233
  "text": "boolean"
8065
8234
  },
@@ -8149,7 +8318,7 @@
8149
8318
  "description": "ISO 8601 timestamp (e.g. `2026-05-25T09:30:00Z`) or any string parseable by `Date`. Required for output — empty value renders nothing."
8150
8319
  },
8151
8320
  {
8152
- "name": "timeStyle",
8321
+ "name": "time-style",
8153
8322
  "type": {
8154
8323
  "text": "string"
8155
8324
  },
@@ -8172,7 +8341,7 @@
8172
8341
  "description": "BCP-47 locale tag for the formatter. Empty defaults to the document locale (`<html lang>`) then to the browser default."
8173
8342
  },
8174
8343
  {
8175
- "name": "updateInterval",
8344
+ "name": "update-interval",
8176
8345
  "type": {
8177
8346
  "text": "number"
8178
8347
  },
@@ -8312,7 +8481,7 @@
8312
8481
  "description": "Enable flex-wrap unconditionally. For viewport-responsive wrapping use [wrap-at] instead."
8313
8482
  },
8314
8483
  {
8315
- "name": "wrapAt",
8484
+ "name": "wrap-at",
8316
8485
  "type": {
8317
8486
  "text": "string"
8318
8487
  },
@@ -8529,7 +8698,7 @@
8529
8698
  "description": "Value of the currently selected segment."
8530
8699
  },
8531
8700
  {
8532
- "name": "allowEmpty",
8701
+ "name": "allow-empty",
8533
8702
  "type": {
8534
8703
  "text": "boolean"
8535
8704
  },
@@ -8651,7 +8820,7 @@
8651
8820
  "text": "boolean"
8652
8821
  },
8653
8822
  "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"
8823
+ "description": "Suppress the single-select radio indicator on option rows (gh#498). 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#498 reopen: per-instance opt-outs proved forgettable)."
8655
8824
  },
8656
8825
  {
8657
8826
  "name": "error",
@@ -8727,7 +8896,7 @@
8727
8896
  "text": "string"
8728
8897
  },
8729
8898
  "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."
8899
+ "description": "Multi-select only (gh#442). Replaces the chip trigger with one 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
8900
  },
8732
8901
  {
8733
8902
  "name": "min",
@@ -8929,7 +9098,7 @@
8929
9098
  "declarations": [
8930
9099
  {
8931
9100
  "kind": "class",
8932
- "description": "Accessibility utility — visually-hidden link that becomes visible on keyboard focus, letting keyboard users skip past repetitive navigation to the main content. WCAG 2.1 Success Criterion 2.4.1 \"Bypass Blocks\". Place as the FIRST focusable element on the page (typically inside `<body>` before any nav / shell chrome). Target an `id` on your main content region (commonly `",
9101
+ "description": "Accessibility utility — visually-hidden link that becomes visible on keyboard focus, letting keyboard users skip past repetitive navigation to the main content. WCAG 2.1 Success Criterion 2.4.1 \"Bypass Blocks\". Place as the FIRST focusable element on the page (typically inside `<body>` before any nav / shell chrome). Target an `id` on your main content region (commonly `#main` / `#main-content`).",
8933
9102
  "name": "UISkipNav",
8934
9103
  "tagName": "skip-nav-ui",
8935
9104
  "superclass": {
@@ -9066,7 +9235,7 @@
9066
9235
  "description": "Two-thumb range slider mode. When enabled, [lower-value] and [upper-value] are authoritative and [value] is ignored. The fill renders between the two thumbs (not from left to thumb). Form-data under [name] serializes as \"<lower>,<upper>\". Use for price filters, date ranges, audio range gates, etc."
9067
9236
  },
9068
9237
  {
9069
- "name": "lowerValue",
9238
+ "name": "lower-value",
9070
9239
  "type": {
9071
9240
  "text": "number"
9072
9241
  },
@@ -9074,7 +9243,7 @@
9074
9243
  "description": "Lower thumb value (dual mode only; clamped to ≤ [upper-value])."
9075
9244
  },
9076
9245
  {
9077
- "name": "upperValue",
9246
+ "name": "upper-value",
9078
9247
  "type": {
9079
9248
  "text": "number"
9080
9249
  },
@@ -9523,7 +9692,7 @@
9523
9692
  "text": "boolean"
9524
9693
  },
9525
9694
  "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"
9695
+ "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#711 S1)."
9527
9696
  }
9528
9697
  ],
9529
9698
  "slots": [
@@ -9538,7 +9707,7 @@
9538
9707
  "type": {
9539
9708
  "text": "CustomEvent"
9540
9709
  },
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"
9710
+ "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#711 S1 review)."
9542
9711
  },
9543
9712
  {
9544
9713
  "name": "change",
@@ -9748,7 +9917,7 @@
9748
9917
  "description": "When set, computes the swatch color's OKLab L and switches the label / detail color between light + dark so it remains legible against the tile background. Active when `label-position=\"overlay\"` (where the label sits ON the tile). Uses a 1px canvas probe to handle any CSS color form (oklch / hex / hsl / named / var() references)."
9749
9918
  },
9750
9919
  {
9751
- "name": "labelPosition",
9920
+ "name": "label-position",
9752
9921
  "type": {
9753
9922
  "text": "string"
9754
9923
  },
@@ -9811,7 +9980,7 @@
9811
9980
  "description": "Enable auto-advance"
9812
9981
  },
9813
9982
  {
9814
- "name": "slidesPerView",
9983
+ "name": "slides-per-view",
9815
9984
  "type": {
9816
9985
  "text": "string"
9817
9986
  },
@@ -9849,7 +10018,7 @@
9849
10018
  "description": "Infinite loop"
9850
10019
  },
9851
10020
  {
9852
- "name": "noPauseOnHover",
10021
+ "name": "no-pause-on-hover",
9853
10022
  "type": {
9854
10023
  "text": "boolean"
9855
10024
  },
@@ -10080,7 +10249,7 @@
10080
10249
  "description": "Optional count badge value shown next to the title. When unset, falls back to the row count of the bound table."
10081
10250
  },
10082
10251
  {
10083
- "name": "noFilter",
10252
+ "name": "no-filter",
10084
10253
  "type": {
10085
10254
  "text": "boolean"
10086
10255
  },
@@ -10088,7 +10257,7 @@
10088
10257
  "description": "Hide the Filter popover button. Filter is shown by default; set to opt out."
10089
10258
  },
10090
10259
  {
10091
- "name": "noSort",
10260
+ "name": "no-sort",
10092
10261
  "type": {
10093
10262
  "text": "boolean"
10094
10263
  },
@@ -10096,7 +10265,7 @@
10096
10265
  "description": "Hide the Sort popover button. Sort is shown by default; set to opt out."
10097
10266
  },
10098
10267
  {
10099
- "name": "noColumns",
10268
+ "name": "no-columns",
10100
10269
  "type": {
10101
10270
  "text": "boolean"
10102
10271
  },
@@ -10104,7 +10273,7 @@
10104
10273
  "description": "Hide the Columns visibility popover button. Columns control is shown by default; set to opt out."
10105
10274
  },
10106
10275
  {
10107
- "name": "noSearch",
10276
+ "name": "no-search",
10108
10277
  "type": {
10109
10278
  "text": "boolean"
10110
10279
  },
@@ -10205,7 +10374,7 @@
10205
10374
  "text": "array"
10206
10375
  },
10207
10376
  "default": "[]",
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."
10377
+ "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."
10209
10378
  },
10210
10379
  {
10211
10380
  "name": "density",
@@ -10284,7 +10453,7 @@
10284
10453
  "text": "boolean"
10285
10454
  },
10286
10455
  "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."
10456
+ "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#796) — `frameless`/`raw` on the instance still applies and is honored, but is no longer required just to avoid the doubled-edge look in that composition."
10288
10457
  },
10289
10458
  {
10290
10459
  "name": "valign",
@@ -10292,7 +10461,7 @@
10292
10461
  "text": "string"
10293
10462
  },
10294
10463
  "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[]."
10464
+ "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#505). Per-column `valign` in the columns[] array (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
10465
  },
10297
10466
  {
10298
10467
  "name": "wrap",
@@ -10573,7 +10742,7 @@
10573
10742
  "text": "string"
10574
10743
  },
10575
10744
  "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."
10745
+ "description": "Fill style — orthogonal to [variant]. Three values: - `muted` (default for the family variants — info/success/warning/ danger/primary — gh#864: tag and badge were swapped relative to 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#778's oversized-pill concern). Does NOT apply to the family-less `default` variant, which stays solid unconditionally (gh#794, unaffected by gh#864) — a bare `<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#864), or it's already the unconditional look for the family-less `default` variant (gh#794). - `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."
10577
10746
  }
10578
10747
  ],
10579
10748
  "events": [
@@ -10644,7 +10813,7 @@
10644
10813
  "description": "Inline character that commits the typed value as a chip. The sentinel `enter` disables in-line commit — only the Enter key (or programmatic `addToken`) commits. Default is `,`."
10645
10814
  },
10646
10815
  {
10647
- "name": "pasteSplit",
10816
+ "name": "paste-split",
10648
10817
  "type": {
10649
10818
  "text": "string"
10650
10819
  },
@@ -10668,7 +10837,7 @@
10668
10837
  "description": "Minimum required tokens for form validity."
10669
10838
  },
10670
10839
  {
10671
- "name": "minLength",
10840
+ "name": "min-length",
10672
10841
  "type": {
10673
10842
  "text": "number"
10674
10843
  },
@@ -10676,7 +10845,7 @@
10676
10845
  "description": "Minimum per-token character count after `transform` is applied."
10677
10846
  },
10678
10847
  {
10679
- "name": "maxLength",
10848
+ "name": "max-length",
10680
10849
  "type": {
10681
10850
  "text": "number"
10682
10851
  },
@@ -11126,7 +11295,7 @@
11126
11295
  "description": "Whether the seconds segment is exposed. `minute` (default) hides seconds; `second` adds the seconds segment + separator."
11127
11296
  },
11128
11297
  {
11129
- "name": "hourcycle",
11298
+ "name": "hour-cycle",
11130
11299
  "type": {
11131
11300
  "text": "string"
11132
11301
  },
@@ -11583,6 +11752,14 @@
11583
11752
  },
11584
11753
  "default": "false",
11585
11754
  "description": "Disabled state — blocks pointer + keyboard activation."
11755
+ },
11756
+ {
11757
+ "name": "selected",
11758
+ "type": {
11759
+ "text": "boolean"
11760
+ },
11761
+ "default": "false",
11762
+ "description": "Whether this option is currently selected. Managed by the parent <toggle-group-ui> container (ADR-0056) — don't set directly; the group's `value` is the single source of truth. Converges onto <segment-ui>'s declared reflected-prop mechanism (was previously a private `data-selected` stamp with no declared API surface)."
11586
11763
  }
11587
11764
  ]
11588
11765
  }
@@ -11645,7 +11822,7 @@
11645
11822
  "description": "Persist the user's choice to localStorage under `${storage-prefix}scheme`."
11646
11823
  },
11647
11824
  {
11648
- "name": "storagePrefix",
11825
+ "name": "storage-prefix",
11649
11826
  "type": {
11650
11827
  "text": "string"
11651
11828
  },
@@ -11653,7 +11830,7 @@
11653
11830
  "description": "LocalStorage key prefix; default matches <theme-panel> for cross-element interop."
11654
11831
  },
11655
11832
  {
11656
- "name": "iconLight",
11833
+ "name": "icon-light",
11657
11834
  "type": {
11658
11835
  "text": "string"
11659
11836
  },
@@ -11661,7 +11838,7 @@
11661
11838
  "description": "Phosphor icon shown when active-scheme is \"light\" (clicking switches to dark)."
11662
11839
  },
11663
11840
  {
11664
- "name": "iconDark",
11841
+ "name": "icon-dark",
11665
11842
  "type": {
11666
11843
  "text": "string"
11667
11844
  },
@@ -11669,7 +11846,7 @@
11669
11846
  "description": "Phosphor icon shown when active-scheme is \"dark\" (clicking switches to light)."
11670
11847
  },
11671
11848
  {
11672
- "name": "labelLight",
11849
+ "name": "label-light",
11673
11850
  "type": {
11674
11851
  "text": "string"
11675
11852
  },
@@ -11677,7 +11854,7 @@
11677
11854
  "description": "aria-label / title applied to the internal button when active-scheme is \"light\"."
11678
11855
  },
11679
11856
  {
11680
- "name": "labelDark",
11857
+ "name": "label-dark",
11681
11858
  "type": {
11682
11859
  "text": "string"
11683
11860
  },
@@ -11716,7 +11893,7 @@
11716
11893
  "description": "Disables the internal button."
11717
11894
  },
11718
11895
  {
11719
- "name": "activeScheme",
11896
+ "name": "active-scheme",
11720
11897
  "type": {
11721
11898
  "text": "string"
11722
11899
  },