@adia-ai/web-components 0.8.42 → 0.8.44

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 (186) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/MIGRATION.md +130 -80
  3. package/USAGE.md +1 -1
  4. package/color/index.js +1 -1
  5. package/components/action-list/action-item.a2ui.json +3 -8
  6. package/components/action-list/action-item.yaml +10 -16
  7. package/components/action-list/action-list.class.js +5 -61
  8. package/components/action-list/action-list.d.ts +1 -3
  9. package/components/avatar/avatar.class.js +12 -1
  10. package/components/button/button.d.ts +4 -0
  11. package/components/button/button.yaml +1 -1
  12. package/components/calendar-picker/calendar-picker.a2ui.json +1 -1
  13. package/components/calendar-picker/calendar-picker.class.js +2 -3
  14. package/components/calendar-picker/calendar-picker.css +16 -18
  15. package/components/calendar-picker/calendar-picker.yaml +2 -2
  16. package/components/card/card.css +3 -3
  17. package/components/chart/chart.a2ui.json +29 -18
  18. package/components/chart/chart.class.js +1308 -266
  19. package/components/chart/chart.css +151 -1
  20. package/components/chart/chart.d.ts +9 -9
  21. package/components/chart/chart.yaml +63 -31
  22. package/components/chart-legend/chart-legend.a2ui.json +20 -14
  23. package/components/chart-legend/chart-legend.class.js +79 -58
  24. package/components/chart-legend/chart-legend.css +65 -1
  25. package/components/chart-legend/chart-legend.d.ts +5 -5
  26. package/components/chart-legend/chart-legend.examples.md +4 -4
  27. package/components/chart-legend/chart-legend.yaml +50 -20
  28. package/components/check/check.css +9 -0
  29. package/components/color-area/color-area.a2ui.json +1 -1
  30. package/components/color-area/color-area.class.js +2 -2
  31. package/components/color-area/color-area.css +4 -7
  32. package/components/color-area/color-area.d.ts +1 -1
  33. package/components/color-area/color-area.yaml +3 -3
  34. package/components/color-input/color-input.a2ui.json +1 -1
  35. package/components/color-input/color-input.class.js +1 -1
  36. package/components/color-input/color-input.yaml +2 -2
  37. package/components/combobox/combobox.a2ui.json +3 -0
  38. package/components/combobox/combobox.class.js +9 -8
  39. package/components/combobox/combobox.css +25 -4
  40. package/components/combobox/combobox.yaml +6 -0
  41. package/components/command/command.css +17 -1
  42. package/components/context-menu/context-menu.d.ts +2 -0
  43. package/components/drilldown/drilldown.a2ui.json +3 -0
  44. package/components/drilldown/drilldown.css +8 -1
  45. package/components/drilldown/drilldown.yaml +2 -0
  46. package/components/field/field.class.js +5 -5
  47. package/components/heatmap/heatmap.a2ui.json +5 -0
  48. package/components/heatmap/heatmap.d.ts +2 -0
  49. package/components/heatmap/heatmap.yaml +8 -0
  50. package/components/index.js +0 -4
  51. package/components/input/input.a2ui.json +4 -4
  52. package/components/input/input.class.js +20 -7
  53. package/components/input/input.css +6 -0
  54. package/components/input/input.yaml +15 -11
  55. package/components/integration-card/integration-card.d.ts +2 -0
  56. package/components/menu/menu-item.a2ui.json +3 -8
  57. package/components/menu/menu-item.yaml +13 -21
  58. package/components/menu/menu.class.js +5 -27
  59. package/components/menu/menu.d.ts +1 -3
  60. package/components/noodles/noodles.a2ui.json +0 -15
  61. package/components/noodles/noodles.yaml +0 -12
  62. package/components/number-format/number-format.class.js +10 -0
  63. package/components/pagination/pagination.class.js +88 -4
  64. package/components/pane/pane.a2ui.json +2 -12
  65. package/components/pane/pane.class.js +5 -30
  66. package/components/pane/pane.d.ts +3 -5
  67. package/components/pane/pane.yaml +7 -19
  68. package/components/popover/popover.d.ts +2 -0
  69. package/components/progress/progress.a2ui.json +1 -1
  70. package/components/progress/progress.class.js +13 -8
  71. package/components/progress/progress.d.ts +1 -1
  72. package/components/progress/progress.yaml +2 -2
  73. package/components/radio/radio.css +7 -0
  74. package/components/range/range.class.js +9 -1
  75. package/components/search/search.css +10 -1
  76. package/components/segment/segment.a2ui.json +1 -2
  77. package/components/segment/segment.css +10 -0
  78. package/components/segment/segment.yaml +1 -2
  79. package/components/segmented/segmented.a2ui.json +1 -3
  80. package/components/segmented/segmented.class.js +2 -2
  81. package/components/segmented/segmented.yaml +2 -4
  82. package/components/select/select.a2ui.json +5 -1
  83. package/components/select/select.class.js +14 -14
  84. package/components/select/select.css +20 -1
  85. package/components/select/select.yaml +7 -1
  86. package/components/step-progress/step-progress.yaml +1 -1
  87. package/components/stream/stream.d.ts +2 -0
  88. package/components/switch/switch.css +8 -0
  89. package/components/table/table.a2ui.json +6 -1
  90. package/components/table/table.class.js +18 -1
  91. package/components/table/table.css +31 -6
  92. package/components/table/table.d.ts +3 -1
  93. package/components/table/table.examples.md +2 -2
  94. package/components/table/table.yaml +9 -1
  95. package/components/table-toolbar/table-toolbar.a2ui.json +67 -2
  96. package/components/table-toolbar/table-toolbar.class.js +492 -17
  97. package/components/table-toolbar/table-toolbar.css +311 -0
  98. package/components/table-toolbar/table-toolbar.d.ts +17 -1
  99. package/components/table-toolbar/table-toolbar.yaml +220 -15
  100. package/components/tag/tag.class.js +13 -1
  101. package/components/text/text.a2ui.json +3 -3
  102. package/components/text/text.d.ts +5 -3
  103. package/components/text/text.yaml +3 -3
  104. package/components/textarea/textarea.class.js +9 -1
  105. package/components/textarea/textarea.css +4 -0
  106. package/components/time-picker/time-picker.yaml +3 -2
  107. package/components/tour/tour.d.ts +10 -0
  108. package/components/tree/tree.yaml +1 -1
  109. package/components/upload/upload.class.js +16 -0
  110. package/components/upload/upload.d.ts +7 -0
  111. package/components/upload/upload.yaml +7 -3
  112. package/core/a11y.d.ts +22 -0
  113. package/core/a11y.js +64 -0
  114. package/core/anchor.js +9 -5
  115. package/core/element.js +1 -1
  116. package/core/icons.js +2 -5
  117. package/custom-elements.json +142 -594
  118. package/dist/host.min.css +1 -1
  119. package/dist/host.sheet.js +1 -1
  120. package/dist/theme-provider.min.js +1 -1
  121. package/dist/web-components.min.css +1 -1
  122. package/dist/web-components.min.js +122 -119
  123. package/dist/web-components.sheet.js +1 -1
  124. package/index.d.ts +0 -15
  125. package/package.json +1 -1
  126. package/patterns/access-requests/access-requests.examples.html +1 -1
  127. package/patterns/admin-keys-and-export/admin-keys-and-export.examples.html +7 -7
  128. package/patterns/agent-cost/agent-cost.examples.html +6 -6
  129. package/patterns/agent-memory/agent-memory.examples.html +3 -3
  130. package/patterns/agent-prompt-library/agent-prompt-library.examples.html +8 -8
  131. package/patterns/agent-tool-call/agent-tool-call.examples.html +1 -1
  132. package/patterns/approvals/approvals.examples.html +6 -6
  133. package/patterns/audit-log/audit-log.examples.html +1 -1
  134. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.html +4 -4
  135. package/patterns/chart-in-card/chart-in-card.examples.html +124 -10
  136. package/patterns/chart-in-card/chart-in-card.examples.js +37 -0
  137. package/patterns/comments-and-collaboration/comments-and-collaboration.examples.html +5 -5
  138. package/patterns/conversion-funnel/conversion-funnel.html +2 -2
  139. package/patterns/data-tables-inline-edit-and-tree/data-tables-inline-edit-and-tree.examples.html +2 -2
  140. package/patterns/diff-review/diff-review.examples.html +6 -6
  141. package/patterns/editor-shell/editor-shell.examples.html +3 -3
  142. package/patterns/export-flow/export-flow.examples.html +2 -2
  143. package/patterns/filter-bar/filter-bar.examples.html +2 -2
  144. package/patterns/forms-conditional-and-autocomplete/forms-conditional-and-autocomplete.examples.html +2 -2
  145. package/patterns/inline-dialog/inline-dialog.examples.html +2 -2
  146. package/patterns/marketing-engagement/marketing-engagement.examples.html +4 -4
  147. package/patterns/notifications-bell-and-digest/notifications-bell-and-digest.examples.html +1 -1
  148. package/patterns/permissions-matrix/permissions-matrix.examples.html +1 -1
  149. package/patterns/permissions-sharing/permissions-sharing.examples.html +2 -2
  150. package/patterns/profile-public-and-verification/profile-public-and-verification.examples.html +4 -4
  151. package/patterns/search-discovery/search-discovery.examples.html +2 -2
  152. package/styles/colors/semantics/features.css +8 -1
  153. package/styles/components.css +0 -4
  154. package/styles/type/roles.css +29 -9
  155. package/traits/arrow-grid-nav/arrow-grid-nav.js +1 -1
  156. package/traits/resize-observer/resize-observer.js +1 -1
  157. package/components/color-picker/color-picker.a2ui.json +0 -148
  158. package/components/color-picker/color-picker.class.js +0 -46
  159. package/components/color-picker/color-picker.css +0 -14
  160. package/components/color-picker/color-picker.d.ts +0 -99
  161. package/components/color-picker/color-picker.examples.md +0 -19
  162. package/components/color-picker/color-picker.js +0 -17
  163. package/components/color-picker/color-picker.yaml +0 -175
  164. package/components/datetime-picker/datetime-picker.a2ui.json +0 -256
  165. package/components/datetime-picker/datetime-picker.class.js +0 -58
  166. package/components/datetime-picker/datetime-picker.css +0 -11
  167. package/components/datetime-picker/datetime-picker.d.ts +0 -87
  168. package/components/datetime-picker/datetime-picker.examples.md +0 -25
  169. package/components/datetime-picker/datetime-picker.js +0 -17
  170. package/components/datetime-picker/datetime-picker.yaml +0 -254
  171. package/components/progress-row/progress-row.a2ui.json +0 -107
  172. package/components/progress-row/progress-row.class.js +0 -118
  173. package/components/progress-row/progress-row.css +0 -60
  174. package/components/progress-row/progress-row.d.ts +0 -24
  175. package/components/progress-row/progress-row.examples.md +0 -7
  176. package/components/progress-row/progress-row.js +0 -17
  177. package/components/progress-row/progress-row.yaml +0 -85
  178. package/components/toggle-group/toggle-group.a2ui.json +0 -148
  179. package/components/toggle-group/toggle-group.class.js +0 -195
  180. package/components/toggle-group/toggle-group.css +0 -127
  181. package/components/toggle-group/toggle-group.d.ts +0 -50
  182. package/components/toggle-group/toggle-group.examples.md +0 -33
  183. package/components/toggle-group/toggle-group.js +0 -18
  184. package/components/toggle-group/toggle-group.yaml +0 -135
  185. package/components/toggle-group/toggle-option.a2ui.json +0 -86
  186. package/components/toggle-group/toggle-option.yaml +0 -75
@@ -35,7 +35,11 @@
35
35
  }
36
36
 
37
37
  /* Position variants — drive flex-direction. DOM placement still wins for
38
- actual layout; these tune the internal row direction. */
38
+ actual layout; these tune the internal row direction. Pre-ADR-0074
39
+ fallback: superseded below by a resolved [data-ratio-resolved] bucket
40
+ whenever one is in effect (an explicit [ratio] pin, or a [for]-bound
41
+ chart's own mirrored bucket) — a legend with neither keeps this exact
42
+ behavior, unchanged. */
39
43
  :scope[position="top"],
40
44
  :scope[position="bottom"] {
41
45
  flex-direction: row;
@@ -48,6 +52,32 @@
48
52
  align-items: flex-start;
49
53
  }
50
54
 
55
+ /* Ratio-resolved layout buckets (ADR-0074, gh#1624 plan step 5, REQ-R-005).
56
+ Same selector specificity as the [position] rules above — placed AFTER
57
+ them in source order so a resolved bucket always wins the cascade over
58
+ a stale/default [position] on the same element. */
59
+
60
+ /* 3:2 — horizontal row (beside/below the chart). */
61
+ :scope[data-ratio-resolved="3:2"] {
62
+ display: flex;
63
+ flex-direction: row;
64
+ justify-content: flex-start;
65
+ }
66
+
67
+ /* 1:1 — wrapped 2-column grid. */
68
+ :scope[data-ratio-resolved="1:1"] {
69
+ display: grid;
70
+ grid-template-columns: repeat(2, minmax(0, 1fr));
71
+ align-items: start;
72
+ }
73
+
74
+ /* 2:3 — vertical stacked list. */
75
+ :scope[data-ratio-resolved="2:3"] {
76
+ display: flex;
77
+ flex-direction: column;
78
+ align-items: flex-start;
79
+ }
80
+
51
81
  /* Rows are <badge-ui> chips. We override badge-ui's default tokens
52
82
  to give them a quieter, click-to-toggle appearance — transparent
53
83
  bg by default (so they read as inline text not chips), highlighted
@@ -93,6 +123,16 @@
93
123
  opacity: 0.4;
94
124
  }
95
125
 
126
+ /* De-emphasized (REQ-R-007) rows — a mirrored chart's own muted series
127
+ (e.g. composed@1:1's secondary line). Distinct from :not([data-active])
128
+ above: this is the chart's OWN designed treatment for a still-visible
129
+ series, not a user-toggled-off one; the swatch color itself is set
130
+ inline per-row (matches the neutral token, not opacity) so only the
131
+ label's --badge-fg needs the muted tier here. */
132
+ badge-ui[data-row][data-deemphasized] {
133
+ --badge-fg: var(--chart-legend-fg-inactive);
134
+ }
135
+
96
136
  /* Swatch is composed via <swatch-ui shape="…">; per-shape styling
97
137
  lives in swatch.css. The legend just hands its [shape] attr through
98
138
  and writes --swatch-color inline. Pre-2026-05-01 this file owned a
@@ -101,3 +141,27 @@
101
141
  rule (cascade leak). Composing the primitive moves the styling to
102
142
  one place. */
103
143
  }
144
+
145
+ /* ─────────────────────────────────────────────────────────────────
146
+ gh#1624 plan step 7 — full-bleed × legend horizontal breathing room.
147
+
148
+ Deliberately OUTSIDE `@scope (chart-legend-ui)`, same reason as
149
+ chart.css's own `card-ui[padding="none"] chart-ui` rule: this needs to
150
+ match an ANCESTOR of the scoping root. `--chart-legend-px` defaults to
151
+ 0 because a legend normally sits inside a card section that already
152
+ supplies horizontal inset via `--card-inset` (card.css's own
153
+ margin-based section model); `card-ui[padding="none"]` zeroes that
154
+ inset CARD-WIDE (every section, not just the chart's), so a legend
155
+ paired with a full-bleed chart lost its own horizontal clearance too —
156
+ confirmed via browser probe: badge rows sat ~1px from the card's
157
+ rounded edge, at real risk of visual crowding against the corner-radius
158
+ `overflow: hidden` (card.css :scope). The chart itself doesn't need this
159
+ — its own internal plot margins (REQ-R-004) already supply clearance
160
+ regardless of the card's inset — but the legend's chip rows have no
161
+ equivalent internal margin of their own. Restoring `--chart-legend-px`
162
+ only (not `-py`, which the legend already carries unconditionally) is
163
+ the minimal fix: vertical spacing between the chart and legend sections
164
+ is unaffected, only the legend's own left/right clearance is restored. */
165
+ card-ui[padding="none"] chart-legend-ui {
166
+ --chart-legend-px: var(--a-space-4);
167
+ }
@@ -24,20 +24,20 @@ export interface ChartLegendToggleEventDetail {
24
24
  export type ChartLegendToggleEvent = CustomEvent<ChartLegendToggleEventDetail>;
25
25
 
26
26
  export class UIChartLegend extends UIElement {
27
- /** JSON array of {key, label, slot?, pct?} legend items. Takes precedence over [for] when both are provided. */
27
+ /** JSON array of {key, label, slot?, pct?, deemphasized?} legend items. Takes precedence over [for] when both are provided. `deemphasized` (REQ-R-007) mutes the row's swatch/label to the same muted-neutral tier chart-ui's own internal legend uses for a de-emphasized series (e.g. `composed@1:1`'s secondary line) — mirrored automatically from a `[for]`-bound chart's own `.legendData`, or settable explicitly here. */
28
28
  items: string;
29
29
  /** id-ref of a chart-ui / heatmap-ui to mirror series from. */
30
30
  for: string;
31
- /** Canonical opt-in spelling (ADR-0063, gh#1563) replacing `static`'s opt-out polarity. Rows are interactive <button>-role badges by default — this default stays `true` in 0.8.42 (deliberately NOT flipped yet; the 0.9.0 cut inverts it to `false` after a full consumer scan of every `<chart-legend-ui>` tag per the ADR). */
31
+ /** Canonical opt-in spelling (ADR-0063, gh#1563) the deprecated `static` opt-out alias was cut in 0.8.43 (gh#1617). Rows are interactive <button>-role badges by default — this default stays `true` (deliberately NOT flipped yet; the 0.9.0 cut inverts it to `false` after a full consumer scan of every `<chart-legend-ui>` tag per the ADR). */
32
32
  interactive: boolean;
33
33
  /** Series-toggle mode emitted via the `toggle` event. `hide` removes the series from the render; `opacity` fades it. Wired via [for] on chart-ui. */
34
34
  onToggle: 'hide' | 'opacity';
35
- /** Layout hint — drives flex-direction. Actual placement follows DOM order. */
35
+ /** Layout hint — drives flex-direction. Actual placement follows DOM order. Superseded by a resolved `ratio` bucket (below) whenever one is in effect; this is the pre-ADR-0074 fallback for a legend with neither an explicit `ratio` nor a `[for]`-bound chart. */
36
36
  position: 'top' | 'bottom' | 'left' | 'right';
37
+ /** Chart 2.0 legend layout bucket (ADR-0074, gh#1624 plan step 5, REQ-R-005): 3:2 renders a horizontal row, 1:1 a wrapped 2-column grid, 2:3 a vertical stacked list. An explicit value PINS the bucket regardless of any bound chart. Unset (default) auto-mirrors the `[for]`-bound chart's own resolved `data-ratio-resolved` bucket — the legend never runs its own container-query classification, since its own box is typically a thin strip with no studied aspect of its own. With neither a pin nor a bound chart, no bucket resolves and `position`'s flex-direction rules apply unchanged. The resolved bucket reflects read-only onto the host as `data-ratio-resolved`, mirroring chart-ui's own convention. */
38
+ ratio: '3:2' | '1:1' | '2:3';
37
39
  /** Swatch shape. Maps to badge-ui's icon for dot/square variants. */
38
40
  shape: 'dot' | 'square' | 'line' | 'dashed';
39
- /** DEPRECATED (ADR-0063, gh#1563) — use `interactive` instead. When set (and `interactive` is absent), rows are non-interactive <span>s (no click, no toggle). Kept working as a dual-read compat shim (one-time console.warn when it's the name that resolves). Removed in 0.9.0. */
40
- static: boolean;
41
41
 
42
42
  addEventListener(type: 'toggle', listener: (ev: ChartLegendToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
43
43
  addEventListener<K extends keyof HTMLElementEventMap>(
@@ -12,11 +12,11 @@
12
12
  <chart-legend-ui id="legend-bottom" shape="dot" position="bottom" items='[{"key":"a","label":"Series A","slot":0},{"key":"b","label":"Series B","slot":1},{"key":"c","label":"Series C","slot":2}]'></chart-legend-ui>
13
13
  ```
14
14
 
15
- ## formirror a chart's legendData
15
+ ## ratiomirrors a bound chart's resolved ratio (ADR-0074)
16
16
 
17
17
  ```html
18
- <div style="display:flex; flex-direction:column; gap:var(--a-space-2);">
19
- <chart-ui id="demo-chart" type="multi-line" x="month" y="revenue,users,churn"></chart-ui>
20
- <chart-legend-ui id="legend-for" for="demo-chart" shape="line"></chart-legend-ui>
18
+ <div style="display:flex; flex-direction:column; gap:var(--a-space-2); width:360px;">
19
+ <chart-ui id="ratio-chart-32" type="multi-line" ratio="3:2" x="month" y="revenue,users,churn"></chart-ui>
20
+ <chart-legend-ui id="ratio-legend-32" for="ratio-chart-32" shape="line"></chart-legend-ui>
21
21
  </div>
22
22
  ```
@@ -23,8 +23,12 @@ props:
23
23
  reflect: true
24
24
  items:
25
25
  description: >-
26
- JSON array of {key, label, slot?, pct?} legend items. Takes precedence
27
- over [for] when both are provided.
26
+ JSON array of {key, label, slot?, pct?, deemphasized?} legend items.
27
+ Takes precedence over [for] when both are provided. `deemphasized`
28
+ (REQ-R-007) mutes the row's swatch/label to the same muted-neutral
29
+ tier chart-ui's own internal legend uses for a de-emphasized series
30
+ (e.g. `composed@1:1`'s secondary line) — mirrored automatically from
31
+ a `[for]`-bound chart's own `.legendData`, or settable explicitly here.
28
32
  type: string
29
33
  default: ''
30
34
  shape:
@@ -38,7 +42,11 @@ props:
38
42
  - dashed
39
43
  reflect: true
40
44
  position:
41
- description: Layout hint — drives flex-direction. Actual placement follows DOM order.
45
+ description: >-
46
+ Layout hint — drives flex-direction. Actual placement follows DOM
47
+ order. Superseded by a resolved `ratio` bucket (below) whenever one
48
+ is in effect; this is the pre-ADR-0074 fallback for a legend with
49
+ neither an explicit `ratio` nor a `[for]`-bound chart.
42
50
  type: string
43
51
  default: bottom
44
52
  enum:
@@ -47,22 +55,34 @@ props:
47
55
  - left
48
56
  - right
49
57
  reflect: true
50
- static:
58
+ ratio:
51
59
  description: >-
52
- DEPRECATED (ADR-0063, gh#1563) use `interactive` instead. When set
53
- (and `interactive` is absent), rows are non-interactive <span>s (no
54
- click, no toggle). Kept working as a dual-read compat shim (one-time
55
- console.warn when it's the name that resolves). Removed in 0.9.0.
56
- type: boolean
57
- default: false
60
+ Chart 2.0 legend layout bucket (ADR-0074, gh#1624 plan step 5,
61
+ REQ-R-005): 3:2 renders a horizontal row, 1:1 a wrapped 2-column
62
+ grid, 2:3 a vertical stacked list. An explicit value PINS the
63
+ bucket regardless of any bound chart. Unset (default) auto-mirrors
64
+ the `[for]`-bound chart's own resolved `data-ratio-resolved` bucket
65
+ the legend never runs its own container-query classification,
66
+ since its own box is typically a thin strip with no studied aspect
67
+ of its own. With neither a pin nor a bound chart, no bucket
68
+ resolves and `position`'s flex-direction rules apply unchanged. The
69
+ resolved bucket reflects read-only onto the host as
70
+ `data-ratio-resolved`, mirroring chart-ui's own convention.
71
+ type: string
72
+ default: ""
73
+ enum:
74
+ - "3:2"
75
+ - "1:1"
76
+ - "2:3"
58
77
  reflect: true
59
78
  interactive:
60
79
  description: >-
61
- Canonical opt-in spelling (ADR-0063, gh#1563) replacing `static`'s
62
- opt-out polarity. Rows are interactive <button>-role badges by
63
- default — this default stays `true` in 0.8.42 (deliberately NOT
64
- flipped yet; the 0.9.0 cut inverts it to `false` after a full
65
- consumer scan of every `<chart-legend-ui>` tag per the ADR).
80
+ Canonical opt-in spelling (ADR-0063, gh#1563) the deprecated
81
+ `static` opt-out alias was cut in 0.8.43 (gh#1617). Rows are
82
+ interactive <button>-role badges by default — this default stays
83
+ `true` (deliberately NOT flipped yet; the 0.9.0 cut inverts it to
84
+ `false` after a full consumer scan of every `<chart-legend-ui>` tag
85
+ per the ADR).
66
86
  type: boolean
67
87
  default: true
68
88
  reflect: true
@@ -80,7 +100,7 @@ props:
80
100
  events:
81
101
  toggle:
82
102
  description: >-
83
- Fires on row click (non-static). Detail: {key, active, mode}. `active` is
103
+ Fires on row click when interactive. Detail: {key, active, mode}. `active` is
84
104
  the new state (true=visible). Consumers (or chart-ui via [for]) wire
85
105
  this to series visibility.
86
106
  detail:
@@ -104,9 +124,7 @@ states:
104
124
  - name: idle
105
125
  description: Default, ready for interaction.
106
126
  - name: interactive
107
- description: Rows are <button>s. Default unless [static].
108
- - name: static
109
- description: Rows are <span>s. No click handler, no toggle affordance.
127
+ description: Rows are <button>s (the default). When false, rows are <span>s — no click handler, no toggle affordance.
110
128
  traits: []
111
129
  tokens: {}
112
130
  a2ui:
@@ -115,8 +133,10 @@ a2ui:
115
133
  reason: 'Legend pattern.'
116
134
  - rule: 'Pairs with <chart-ui> via [for] id-ref (auto-bidirectional series toggling) or via items= for standalone use.'
117
135
  reason: 'Composition contract.'
118
- - rule: 'position attribute (top|bottom|left|right) places legend relative to its chart; static= disables interactivity.'
136
+ - rule: 'position attribute (top|bottom|left|right) places legend relative to its chart; interactive="false" disables interactivity.'
119
137
  reason: 'Layout + interaction knobs.'
138
+ - rule: 'ratio attribute (3:2|1:1|2:3, ADR-0074) selects the legend layout shape (row/grid/list); left unset it auto-mirrors a [for]-bound chart''s own resolved ratio.'
139
+ reason: 'Ratio-responsive layout contract, gh#1624 plan step 5.'
120
140
  anti_patterns: []
121
141
  examples:
122
142
  - name: standalone-with-items
@@ -129,6 +149,16 @@ examples:
129
149
  "items": "[{\"key\":\"revenue\",\"label\":\"Revenue\",\"slot\":0},{\"key\":\"users\",\"label\":\"Users\",\"slot\":1}]"
130
150
  }
131
151
  ]
152
+ - name: ratio-pinned-grid
153
+ description: Standalone legend pinned to the 1:1 (2-col grid) layout bucket.
154
+ a2ui: >-
155
+ [
156
+ {
157
+ "id": "legend", "component": "ChartLegend",
158
+ "ratio": "1:1",
159
+ "items": "[{\"key\":\"revenue\",\"label\":\"Revenue\",\"slot\":0},{\"key\":\"users\",\"label\":\"Users\",\"slot\":1},{\"key\":\"churn\",\"label\":\"Churn\",\"slot\":2},{\"key\":\"nps\",\"label\":\"NPS\",\"slot\":3}]"
160
+ }
161
+ ]
132
162
  - name: mirror-chart-by-id
133
163
  description: Legend mirrors a named chart's series data.
134
164
  a2ui: >-
@@ -17,6 +17,14 @@ check-ui[indeterminate] [slot="box"] {
17
17
  background: var(--check-bg-checked);
18
18
  border-color: var(--check-border-checked);
19
19
  }
20
+ /* gh#1596 — a checked/indeterminate box kept its full primary fill when
21
+ disabled (only the label fg dimmed); higher specificity (2 attrs) than
22
+ the rule above wins without reordering. */
23
+ check-ui[checked][disabled] [slot="box"],
24
+ check-ui[indeterminate][disabled] [slot="box"] {
25
+ background: var(--check-bg-checked-disabled);
26
+ border-color: var(--check-bg-checked-disabled);
27
+ }
20
28
  check-ui[checked] {
21
29
  --_icon-w: calc(var(--check-size) * 0.3);
22
30
  --_icon-h: calc(var(--check-size) * 0.55);
@@ -61,6 +69,7 @@ check-ui[indeterminate] {
61
69
 
62
70
  /* ── State: disabled ── */
63
71
  --check-fg-disabled: var(--a-ui-text-disabled);
72
+ --check-bg-checked-disabled: var(--a-ui-bg-disabled);
64
73
 
65
74
  /* ── Check icon (CSS border trick, no SVG) ── */
66
75
  --_icon-w: 0;
@@ -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/ColorArea.json",
4
4
  "title": "ColorArea",
5
- "description": "OKLCH-native color picker with 2D area and H/C/L sliders. Form-associated input emitting OKLCH color strings; canonical color authoring surface in the AdiaUI token system. Use for color input in design tools or theming UIs; for simple color swatches use <swatch-ui> or <color-input-ui> instead. Renamed from `<color-picker-ui>` (ADR-0063, gh#1563 — `-picker` is reserved for the outer trigger + popover composite shape; this is the inline substrate, mirroring <calendar-grid-ui>'s naming precedent). `<color-picker-ui>` is now a thin deprecated alias subclassing this component.",
5
+ "description": "OKLCH-native color picker with 2D area and H/C/L sliders. Form-associated input emitting OKLCH color strings; canonical color authoring surface in the AdiaUI token system. Use for color input in design tools or theming UIs; for simple color swatches use <swatch-ui> or <color-input-ui> instead. Renamed from `<color-picker-ui>` (ADR-0063, gh#1563 — `-picker` is reserved for the outer trigger + popover composite shape; this is the inline substrate, mirroring <calendar-grid-ui>'s naming precedent). `<color-picker-ui>` was cut in 0.8.43 (gh#1617) this is the sole tag now.",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -15,8 +15,8 @@
15
15
  * <color-area-ui value="#3b82f6" format="hex"></color-area-ui>
16
16
  *
17
17
  * OKLCH-native color picker with 2D area + H/C/L sliders (ADR-0063,
18
- * gh#1563 — renamed from `<color-picker-ui>`, which is now a thin
19
- * deprecated alias subclassing this class; see ../color-picker/color-picker.class.js).
18
+ * gh#1563 — renamed from `<color-picker-ui>`, which was cut in 0.8.43,
19
+ * gh#1617; this is the sole tag now).
20
20
  *
21
21
  * Layout:
22
22
  * [═══════════ color area (chroma x lightness) ═══════════]
@@ -1,10 +1,7 @@
1
- /* ADR-0063 (gh#1563) — `@scope` matches by literal tag name, not JS
2
- * prototype chain: `<color-picker-ui>` subclasses `UIColorArea` (see
3
- * ../color-picker/color-picker.class.js) but needs its OWN tag named in
4
- * this scope root to actually receive the styling — same shape as
5
- * calendar-picker.css's `@scope (calendar-picker-ui, datetime-picker-ui)`
6
- * for its own deprecated alias. */
7
- @scope (color-area-ui, color-picker-ui) {
1
+ /* ADR-0063 (gh#1563) — `color-picker-ui` was a thin alias subclassing
2
+ * `UIColorArea`; cut in 0.8.43 (gh#1617). `color-area-ui` is the sole tag
3
+ * now. */
4
+ @scope (color-area-ui) {
8
5
  :where(:scope) {
9
6
  /* ── Tokens ── */
10
7
  --color-area-gap: var(--a-space-2);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `<color-area-ui>` — OKLCH-native color picker with 2D area and H/C/L sliders. Form-associated input emitting OKLCH color strings; canonical color authoring surface in the AdiaUI token system. Use for color input in design tools or theming UIs; for simple color swatches use <swatch-ui> or <color-input-ui> instead. Renamed from `<color-picker-ui>` (ADR-0063, gh#1563 — `-picker` is reserved for the outer trigger + popover composite shape; this is the inline substrate, mirroring <calendar-grid-ui>'s naming precedent). `<color-picker-ui>` is now a thin deprecated alias subclassing this component.
2
+ * `<color-area-ui>` — OKLCH-native color picker with 2D area and H/C/L sliders. Form-associated input emitting OKLCH color strings; canonical color authoring surface in the AdiaUI token system. Use for color input in design tools or theming UIs; for simple color swatches use <swatch-ui> or <color-input-ui> instead. Renamed from `<color-picker-ui>` (ADR-0063, gh#1563 — `-picker` is reserved for the outer trigger + popover composite shape; this is the inline substrate, mirroring <calendar-grid-ui>'s naming precedent). `<color-picker-ui>` was cut in 0.8.43 (gh#1617) this is the sole tag now.
3
3
  *
4
4
  * @see https://ui-kit.exe.xyz/site/components/color-area
5
5
  *
@@ -15,8 +15,8 @@ description: >-
15
15
  or <color-input-ui> instead. Renamed from `<color-picker-ui>`
16
16
  (ADR-0063, gh#1563 — `-picker` is reserved for the outer trigger +
17
17
  popover composite shape; this is the inline substrate, mirroring
18
- <calendar-grid-ui>'s naming precedent). `<color-picker-ui>` is now a
19
- thin deprecated alias subclassing this component.
18
+ <calendar-grid-ui>'s naming precedent). `<color-picker-ui>` was cut in
19
+ 0.8.43 (gh#1617) this is the sole tag now.
20
20
  # Per ADR-0027 — primitives that programmatically create other primitives
21
21
  # do NOT auto-import them. Consumer (or demo shell) must explicitly import.
22
22
  composes:
@@ -115,7 +115,7 @@ a2ui:
115
115
  reason: 'Canonical color-authoring surface.'
116
116
  - rule: 'For simple color swatches (read-only display) use <swatch-ui>; for hex/rgb text input use <color-input-ui>.'
117
117
  reason: 'Surface boundary.'
118
- - rule: 'Renamed from <color-picker-ui> (ADR-0063, gh#1563); the old tag is a deprecated alias that still works new generation should reach for ColorArea directly.'
118
+ - rule: 'Renamed from <color-picker-ui> (ADR-0063, gh#1563); the old tag was cut in 0.8.43 (gh#1617)ColorArea is the sole tag now.'
119
119
  reason: 'Picker-naming convention: -picker names the outer trigger+popover composite, never the inline substrate.'
120
120
  - rule: 'Output format defaults to oklch(); set format= to override (hex, rgb, hsl).'
121
121
  reason: 'Format knob.'
@@ -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/ColorInput.json",
4
4
  "title": "ColorInput",
5
- "description": "Compact form-bearing color input — opens a popover-anchored\n`<color-area-ui>` from an inline swatch button. §302 (v0.5.12,\nFEEDBACK-29 re-bucket from v0.6.0). Canonicalizes the USAGE.md §221f\nOption B recipe (popover + button + color-area) into a single\nform-associated tag for inline form contexts (settings drawer \"source\ncolor\" field, swatch-row inline-edit, etc.). Composes `<color-area-ui>`\n(ADR-0063, gh#1563 — renamed from `<color-picker-ui>`, which is now a\ndeprecated alias); `color-input-ui`'s own tag/name is unaffected.",
5
+ "description": "Compact form-bearing color input — opens a popover-anchored\n`<color-area-ui>` from an inline swatch button. §302 (v0.5.12,\nFEEDBACK-29 re-bucket from v0.6.0). Canonicalizes the USAGE.md §221f\nOption B recipe (popover + button + color-area) into a single\nform-associated tag for inline form contexts (settings drawer \"source\ncolor\" field, swatch-row inline-edit, etc.). Composes `<color-area-ui>`\n(ADR-0063, gh#1563 — renamed from `<color-picker-ui>`, cut in 0.8.43,\ngh#1617); `color-input-ui`'s own tag/name is unaffected.",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -32,7 +32,7 @@
32
32
  * </color-input-ui>
33
33
  *
34
34
  * Composes `<color-area-ui>` (ADR-0063, gh#1563 — renamed from
35
- * `<color-picker-ui>`, which is now a deprecated alias).
35
+ * `<color-picker-ui>`, cut in 0.8.43, gh#1617).
36
36
  *
37
37
  * Form-associated via UIFormElement + ElementInternals.
38
38
  */
@@ -12,8 +12,8 @@ description: |-
12
12
  Option B recipe (popover + button + color-area) into a single
13
13
  form-associated tag for inline form contexts (settings drawer "source
14
14
  color" field, swatch-row inline-edit, etc.). Composes `<color-area-ui>`
15
- (ADR-0063, gh#1563 — renamed from `<color-picker-ui>`, which is now a
16
- deprecated alias); `color-input-ui`'s own tag/name is unaffected.
15
+ (ADR-0063, gh#1563 — renamed from `<color-picker-ui>`, cut in 0.8.43,
16
+ gh#1617); `color-input-ui`'s own tag/name is unaffected.
17
17
  # Per ADR-0027 — primitives that programmatically create other primitives
18
18
  # do NOT auto-import them. The consumer (or demo shell) explicitly imports
19
19
  # the composed primitives. This element creates `<button-ui>` +
@@ -339,6 +339,9 @@
339
339
  "--combobox-match-bg": {
340
340
  "description": "Background for `<mark>` spans that highlight matched substrings"
341
341
  },
342
+ "--combobox-min-width": {
343
+ "description": "Intrinsic min-width floor on the host (default `20ch`, matching input-ui's own `--input-min-width` UA-baseline derivation) so a combobox in a shrinking flex/grid cell doesn't crush to unusable width. Set to `0` to opt back into full collapse (gh#1633)."
344
+ },
342
345
  "--combobox-option-bg-active": {
343
346
  "description": "Background for the currently active (arrow-navigated) option"
344
347
  },
@@ -41,6 +41,7 @@ import { UIFormElement } from '../../core/form.js';
41
41
  import { anchorPopover } from '../../core/anchor.js';
42
42
  import { untracked } from '../../core/signals.js';
43
43
  import { logicalSlotted } from '../../core/logical-children.js';
44
+ import { syncAutoAriaLabel } from '../../core/a11y.js';
44
45
 
45
46
  function escapeHTML(s) {
46
47
  return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
@@ -103,6 +104,10 @@ export class UICombobox extends UIFormElement {
103
104
  #anchorCleanup = null;
104
105
  #rafId = null;
105
106
  #instanceId = `combobox-${++cbInstanceSeq}`;
107
+ // gh#1647: tracks the aria-label VALUE this element itself last derived
108
+ // from `placeholder` (undefined when none) — value-tracking guard
109
+ // ported from tag.class.js/select.class.js (gh#1644/#1646).
110
+ #lastAutoAriaLabel = undefined;
106
111
 
107
112
  // ── Stable handler refs (so removeEventListener finds them) ──
108
113
  #onInputEvent = () => this.#handleInput();
@@ -176,14 +181,10 @@ export class UICombobox extends UIFormElement {
176
181
  this.#labelEl.style.display = this.label ? '' : 'none';
177
182
  }
178
183
 
179
- // aria-label fallback when no [label] is set.
180
- if (this.label) {
181
- this.removeAttribute('aria-label');
182
- } else if (this.placeholder) {
183
- this.setAttribute('aria-label', this.placeholder);
184
- } else {
185
- this.removeAttribute('aria-label');
186
- }
184
+ // aria-label fallback when no [label] is set (gh#1647) — never clobber
185
+ // a consumer's own aria-label (value-tracking guard, gh#1644/#1646).
186
+ const ariaSource = this.label ? '' : (this.placeholder || '');
187
+ this.#lastAutoAriaLabel = syncAutoAriaLabel(this, this.#lastAutoAriaLabel, ariaSource);
187
188
 
188
189
  // Toggle clear-button visibility when [clearable].
189
190
  if (this.#clearBtn) {
@@ -6,6 +6,15 @@
6
6
  --combobox-height: var(--a-size);
7
7
  --combobox-px: var(--a-ui-px);
8
8
  --combobox-radius: var(--a-radius);
9
+ /* gh#1633 / ADIA2-9136 (adiav2#12791) — the host's own `min-width: 0`
10
+ below (the ellipsis-reset trick, kept for [data-input] inside this
11
+ floor) had no intrinsic lower bound, so a combobox in a shrinking
12
+ flex/grid cell crushed to unusable width — the same gap already
13
+ fixed on --input-min-width (this family's reference; see input.css,
14
+ gh#781) and on --select-min-width (same fix, select.css). Same
15
+ ch-based UA-baseline derivation. Override to 0 to opt back into
16
+ full collapse. */
17
+ --combobox-min-width: 20ch;
9
18
 
10
19
  /* ── Typography ── */
11
20
  --combobox-font-size: var(--a-ui-size);
@@ -62,7 +71,11 @@
62
71
  flex-direction: column;
63
72
  gap: var(--combobox-gap);
64
73
  position: relative;
65
- min-width: 0;
74
+ /* Floored, not zeroed — see --combobox-min-width above (gh#1633).
75
+ [data-input]'s own `min-width: 0` further down stays 0: that one
76
+ exists so its value text can ellipsis-truncate INSIDE this floor,
77
+ not to guard the host's own collapse. */
78
+ min-width: var(--combobox-min-width);
66
79
  /* font-family floor on the host — internal input/options inherit it. */
67
80
  font-family: var(--combobox-font-family, var(--a-font-family-ui));
68
81
  font-size: var(--combobox-font-size);
@@ -326,9 +339,17 @@ combobox-ui [data-listbox] [role="group"] [data-group-label] {
326
339
  white-space: nowrap;
327
340
  }
328
341
 
329
- combobox-ui [data-empty],
330
- combobox-ui [data-loading],
331
- combobox-ui [data-footer] {
342
+ /* Scoped to `[data-listbox]`'s own markers — gh#1700, same shape as
343
+ gh#1697/#1698. The input span (`[data-input]`) toggles the SAME
344
+ `data-empty` attribute for an unrelated reason (gating its own
345
+ `::before` placeholder pseudo) — a bare, unscoped `combobox-ui
346
+ [data-empty]` selector matched BOTH uses, and (being (0,1,1)) outranked
347
+ `[data-input]`'s own (0,1,0) padding/color/font-size, one property away
348
+ from repeating the command-ui leak. Scoping to the listbox container
349
+ removes the collision at its root. */
350
+ combobox-ui [data-listbox] [data-empty],
351
+ combobox-ui [data-listbox] [data-loading],
352
+ combobox-ui [data-listbox] [data-footer] {
332
353
  padding: var(--a-space-2) var(--a-ui-px);
333
354
  color: var(--a-ui-text-muted);
334
355
  font-size: var(--a-ui-size);
@@ -257,6 +257,12 @@ tokens:
257
257
  tinted selected row.
258
258
  --combobox-match-bg:
259
259
  description: Background for `<mark>` spans that highlight matched substrings
260
+ --combobox-min-width:
261
+ description: >-
262
+ Intrinsic min-width floor on the host (default `20ch`, matching
263
+ input-ui's own `--input-min-width` UA-baseline derivation) so a
264
+ combobox in a shrinking flex/grid cell doesn't crush to unusable
265
+ width. Set to `0` to opt back into full collapse (gh#1633).
260
266
  requiredIcons:
261
267
  - caret-down
262
268
  - x-circle
@@ -221,7 +221,23 @@
221
221
  }
222
222
 
223
223
  /* ── Empty state ── */
224
- [data-empty] {
224
+ /* Scoped to `[slot="list"]`'s own `[data-empty]` — gh#1697. The search
225
+ input (`& > header [slot="input"]`) toggles the SAME `data-empty`
226
+ attribute for an unrelated reason (gating its own `::before`
227
+ placeholder pseudo, per REQ above) — a bare, unscoped `[data-empty]`
228
+ selector matched BOTH uses, so this rule's `text-align: center` leaked
229
+ onto the input span whenever it was empty, centering the placeholder
230
+ (and, structurally, any text a consumer's own script inserted while
231
+ the attribute was still present). `padding`/`color` never leaked in
232
+ practice — `& > header [slot="input"]`'s own compound selector
233
+ (header-descendant + attribute, (0,1,1)) already outranks the bare
234
+ `[data-empty]` (0,1,0) for those two properties — but `text-align` had
235
+ no competing declaration anywhere else in this file, so the leaked
236
+ value won by default with nothing to lose against. Scoping the
237
+ selector to the list container removes the collision at its root
238
+ instead of only patching the one property a screenshot happened to
239
+ catch. */
240
+ [slot="list"] [data-empty] {
225
241
  padding: var(--command-py) var(--command-px);
226
242
  color: var(--command-empty-fg);
227
243
  text-align: center;
@@ -56,6 +56,8 @@ export type ContextMenuSelectEvent = CustomEvent<ContextMenuSelectEventDetail>;
56
56
  export class UIContextMenu extends UIElement {
57
57
  /** CSS selector(s) for target element(s). Empty = use default-slot child. */
58
58
  for: string;
59
+ /** Long-press duration (ms) on touch devices to open the menu. */
60
+ longPressMs: number;
59
61
  /** Programmatic open state. Set true to open at target center. */
60
62
  open: boolean;
61
63
 
@@ -236,6 +236,9 @@
236
236
  "--drilldown-row-px": {
237
237
  "description": "Inline padding of each row."
238
238
  },
239
+ "--drilldown-row-py": {
240
+ "description": "Block padding of each row (grows a row past --drilldown-row-height once content, e.g. a two-line label+meta row, exceeds it)."
241
+ },
239
242
  "--drilldown-row-radius": {
240
243
  "description": "Border radius of each row."
241
244
  }
@@ -4,6 +4,7 @@
4
4
  --drilldown-row-height: var(--a-size, 2.25rem);
5
5
  --drilldown-row-radius: var(--a-radius-sm);
6
6
  --drilldown-row-px: var(--a-space-2);
7
+ --drilldown-row-py: var(--a-space-1-5);
7
8
  --drilldown-row-gap: var(--a-space-2);
8
9
  --drilldown-header-px: var(--a-space-3);
9
10
  --drilldown-header-py: var(--a-space-2);
@@ -189,13 +190,19 @@
189
190
  to { transform: none; opacity: 1; }
190
191
  }
191
192
 
192
- /* ── Rows ── */
193
+ /* ── Rows ──
194
+ min-height sets the single-line floor; padding-block (--drilldown-row-py,
195
+ matching menu-item-ui/action-item-ui's own row-density token) only grows
196
+ the row once content (e.g. a two-line label+meta row, gh#1591) exceeds
197
+ that floor — the two never stack into a taller one-liner because a
198
+ single-line row's content-box is shorter than the min-height already. */
193
199
  [role="option"] {
194
200
  display: flex;
195
201
  align-items: center;
196
202
  gap: var(--drilldown-row-gap);
197
203
  min-height: var(--drilldown-row-height);
198
204
  padding-inline: var(--drilldown-row-px);
205
+ padding-block: var(--drilldown-row-py);
199
206
  border-radius: var(--drilldown-row-radius);
200
207
  cursor: pointer;
201
208
  outline: none;
@@ -194,6 +194,8 @@ tokens:
194
194
  description: Border radius of each row.
195
195
  --drilldown-row-px:
196
196
  description: Inline padding of each row.
197
+ --drilldown-row-py:
198
+ description: Block padding of each row (grows a row past --drilldown-row-height once content, e.g. a two-line label+meta row, exceeds it).
197
199
  --drilldown-row-gap:
198
200
  description: Gap between row elements (dot / main / counts / chevron).
199
201
  --drilldown-bg-hover:
@@ -279,11 +279,11 @@ export class UIField extends UIElement {
279
279
  'input-ui', 'textarea-ui', 'select-ui', 'combobox-ui', 'search-ui',
280
280
  'check-ui', 'radio-ui', 'switch-ui', 'slider-ui', 'range-ui',
281
281
  'otp-input-ui', 'tags-input-ui', 'chat-input-ui', 'autocomplete-input-ui',
282
- 'datetime-picker-ui', 'date-range-picker-ui', 'calendar-picker-ui',
283
- // ADR-0063 (gh#1563) color-picker-ui's real implementation moved to
284
- // color-area-ui; color-picker-ui is now a thin deprecated alias. Both
285
- // tags need to resolve here since either may be the one actually used.
286
- 'color-area-ui', 'color-picker-ui', 'upload-ui', 'rating-ui', 'segmented-ui',
282
+ 'date-range-picker-ui', 'calendar-picker-ui',
283
+ // datetime-picker-ui / color-picker-ui cut in 0.8.43 (gh#1617,
284
+ // ADR-0063/gh#1372) — calendar-picker-ui / color-area-ui are the
285
+ // sole tags now.
286
+ 'color-area-ui', 'upload-ui', 'rating-ui', 'segmented-ui',
287
287
  'input', 'textarea', 'select',
288
288
  ]);
289
289
 
@@ -53,6 +53,11 @@
53
53
  "component": {
54
54
  "const": "Heatmap"
55
55
  },
56
+ "data": {
57
+ "description": "Cell data as a JSON array of `{ r, c, v, label? }` objects, or set the `.data` property directly with an already-parsed array. Parsed on connect if the attribute is present and `.data` hasn't already been set programmatically.",
58
+ "type": "string",
59
+ "default": ""
60
+ },
56
61
  "noLegend": {
57
62
  "description": "Hide the Less/More legend strip",
58
63
  "type": "boolean",
@@ -27,6 +27,8 @@ export class UIHeatmap extends UIElement {
27
27
  colorScheme: 'accent' | 'success' | 'warning' | 'danger' | 'info' | 'data-ramp';
28
28
  /** Column count */
29
29
  cols: number;
30
+ /** Cell data as a JSON array of `{ r, c, v, label? }` objects, or set the `.data` property directly with an already-parsed array. Parsed on connect if the attribute is present and `.data` hasn't already been set programmatically. */
31
+ data: string;
30
32
  /** Hide the Less/More legend strip */
31
33
  noLegend: boolean;
32
34
  /** Row count */