@adia-ai/web-components 0.8.41 → 0.8.43

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 (134) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/MIGRATION.md +240 -3
  3. package/USAGE.md +4 -4
  4. package/color/index.js +1 -1
  5. package/components/action-list/action-item.a2ui.json +7 -7
  6. package/components/action-list/action-item.yaml +21 -9
  7. package/components/action-list/action-list.class.js +13 -7
  8. package/components/action-list/action-list.d.ts +2 -2
  9. package/components/button/button.yaml +1 -1
  10. package/components/calendar-picker/calendar-picker.a2ui.json +1 -1
  11. package/components/calendar-picker/calendar-picker.class.js +2 -3
  12. package/components/calendar-picker/calendar-picker.css +16 -18
  13. package/components/calendar-picker/calendar-picker.yaml +2 -2
  14. package/components/card/card.css +3 -3
  15. package/components/chart/chart.a2ui.json +8 -8
  16. package/components/chart/chart.class.js +21 -19
  17. package/components/chart/chart.d.ts +6 -6
  18. package/components/chart/chart.yaml +16 -9
  19. package/components/chart-legend/chart-legend.a2ui.json +7 -11
  20. package/components/chart-legend/chart-legend.class.js +17 -8
  21. package/components/chart-legend/chart-legend.css +5 -2
  22. package/components/chart-legend/chart-legend.d.ts +2 -2
  23. package/components/chart-legend/chart-legend.yaml +12 -8
  24. package/components/check/check.css +9 -0
  25. package/components/{color-picker/color-picker.a2ui.json → color-area/color-area.a2ui.json} +15 -12
  26. package/components/{color-picker/color-picker.class.js → color-area/color-area.class.js} +10 -8
  27. package/components/color-area/color-area.css +185 -0
  28. package/components/color-area/color-area.d.ts +66 -0
  29. package/components/color-area/color-area.examples.md +19 -0
  30. package/components/color-area/color-area.js +17 -0
  31. package/components/{color-picker/color-picker.yaml → color-area/color-area.yaml} +17 -9
  32. package/components/color-input/color-input.a2ui.json +5 -5
  33. package/components/color-input/color-input.class.js +9 -6
  34. package/components/color-input/color-input.css +1 -1
  35. package/components/color-input/color-input.js +2 -2
  36. package/components/color-input/color-input.yaml +14 -12
  37. package/components/description-list/description-list.a2ui.json +1 -1
  38. package/components/description-list/description-list.css +1 -1
  39. package/components/description-list/description-list.d.ts +1 -1
  40. package/components/description-list/description-list.yaml +1 -1
  41. package/components/drilldown/drilldown.a2ui.json +3 -0
  42. package/components/drilldown/drilldown.css +8 -1
  43. package/components/drilldown/drilldown.yaml +2 -0
  44. package/components/field/field.a2ui.json +1 -1
  45. package/components/field/field.class.js +5 -2
  46. package/components/field/field.yaml +1 -1
  47. package/components/index.js +1 -4
  48. package/components/input/input.a2ui.json +4 -4
  49. package/components/input/input.class.js +8 -0
  50. package/components/input/input.css +6 -0
  51. package/components/input/input.yaml +11 -8
  52. package/components/integration-card/integration-card.examples.md +2 -1
  53. package/components/menu/menu-item.a2ui.json +7 -7
  54. package/components/menu/menu-item.yaml +20 -7
  55. package/components/menu/menu.class.js +13 -7
  56. package/components/menu/menu.d.ts +2 -2
  57. package/components/pane/pane.a2ui.json +11 -11
  58. package/components/pane/pane.class.js +8 -4
  59. package/components/pane/pane.css +15 -10
  60. package/components/pane/pane.d.ts +10 -9
  61. package/components/pane/pane.yaml +9 -7
  62. package/components/progress/progress.a2ui.json +1 -1
  63. package/components/progress/progress.class.js +2 -2
  64. package/components/progress/progress.d.ts +1 -1
  65. package/components/progress/progress.yaml +2 -2
  66. package/components/radio/radio.css +7 -0
  67. package/components/search/search.css +10 -1
  68. package/components/segment/segment.a2ui.json +1 -2
  69. package/components/segment/segment.css +10 -0
  70. package/components/segment/segment.yaml +1 -2
  71. package/components/segmented/segmented.a2ui.json +1 -3
  72. package/components/segmented/segmented.class.js +2 -2
  73. package/components/segmented/segmented.yaml +2 -4
  74. package/components/select/select.css +6 -0
  75. package/components/step-progress/step-progress.yaml +1 -1
  76. package/components/swatch/swatch.yaml +1 -1
  77. package/components/switch/switch.css +8 -0
  78. package/components/table-toolbar/table-toolbar.a2ui.json +42 -1
  79. package/components/table-toolbar/table-toolbar.class.js +166 -14
  80. package/components/table-toolbar/table-toolbar.css +46 -0
  81. package/components/table-toolbar/table-toolbar.d.ts +13 -1
  82. package/components/table-toolbar/table-toolbar.yaml +104 -14
  83. package/components/textarea/textarea.css +4 -0
  84. package/components/time-picker/time-picker.yaml +3 -2
  85. package/components/tree/tree.yaml +1 -1
  86. package/components/upload/upload.class.js +16 -0
  87. package/components/upload/upload.d.ts +7 -0
  88. package/components/upload/upload.yaml +7 -3
  89. package/core/icons.js +3 -1
  90. package/custom-elements.json +147 -468
  91. package/dist/host.min.css +1 -1
  92. package/dist/host.sheet.js +1 -1
  93. package/dist/theme-provider.min.js +1 -1
  94. package/dist/web-components.min.css +1 -1
  95. package/dist/web-components.min.js +88 -85
  96. package/dist/web-components.sheet.js +1 -1
  97. package/index.d.ts +9 -13
  98. package/package.json +1 -1
  99. package/patterns/admin-shell/admin-shell.examples.html +2 -2
  100. package/patterns/chart-in-card/chart-in-card.examples.html +10 -10
  101. package/patterns/conversion-funnel/conversion-funnel.html +2 -2
  102. package/patterns/editor-shell/editor-shell.examples.html +3 -3
  103. package/patterns/form-system/form-system.examples.html +1 -1
  104. package/styles/colors/semantics/features.css +8 -1
  105. package/styles/components.css +1 -4
  106. package/traits/arrow-grid-nav/arrow-grid-nav.js +1 -1
  107. package/traits/resize-observer/resize-observer.js +1 -1
  108. package/components/color-picker/color-picker.css +0 -182
  109. package/components/color-picker/color-picker.d.ts +0 -99
  110. package/components/color-picker/color-picker.examples.md +0 -19
  111. package/components/color-picker/color-picker.js +0 -17
  112. package/components/datetime-picker/datetime-picker.a2ui.json +0 -256
  113. package/components/datetime-picker/datetime-picker.class.js +0 -58
  114. package/components/datetime-picker/datetime-picker.css +0 -11
  115. package/components/datetime-picker/datetime-picker.d.ts +0 -87
  116. package/components/datetime-picker/datetime-picker.examples.md +0 -25
  117. package/components/datetime-picker/datetime-picker.js +0 -17
  118. package/components/datetime-picker/datetime-picker.yaml +0 -254
  119. package/components/progress-row/progress-row.a2ui.json +0 -107
  120. package/components/progress-row/progress-row.class.js +0 -118
  121. package/components/progress-row/progress-row.css +0 -60
  122. package/components/progress-row/progress-row.d.ts +0 -24
  123. package/components/progress-row/progress-row.examples.md +0 -7
  124. package/components/progress-row/progress-row.js +0 -17
  125. package/components/progress-row/progress-row.yaml +0 -85
  126. package/components/toggle-group/toggle-group.a2ui.json +0 -148
  127. package/components/toggle-group/toggle-group.class.js +0 -195
  128. package/components/toggle-group/toggle-group.css +0 -127
  129. package/components/toggle-group/toggle-group.d.ts +0 -50
  130. package/components/toggle-group/toggle-group.examples.md +0 -33
  131. package/components/toggle-group/toggle-group.js +0 -18
  132. package/components/toggle-group/toggle-group.yaml +0 -135
  133. package/components/toggle-group/toggle-option.a2ui.json +0 -86
  134. package/components/toggle-group/toggle-option.yaml +0 -75
@@ -7,7 +7,7 @@ category: layout
7
7
  version: 1
8
8
  description: |
9
9
  Collapsible, resizable content panel — drag-resize handle on the
10
- inner edge when [side="leading"] / [side="trailing"], [resizable]
10
+ inner edge when [edge="leading"] / [edge="trailing"], [resizable]
11
11
  opt-in. Used standalone for resizable two-pane layouts, or wrapped
12
12
  by <editor-sidebar> / <admin-sidebar> which DELEGATE drag to the
13
13
  inner pane-ui rather than reimplementing it. See pane.yaml's
@@ -35,7 +35,7 @@ props:
35
35
  description: 'Component property: resizable.'
36
36
  type: boolean
37
37
  default: false
38
- side:
38
+ edge:
39
39
  description: 'Opts a pane into horizontal-sibling chrome: suppresses the default
40
40
 
41
41
  four-sided border and moves the resize grabber to the inner edge
@@ -46,7 +46,9 @@ props:
46
46
 
47
47
  Unset keeps the pane-intrinsic chrome (full border, right-edge
48
48
 
49
- grabber when resizable).
49
+ grabber when resizable). Canonical spelling (ADR-0063, gh#1563) — the
50
+
51
+ deprecated `side` dual-read alias was cut in 0.8.43 (gh#1617).
50
52
 
51
53
  '
52
54
  type: string
@@ -82,10 +84,10 @@ a2ui:
82
84
  rules:
83
85
  - >-
84
86
  pane-ui is a resizable / collapsible content panel. As a standalone
85
- primitive (no [side] attribute), it carries its own four-sided
87
+ primitive (no [edge] attribute), it carries its own four-sided
86
88
  chrome and a right-edge resize grabber. As a horizontal-sibling
87
- child of a layout container (set [side="leading"] or
88
- [side="trailing"]), the chrome and grabber move to the inner
89
+ child of a layout container (set [edge="leading"] or
90
+ [edge="trailing"]), the chrome and grabber move to the inner
89
91
  edge so adjacent panes share a single seam.
90
92
  - >-
91
93
  Wrapped by <editor-sidebar slot="leading|trailing"> inside
@@ -101,7 +103,7 @@ a2ui:
101
103
  navigator tree, inspector form rows, or other primary content.
102
104
  - >-
103
105
  For a standalone resizable two-pane layout (no shell), nest panes
104
- directly inside a flex row — both with [side]-typed chrome —
106
+ directly inside a flex row — both with [edge]-typed chrome —
105
107
  and the resize handle will live on the seam between them. For
106
108
  a non-resizable summary pane (a fixed-width detail rail), drop
107
109
  [resizable] and pane-ui collapses to a static container.
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://adiaui.dev/a2ui/v0_9/components/Progress.json",
4
4
  "title": "Progress",
5
- "description": "Linear progress bar indicator. Value < 0 marks indeterminate state showing animated activity instead of a fill. Bar-only — for circular loading indicators use <spinner-ui> instead (the former `variant=\"spinner\"` render mode was retired; spinner-ui owns circular). Set `label` for a labeled task-list row (label + bar + optional `meta` text in one row, e.g. storage quotas, capacity breakdowns) — absorbed <progress-row-ui>'s row layout directly; that component is now a deprecated alias. Omit `label` for a standalone bar (global loading indicators); for percent-complete inline displays use <stat-ui> instead.",
5
+ "description": "Linear progress bar indicator. Value < 0 marks indeterminate state showing animated activity instead of a fill. Bar-only — for circular loading indicators use <spinner-ui> instead (the former `variant=\"spinner\"` render mode was retired; spinner-ui owns circular). Set `label` for a labeled task-list row (label + bar + optional `meta` text in one row, e.g. storage quotas, capacity breakdowns) — absorbed <progress-row-ui>'s row layout directly; that component was cut in 0.8.43 (gh#1617). Omit `label` for a standalone bar (global loading indicators); for percent-complete inline displays use <stat-ui> instead.",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -23,8 +23,8 @@
23
23
  * (Legacy `value="-1"` is still treated as indeterminate for back-compat.)
24
24
  *
25
25
  * `label` (non-empty) activates the labeled row layout — label + bar +
26
- * optional `meta` text in one row (absorbed from the now-deprecated
27
- * <progress-row-ui>, gh#1363 C4). Omit `label` for a plain standalone bar.
26
+ * optional `meta` text in one row (absorbed from <progress-row-ui>,
27
+ * gh#1363 C4, cut in 0.8.43, gh#1617). Omit `label` for a plain standalone bar.
28
28
  */
29
29
 
30
30
  import { UIElement } from '../../core/element.js';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `<progress-ui>` — Linear progress bar indicator. Value < 0 marks indeterminate state showing animated activity instead of a fill. Bar-only — for circular loading indicators use <spinner-ui> instead (the former `variant="spinner"` render mode was retired; spinner-ui owns circular). Set `label` for a labeled task-list row (label + bar + optional `meta` text in one row, e.g. storage quotas, capacity breakdowns) — absorbed <progress-row-ui>'s row layout directly; that component is now a deprecated alias. Omit `label` for a standalone bar (global loading indicators); for percent-complete inline displays use <stat-ui> instead.
2
+ * `<progress-ui>` — Linear progress bar indicator. Value < 0 marks indeterminate state showing animated activity instead of a fill. Bar-only — for circular loading indicators use <spinner-ui> instead (the former `variant="spinner"` render mode was retired; spinner-ui owns circular). Set `label` for a labeled task-list row (label + bar + optional `meta` text in one row, e.g. storage quotas, capacity breakdowns) — absorbed <progress-row-ui>'s row layout directly; that component was cut in 0.8.43 (gh#1617). Omit `label` for a standalone bar (global loading indicators); for percent-complete inline displays use <stat-ui> instead.
3
3
  *
4
4
  * @see https://ui-kit.exe.xyz/site/components/progress
5
5
  *
@@ -12,8 +12,8 @@ description: >-
12
12
  `variant="spinner"` render mode was retired; spinner-ui owns circular).
13
13
  Set `label` for a labeled task-list row (label + bar + optional `meta`
14
14
  text in one row, e.g. storage quotas, capacity breakdowns) — absorbed
15
- <progress-row-ui>'s row layout directly; that component is now
16
- a deprecated alias. Omit `label` for a standalone bar (global loading
15
+ <progress-row-ui>'s row layout directly; that component was cut in
16
+ 0.8.43 (gh#1617). Omit `label` for a standalone bar (global loading
17
17
  indicators); for percent-complete inline displays use <stat-ui> instead.
18
18
  props:
19
19
  value:
@@ -14,6 +14,12 @@ radio-ui[checked] [slot="dot"] {
14
14
  background: var(--radio-bg-checked);
15
15
  border-color: var(--radio-border-checked);
16
16
  }
17
+ /* gh#1596 — a checked dot kept its full primary fill when disabled; higher
18
+ specificity (2 attrs) than the rule above wins without reordering. */
19
+ radio-ui[checked][disabled] [slot="dot"] {
20
+ background: var(--radio-bg-checked-disabled);
21
+ border-color: var(--radio-bg-checked-disabled);
22
+ }
17
23
  radio-ui[checked] [slot="dot"]::after {
18
24
  width: calc(var(--radio-size) * 0.6);
19
25
  height: calc(var(--radio-size) * 0.6);
@@ -40,6 +46,7 @@ radio-ui[checked] [slot="dot"]::after {
40
46
 
41
47
  /* ── State: disabled ── */
42
48
  --radio-fg-disabled: var(--a-ui-text-disabled);
49
+ --radio-bg-checked-disabled: var(--a-ui-bg-disabled);
43
50
 
44
51
  /* ── State: focus ── */
45
52
  --radio-focus-ring: var(--a-focus-ring);
@@ -18,7 +18,16 @@
18
18
  pointer-events: none;
19
19
  }
20
20
 
21
- [slot="suffix"] {
21
+ /* input-ui's suffix slot is decorative-only by default (input.css's own
22
+ @scope (input-ui) sets pointer-events: none on [slot="prefix"|"suffix"]).
23
+ search-ui repurposes it as the clickable clear (x-circle) affordance, so
24
+ it must opt back into pointer events. A same-specificity `[slot="suffix"]`
25
+ here loses to input.css's rule on scoping proximity — @scope(input-ui) is
26
+ the CLOSER scope root to the suffix span than @scope(search-ui), and
27
+ proximity is only a tiebreak AFTER specificity. Add `input-ui` to the
28
+ selector so specificity itself decides the override (gh#1593). */
29
+ input-ui [slot="suffix"] {
30
+ pointer-events: auto;
22
31
  transition: opacity var(--search-duration) var(--search-easing);
23
32
  }
24
33
 
@@ -90,8 +90,7 @@
90
90
  "name": "UISegment",
91
91
  "parts": {},
92
92
  "related": [
93
- "segmented-control",
94
- "ToggleOption"
93
+ "segmented-control"
95
94
  ],
96
95
  "slots": {},
97
96
  "states": [
@@ -17,6 +17,15 @@ segment-ui[selected] {
17
17
  segmented-ui[multiple] > segment-ui[selected] {
18
18
  background: var(--segment-bg-selected);
19
19
  }
20
+ /* gh#1596 — a selected segment in [multiple] mode kept its full
21
+ primary-container fill when disabled (only the label fg dimmed); 2-attr
22
+ selector outweighs the 1-attr rule above regardless of source order.
23
+ Neutralizes to the same shared disabled-bg role button-ui's colored
24
+ variants already reset to, rather than a color-family container-low
25
+ (disabled drops color semantics entirely, same convention as button). */
26
+ segmented-ui[multiple] > segment-ui[selected][disabled] {
27
+ background: var(--segment-bg-selected-disabled);
28
+ }
20
29
 
21
30
  @scope (segment-ui) {
22
31
  :where(:scope) {
@@ -43,6 +52,7 @@ segmented-ui[multiple] > segment-ui[selected] {
43
52
  --segment-fg-hover: var(--a-ui-text-hover);
44
53
  --segment-fg-selected: var(--a-chrome-dark);
45
54
  --segment-fg-disabled: var(--a-ui-text-disabled);
55
+ --segment-bg-selected-disabled: var(--a-ui-bg-disabled);
46
56
  /* [multiple] only — see the moved-out selector above (Safari 17.x bug
47
57
  note at top of file). Same default the deprecated
48
58
  toggle-option-ui[selected] background used, for visual continuity
@@ -61,7 +61,7 @@ a2ui:
61
61
  rules:
62
62
  - rule: 'Child of <segmented-ui> — one selectable option button; the parent''s [multiple] axis decides single- or multi-select, segment-ui itself is unchanged either way.'
63
63
  reason: 'Cluster contract.'
64
- - rule: '<toggle-option-ui> (deprecated, gh#1369) is the same concept — use segment-ui inside <segmented-ui multiple> instead.'
64
+ - rule: '<toggle-option-ui> (cut in 0.8.43, gh#1617, gh#1369) was the same concept — use segment-ui inside <segmented-ui multiple> instead.'
65
65
  reason: 'Deprecation redirect.'
66
66
  - rule: 'Selected state managed by the parent <segmented-ui> — it syncs the selected attribute onto every child whose value is in its own value (single value, or the [multiple] comma-separated set); do not set selected directly on segment.'
67
67
  reason: 'Parent owns selection state.'
@@ -243,4 +243,3 @@ synonyms:
243
243
  segment: [segment-button, segmented-option, option-button, toggle-option]
244
244
  related:
245
245
  - segmented-control
246
- - ToggleOption
@@ -22,7 +22,7 @@
22
22
  "const": "Segmented"
23
23
  },
24
24
  "multiple": {
25
- "description": "Enables multi-select — value becomes a comma-separated set, the sliding indicator is suppressed (each selected segment carries its own background instead), and Space/Enter toggles a focused segment instead of arrow-move selecting it. Positive polarity, matching select-ui[multiple]. Absorbs the role of the deprecated <toggle-group-ui> + <toggle-option-ui> pair (gh#1369, #1363 C1). Unlike <toggle-group-ui single>, re-clicking an already-selected segment does NOT clear the selection — segmented-ui's single-select is standard radiogroup semantics (always exactly one selected once a value is set).",
25
+ "description": "Enables multi-select — value becomes a comma-separated set, the sliding indicator is suppressed (each selected segment carries its own background instead), and Space/Enter toggles a focused segment instead of arrow-move selecting it. Positive polarity, matching select-ui[multiple]. Absorbs the role of the <toggle-group-ui> + <toggle-option-ui> pair (gh#1369, #1363 C1) — those components were cut in 0.8.43 (gh#1617). Unlike the former <toggle-group-ui single>, re-clicking an already-selected segment does NOT clear the selection — segmented-ui's single-select is standard radiogroup semantics (always exactly one selected once a value is set).",
26
26
  "type": "boolean",
27
27
  "default": false
28
28
  },
@@ -81,8 +81,6 @@
81
81
  },
82
82
  "related": [
83
83
  "Segment",
84
- "ToggleGroup",
85
- "ToggleOption",
86
84
  "Tabs",
87
85
  "Radio"
88
86
  ],
@@ -29,8 +29,8 @@
29
29
  * [multiple] (gh#1369, #1363 C1): multi-select mode — `value` is a
30
30
  * comma-separated set, no sliding indicator (each selected segment carries
31
31
  * its own background instead), Space/Enter toggles instead of arrow-move.
32
- * Absorbs <toggle-group-ui>/<toggle-option-ui>'s role, which are deprecated
33
- * in favor of this axis.
32
+ * Absorbs <toggle-group-ui>/<toggle-option-ui>'s role; those components
33
+ * were cut in 0.8.43 (gh#1617) in favor of this axis.
34
34
  */
35
35
 
36
36
  import { UIFormElement } from '../../core/form.js';
@@ -12,7 +12,7 @@ props:
12
12
  type: string
13
13
  default: ''
14
14
  multiple:
15
- description: "Enables multi-select — value becomes a comma-separated set, the sliding indicator is suppressed (each selected segment carries its own background instead), and Space/Enter toggles a focused segment instead of arrow-move selecting it. Positive polarity, matching select-ui[multiple]. Absorbs the role of the deprecated <toggle-group-ui> + <toggle-option-ui> pair (gh#1369, #1363 C1). Unlike <toggle-group-ui single>, re-clicking an already-selected segment does NOT clear the selection — segmented-ui's single-select is standard radiogroup semantics (always exactly one selected once a value is set)."
15
+ description: "Enables multi-select — value becomes a comma-separated set, the sliding indicator is suppressed (each selected segment carries its own background instead), and Space/Enter toggles a focused segment instead of arrow-move selecting it. Positive polarity, matching select-ui[multiple]. Absorbs the role of the <toggle-group-ui> + <toggle-option-ui> pair (gh#1369, #1363 C1) — those components were cut in 0.8.43 (gh#1617). Unlike the former <toggle-group-ui single>, re-clicking an already-selected segment does NOT clear the selection — segmented-ui's single-select is standard radiogroup semantics (always exactly one selected once a value is set)."
16
16
  type: boolean
17
17
  default: false
18
18
  reflect: true
@@ -45,7 +45,7 @@ a2ui:
45
45
  rules:
46
46
  - rule: 'Single-select by default. Hosts <segment-ui> children; exactly one selected at a time.'
47
47
  reason: 'Single-select cluster contract.'
48
- - rule: 'For multi-select (filter chips, multi-flag toggles, day-of-week pickers), set [multiple] instead of using a separate component — value becomes a comma-separated set of selected segment values. <toggle-group-ui>/<toggle-option-ui> are deprecated; use <segmented-ui multiple> + <segment-ui> instead (gh#1369, #1363 C1).'
48
+ - rule: 'For multi-select (filter chips, multi-flag toggles, day-of-week pickers), set [multiple] instead of using a separate component — value becomes a comma-separated set of selected segment values. <toggle-group-ui>/<toggle-option-ui> were cut in 0.8.43 (gh#1617); use <segmented-ui multiple> + <segment-ui> instead (gh#1369, #1363 C1).'
49
49
  reason: 'Selection model axis — multiple absorbs the deprecated multi-select pair.'
50
50
  - rule: 'Use for view-mode switches (grid/list, light/dark) or short filter sets (3-5 options); for longer sets use <tabs-ui> or <select-ui multiple>.'
51
51
  reason: 'Capacity guidance.'
@@ -201,7 +201,5 @@ synonyms:
201
201
  - Segmented
202
202
  related:
203
203
  - Segment
204
- - ToggleGroup
205
- - ToggleOption
206
204
  - Tabs
207
205
  - Radio
@@ -21,6 +21,11 @@
21
21
  --select-bg-selected to re-enable a tinted selected row. */
22
22
  --select-bg-selected: transparent;
23
23
  --select-bg-hover: var(--a-ui-bg-hover);
24
+ /* gh#1596 — the trigger kept its full field bg when disabled (no
25
+ swap existed at all, unlike input-ui/textarea-ui's own
26
+ --<component>-bg-disabled indirection); wired to the same shared
27
+ role those already alias to. */
28
+ --select-bg-disabled: var(--a-ui-bg-disabled);
24
29
  --select-border: var(--a-ui-border);
25
30
  --select-border-hover: var(--a-ui-border-hover);
26
31
  --select-focus-ring: var(--a-focus-ring);
@@ -69,6 +74,7 @@
69
74
  align-items: center;
70
75
  }
71
76
  :scope[disabled] { pointer-events: none; color: var(--select-fg-disabled); }
77
+ :scope[disabled] [slot="trigger"] { background: var(--select-bg-disabled); }
72
78
 
73
79
  /* Label */
74
80
  :scope::before {
@@ -51,7 +51,7 @@ a2ui:
51
51
  reason: 'Minimal stepper visualization.'
52
52
  - rule: 'Different from <stepper-ui> (labeled, expanded) — step-progress is dense and label-free.'
53
53
  reason: 'Density boundary.'
54
- - rule: 'For multi-task progress bars (multiple labeled rows) use a stack of <progress-ui> with `label` set (absorbed the row layout from the now-deprecated progress-row-ui).'
54
+ - rule: 'For multi-task progress bars (multiple labeled rows) use a stack of <progress-ui> with `label` set (absorbed the row layout from progress-row-ui, which was cut in 0.8.43, gh#1617).'
55
55
  reason: 'Different layout.'
56
56
  anti_patterns: []
57
57
 
@@ -154,7 +154,7 @@ tokens:
154
154
  description: Color of the focus + selected ring when [selectable] is set.
155
155
  a2ui:
156
156
  rules:
157
- - rule: 'Use to display a single color sample with optional label. For interactive color picking use <color-picker-ui>.'
157
+ - rule: 'Use to display a single color sample with optional label. For interactive color picking use <color-area-ui>.'
158
158
  reason: 'Swatch is read-only display; picker is input.'
159
159
  - rule: 'Inside design-token displays or palette grids; not for general decoration.'
160
160
  reason: 'Semantic purpose: color sample.'
@@ -14,6 +14,13 @@ switch-ui[checked] {
14
14
  --switch-track-border: var(--switch-track-border-checked);
15
15
  --switch-thumb-bg: var(--switch-thumb-bg-checked);
16
16
  }
17
+ /* gh#1596 — a checked track kept its full primary fill when disabled
18
+ (only the label fg dimmed); 2-attr selector outweighs the 1-attr rule
19
+ above regardless of source order. */
20
+ switch-ui[checked][disabled] {
21
+ --switch-track-bg: var(--switch-track-bg-checked-disabled);
22
+ --switch-track-border: var(--switch-track-bg-checked-disabled);
23
+ }
17
24
  switch-ui[checked] [slot="thumb"] {
18
25
  transform: translateX(var(--switch-thumb-travel));
19
26
  }
@@ -60,6 +67,7 @@ switch-ui[checked] [slot="thumb"] {
60
67
 
61
68
  /* ── State: disabled ── */
62
69
  --switch-fg-disabled: var(--a-ui-text-disabled);
70
+ --switch-track-bg-checked-disabled: var(--a-ui-bg-disabled);
63
71
  text-align: start; /* §text-align-reset — blocks inheritance from centered ancestors */
64
72
  }
65
73
 
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://adiaui.dev/a2ui/v0_9/components/TableToolbar.json",
4
4
  "title": "TableToolbar",
5
- "description": "Header / companion bar for a sibling table-ui. Renders title + count badge, filter / sort / columns popovers, and a search input — all wired to the target table via an [for] id-ref. Modeled on chart-legend-ui's [for] binding pattern. Drop next to (or above) any table-ui to add the standard data-grid toolbar without re-implementing search, filter, sort, or column visibility. Filter rows auto-pick a primitive per column: ≤ 50 distinct values → multi- select (searchable when ≥ 12 options), id-like keys → free-text contains. The column descriptor's `filter` field overrides the auto-detect: `'select'` forces multi-select even on high-cardinality columns; `'text'` forces a contains input even on small enums.",
5
+ "description": "Header / companion bar for a sibling table-ui. Renders an optional leading [slot=\"scope\"] region, title + count badge, an optional \"Showing X–Y of N\" range summary, filter / sort / columns popovers, a search input, an optional page-size select, and a trailing [slot=\"actions\"] region — all wired to the target table via an [for] id-ref. Modeled on chart-legend-ui's [for] binding pattern. Drop next to (or above) any table-ui to add the standard data-grid toolbar without re-implementing search, filter, sort, column visibility, or pagination summary/page-size. Filter rows auto-pick a primitive per column: ≤ 50 distinct values → multi-select (searchable when ≥ 12 options), id-like keys → free-text contains. The column descriptor's `filter` field overrides the auto-detect: `'select'` forces multi-select even on high-cardinality columns; `'text'` forces a contains input even on small enums.",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -46,11 +46,35 @@
46
46
  "type": "boolean",
47
47
  "default": false
48
48
  },
49
+ "pageSize": {
50
+ "description": "Current rows-per-page value, shown as the selected option in the page-size select. Falls back to the first entry of pageSizeOptions when unset (0) or not present among the options. Applied directly to the bound table's own [paginate] prop (rows-per-page), the same way filter/sort/columns changes are applied to the target — mirror this prop only to reflect state to URL / persistence / analytics.",
51
+ "type": "number",
52
+ "default": 0
53
+ },
54
+ "pageSizeOptions": {
55
+ "description": "Rows-per-page choices rendered as `<option>`s in the page-size select (e.g. `[10, 25, 50, 100]`). JS property (`.pageSizeOptions = [...]`), or a declarative JSON-array `page-size-options=\"[10,25,50]\"` attribute hydrated once at connect — the same dynamic-array pattern table-ui's own `columns`/`data` props use. Empty (the default) hides the page-size select entirely — additive opt-in, no footprint on existing consumers.",
56
+ "$ref": "common_types.json#/$defs/DynamicStringList"
57
+ },
49
58
  "placeholder": {
50
59
  "description": "Placeholder text for the search input.",
51
60
  "type": "string",
52
61
  "default": "Search..."
53
62
  },
63
+ "rangeEnd": {
64
+ "description": "1-indexed last row number of the current page, for the range summary (e.g. `25` in \"Showing 1–25 of 320\"). See rangeStart.",
65
+ "type": "number",
66
+ "default": 0
67
+ },
68
+ "rangeStart": {
69
+ "description": "1-indexed first row number of the current page, for the \"Showing X–Y of N\" range summary (e.g. `1` in \"Showing 1–25 of 320\"). Renders alongside — never in place of — [text]/[count]; the range summary is its own cluster, independent of the title cluster. All three of rangeStart/rangeEnd/rangeTotal must be set (> 0) for the summary to render; omit all three (the default) to opt out entirely.",
70
+ "type": "number",
71
+ "default": 0
72
+ },
73
+ "rangeTotal": {
74
+ "description": "Total row count across all pages, for the range summary (e.g. `320` in \"Showing 1–25 of 320\"). Distinct from pagination-ui's `total` (total PAGES) — this is total ROWS; deliberately not spelled `total` to avoid that cross-sibling name collision (ADR-0063 B5). See rangeStart.",
75
+ "type": "number",
76
+ "default": 0
77
+ },
54
78
  "text": {
55
79
  "description": "Title text shown on the left.",
56
80
  "type": "string",
@@ -92,6 +116,9 @@
92
116
  "filter-change": {
93
117
  "description": "Filter set changed. Detail: { filters }."
94
118
  },
119
+ "page-size-change": {
120
+ "description": "Page-size select changed. Detail: { pageSize }."
121
+ },
95
122
  "search": {
96
123
  "description": "Debounced search query change. Detail: { value }."
97
124
  },
@@ -104,6 +131,11 @@
104
131
  "description": "Members table with filter/sort/columns/search wired to a sibling table-ui.",
105
132
  "a2ui": "[\n {\"id\": \"root\", \"component\": \"Column\", \"gap\": \"3\", \"children\": [\"bar\", \"card\"]},\n {\"id\": \"bar\", \"component\": \"TableToolbar\", \"for\": \"members\", \"text\": \"All Employees\", \"count\": \"32\"},\n {\"id\": \"card\", \"component\": \"Card\", \"children\": [\"sec\"]},\n {\"id\": \"sec\", \"component\": \"Section\", \"bleed\": true, \"children\": [\"tbl\"]},\n {\"id\": \"tbl\", \"component\": \"Table\", \"id\": \"members\", \"sortable\": true, \"raw\": true}\n]",
106
133
  "name": "members-toolbar"
134
+ },
135
+ {
136
+ "description": "The ratified adiav2 list-page toolbar row (ADIA2-9123): scope menu, range summary, filter/columns triggers, page-size select, and a primary CTA — search and sort dropped per that contract.",
137
+ "a2ui": "[\n {\"id\": \"root\", \"component\": \"Column\", \"gap\": \"3\", \"children\": [\"bar\", \"card\"]},\n {\"id\": \"bar\", \"component\": \"TableToolbar\", \"for\": \"accounts\", \"no-sort\": true, \"no-search\": true, \"range-start\": 1, \"range-end\": 25, \"range-total\": 320, \"page-size\": 25, \"page-size-options\": [10, 25, 50, 100]},\n {\"id\": \"card\", \"component\": \"Card\", \"children\": [\"sec\"]},\n {\"id\": \"sec\", \"component\": \"Section\", \"bleed\": true, \"children\": [\"tbl\"]},\n {\"id\": \"tbl\", \"component\": \"Table\", \"id\": \"accounts\", \"sortable\": true, \"raw\": true}\n]",
138
+ "name": "adiav2-list-page-toolbar-row"
107
139
  }
108
140
  ],
109
141
  "keywords": [
@@ -132,6 +164,9 @@
132
164
  "slots": {
133
165
  "actions": {
134
166
  "description": "Trailing action area — primary buttons (e.g. \"New row\") rendered after the search input."
167
+ },
168
+ "scope": {
169
+ "description": "Leading region rendered BEFORE the [text]/[count] title cluster — e.g. a scope/view-switcher menu (an org's teams, a saved view). Positioning is CSS by DOM order, mirroring how [slot=\"actions\"] is a real, author-fillable insertion point rather than template-stamped content."
135
170
  }
136
171
  },
137
172
  "states": [
@@ -183,6 +218,12 @@
183
218
  "--table-toolbar-radius": {
184
219
  "description": "Toolbar corner radius (variant=card)"
185
220
  },
221
+ "--table-toolbar-summary-fg": {
222
+ "description": "Range-summary (\"Showing X–Y of N\") text color"
223
+ },
224
+ "--table-toolbar-summary-size": {
225
+ "description": "Range-summary font size"
226
+ },
186
227
  "--table-toolbar-title-fg": {
187
228
  "description": "Title text color"
188
229
  },