@adia-ai/a2ui 0.8.43 → 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.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog — @adia-ai/a2ui
|
|
2
2
|
|
|
3
|
+
## [0.8.44] — 2026-08-20
|
|
4
|
+
|
|
5
|
+
### Maintenance
|
|
6
|
+
- **Catalog rules text re-derived (gh#1669).** `input.yaml`'s `a2ui.rules` entry corrected — it falsely claimed an inline `[hint]` prop on `input-ui` (only `field-ui` has one); `catalog-a2ui_0_9_rules.txt` picks up the fix. No protocol/runtime API change.
|
|
7
|
+
|
|
3
8
|
## [0.8.43] — 2026-08-18
|
|
4
9
|
|
|
5
10
|
### Removed
|
|
@@ -5881,6 +5881,16 @@
|
|
|
5881
5881
|
"type": "boolean",
|
|
5882
5882
|
"default": false
|
|
5883
5883
|
},
|
|
5884
|
+
"ratio": {
|
|
5885
|
+
"description": "Chart 2.0 aspect-ratio bucket (ADR-0074). Unset (default) auto-snaps to the nearest of the three studied ratios by comparing the chart's own live box aspect against two midpoint boundaries (5:4 between 3:2/1:1, 4:5 between 1:1/2:3) — never interpolated; the resolved bucket reflects onto the host as `data-ratio-resolved`. Setting `ratio` explicitly pins that bucket regardless of the box's actual aspect, overriding the auto-snap. Orthogonal to `size` (overall scale) and `type`/`color` (ADR-0064's family axis) — this attribute lands the grammar + snap plumbing only; per-type studied renderings per bucket are later waves (gh#1624 plan steps 2-4).",
|
|
5886
|
+
"type": "string",
|
|
5887
|
+
"enum": [
|
|
5888
|
+
"3:2",
|
|
5889
|
+
"1:1",
|
|
5890
|
+
"2:3"
|
|
5891
|
+
],
|
|
5892
|
+
"default": ""
|
|
5893
|
+
},
|
|
5884
5894
|
"seriesEmphasis": {
|
|
5885
5895
|
"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.",
|
|
5886
5896
|
"type": "string",
|
|
@@ -5910,6 +5920,22 @@
|
|
|
5910
5920
|
"description": "Y-axis key(s), comma-separated for multi-series",
|
|
5911
5921
|
"type": "string",
|
|
5912
5922
|
"default": ""
|
|
5923
|
+
},
|
|
5924
|
+
"yMax": {
|
|
5925
|
+
"description": "Pins the value-axis domain ceiling for cartesian types (bar, line, area, scatter, multi-line, stacked-bar, grouped-bar, composed). Unset (default, null) keeps today's auto-scale ceiling (the data max). Pairs with `yMin` to pin the full domain; either may be set alone. N/A for radial/part-to-whole types — see `yMin` (gh#1690). A datum outside the pinned domain is CLAMPED to the nearest edge for rendering (the value label/tooltip still shows the real value) rather than escaping the plot box.",
|
|
5926
|
+
"type": [
|
|
5927
|
+
"number",
|
|
5928
|
+
"null"
|
|
5929
|
+
],
|
|
5930
|
+
"default": null
|
|
5931
|
+
},
|
|
5932
|
+
"yMin": {
|
|
5933
|
+
"description": "Pins the value-axis domain floor for cartesian types (bar, line, area, scatter, multi-line, stacked-bar, grouped-bar, composed). Unset (default, null) already floors a positive series at 0 (the pre-1690 behavior, unchanged) — a migrating d3 consumer's own \"pin the floor to 0\" habit is the built-in default, not something to configure. Pin `y-min` explicitly for three OTHER cases: (1) zooming a narrow window — e.g. `y-min=\"0.9\" y-max=\"1\"` magnifies a percent series clustered near 92-95%, which reads flatter against the full auto-scaled [0,1] domain; (2) a mixed-sign series, where the unpinned floor never goes below 0 and negative values clip at the axis; (3) aligning two charts to one shared scale for a fair comparison. N/A for radial/part-to-whole types (pie, donut, radar, radial-bar, gauge, funnel, treemap, sankey, segments, sparkline) — those never read a shared linear value axis, so this prop is a no-op there (gh#1690). A datum outside the pinned domain is CLAMPED to the nearest edge for rendering (the value label/tooltip still shows the real value) rather than escaping the plot box.",
|
|
5934
|
+
"type": [
|
|
5935
|
+
"number",
|
|
5936
|
+
"null"
|
|
5937
|
+
],
|
|
5938
|
+
"default": null
|
|
5913
5939
|
}
|
|
5914
5940
|
},
|
|
5915
5941
|
"required": [
|
|
@@ -6142,7 +6168,7 @@
|
|
|
6142
6168
|
],
|
|
6143
6169
|
"properties": {
|
|
6144
6170
|
"items": {
|
|
6145
|
-
"description": "JSON array of {key, label, slot?, pct?} legend items. Takes precedence over [for] when both are provided.",
|
|
6171
|
+
"description": "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.",
|
|
6146
6172
|
"type": "string",
|
|
6147
6173
|
"default": ""
|
|
6148
6174
|
},
|
|
@@ -6169,7 +6195,7 @@
|
|
|
6169
6195
|
"default": "hide"
|
|
6170
6196
|
},
|
|
6171
6197
|
"position": {
|
|
6172
|
-
"description": "Layout hint — drives flex-direction. Actual placement follows DOM order.",
|
|
6198
|
+
"description": "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.",
|
|
6173
6199
|
"type": "string",
|
|
6174
6200
|
"enum": [
|
|
6175
6201
|
"top",
|
|
@@ -6179,6 +6205,16 @@
|
|
|
6179
6205
|
],
|
|
6180
6206
|
"default": "bottom"
|
|
6181
6207
|
},
|
|
6208
|
+
"ratio": {
|
|
6209
|
+
"description": "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.",
|
|
6210
|
+
"type": "string",
|
|
6211
|
+
"enum": [
|
|
6212
|
+
"3:2",
|
|
6213
|
+
"1:1",
|
|
6214
|
+
"2:3"
|
|
6215
|
+
],
|
|
6216
|
+
"default": ""
|
|
6217
|
+
},
|
|
6182
6218
|
"shape": {
|
|
6183
6219
|
"description": "Swatch shape. Maps to badge-ui's icon for dot/square variants.",
|
|
6184
6220
|
"type": "string",
|
|
@@ -6227,6 +6263,11 @@
|
|
|
6227
6263
|
"a2ui": "[\n {\n \"id\": \"legend\", \"component\": \"ChartLegend\",\n \"shape\": \"dot\",\n \"items\": \"[{\\\"key\\\":\\\"revenue\\\",\\\"label\\\":\\\"Revenue\\\",\\\"slot\\\":0},{\\\"key\\\":\\\"users\\\",\\\"label\\\":\\\"Users\\\",\\\"slot\\\":1}]\"\n }\n]",
|
|
6228
6264
|
"name": "standalone-with-items"
|
|
6229
6265
|
},
|
|
6266
|
+
{
|
|
6267
|
+
"description": "Standalone legend pinned to the 1:1 (2-col grid) layout bucket.",
|
|
6268
|
+
"a2ui": "[\n {\n \"id\": \"legend\", \"component\": \"ChartLegend\",\n \"ratio\": \"1:1\",\n \"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}]\"\n }\n]",
|
|
6269
|
+
"name": "ratio-pinned-grid"
|
|
6270
|
+
},
|
|
6230
6271
|
{
|
|
6231
6272
|
"description": "Legend mirrors a named chart's series data.",
|
|
6232
6273
|
"a2ui": "[\n {\n \"id\": \"root\", \"component\": \"Column\",\n \"children\": [\"chart\", \"legend\"]\n },\n {\n \"id\": \"chart\", \"component\": \"Chart\",\n \"type\": \"multi-line\", \"x\": \"month\", \"y\": \"revenue,users\"\n },\n {\n \"id\": \"legend\", \"component\": \"ChartLegend\",\n \"for\": \"chart\",\n \"shape\": \"line\",\n \"position\": \"bottom\"\n }\n]",
|
|
@@ -8367,6 +8408,9 @@
|
|
|
8367
8408
|
"--combobox-match-bg": {
|
|
8368
8409
|
"description": "Background for `<mark>` spans that highlight matched substrings"
|
|
8369
8410
|
},
|
|
8411
|
+
"--combobox-min-width": {
|
|
8412
|
+
"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)."
|
|
8413
|
+
},
|
|
8370
8414
|
"--combobox-option-bg-active": {
|
|
8371
8415
|
"description": "Background for the currently active (arrow-navigated) option"
|
|
8372
8416
|
},
|
|
@@ -12931,6 +12975,11 @@
|
|
|
12931
12975
|
"component": {
|
|
12932
12976
|
"const": "Heatmap"
|
|
12933
12977
|
},
|
|
12978
|
+
"data": {
|
|
12979
|
+
"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.",
|
|
12980
|
+
"type": "string",
|
|
12981
|
+
"default": ""
|
|
12982
|
+
},
|
|
12934
12983
|
"noLegend": {
|
|
12935
12984
|
"description": "Hide the Less/More legend strip",
|
|
12936
12985
|
"type": "boolean",
|
|
@@ -13888,7 +13937,7 @@
|
|
|
13888
13937
|
},
|
|
13889
13938
|
{
|
|
13890
13939
|
"fix": "{\"component\": \"CalendarPicker\", \"precision\": \"minute\"}\n",
|
|
13891
|
-
"why": "Same gap as \"date\" — no native datetime picker rendered. Use\nCalendarPicker with precision=\"minute\" for combined date + time\ninput (DatetimePicker was a deprecated thin alias, cut in 0.8.43,\ngh#1617 — CalendarPicker is the sole
|
|
13940
|
+
"why": "Same gap as \"date\" — no native datetime picker rendered. Use\nCalendarPicker with precision=\"minute\" for combined date + time\ninput (DatetimePicker was a deprecated thin alias, cut in 0.8.43,\ngh#1617 — CalendarPicker is the sole A2UI component now).\n",
|
|
13892
13941
|
"wrong": "{\"component\": \"Input\", \"type\": \"datetime-local\"}\n"
|
|
13893
13942
|
},
|
|
13894
13943
|
{
|
|
@@ -13908,7 +13957,7 @@
|
|
|
13908
13957
|
},
|
|
13909
13958
|
{
|
|
13910
13959
|
"fix": "{\"component\": \"ColorInput\"}\n",
|
|
13911
|
-
"why": "No native color swatch/picker rendered — just a plain text\nsurface. Use ColorInput for a compact form-bearing swatch +\npopover, or ColorArea directly for the full OKLCH picker surface\n(ColorPicker was a deprecated thin alias, cut in 0.8.43, gh#1617 —\nColorArea is the sole
|
|
13960
|
+
"why": "No native color swatch/picker rendered — just a plain text\nsurface. Use ColorInput for a compact form-bearing swatch +\npopover, or ColorArea directly for the full OKLCH picker surface\n(ColorPicker was a deprecated thin alias, cut in 0.8.43, gh#1617 —\nColorArea is the sole A2UI component now).\n",
|
|
13912
13961
|
"wrong": "{\"component\": \"Input\", \"type\": \"color\"}\n"
|
|
13913
13962
|
},
|
|
13914
13963
|
{
|
|
@@ -17369,11 +17418,6 @@
|
|
|
17369
17418
|
"type": "boolean",
|
|
17370
17419
|
"default": false
|
|
17371
17420
|
},
|
|
17372
|
-
"port-size": {
|
|
17373
|
-
"description": "Port indicator dot size in pixels",
|
|
17374
|
-
"type": "number",
|
|
17375
|
-
"default": 10
|
|
17376
|
-
},
|
|
17377
17421
|
"portSize": {
|
|
17378
17422
|
"description": "Port indicator size",
|
|
17379
17423
|
"type": "number",
|
|
@@ -17384,21 +17428,11 @@
|
|
|
17384
17428
|
"type": "boolean",
|
|
17385
17429
|
"default": false
|
|
17386
17430
|
},
|
|
17387
|
-
"show-ports": {
|
|
17388
|
-
"description": "Show port indicator dots. Defaults to true when editable",
|
|
17389
|
-
"type": "boolean",
|
|
17390
|
-
"default": false
|
|
17391
|
-
},
|
|
17392
17431
|
"showPorts": {
|
|
17393
17432
|
"description": "Show port indicators",
|
|
17394
17433
|
"type": "boolean",
|
|
17395
17434
|
"default": false
|
|
17396
17435
|
},
|
|
17397
|
-
"stroke-width": {
|
|
17398
|
-
"description": "Stroke width in pixels",
|
|
17399
|
-
"type": "number",
|
|
17400
|
-
"default": 2
|
|
17401
|
-
},
|
|
17402
17436
|
"strokeWidth": {
|
|
17403
17437
|
"description": "Line stroke width",
|
|
17404
17438
|
"type": "number",
|
|
@@ -22646,7 +22680,11 @@
|
|
|
22646
22680
|
]
|
|
22647
22681
|
},
|
|
22648
22682
|
"tag": "select-ui",
|
|
22649
|
-
"tokens": {
|
|
22683
|
+
"tokens": {
|
|
22684
|
+
"--select-min-width": {
|
|
22685
|
+
"description": "Intrinsic min-width floor on the host (default `20ch`, matching input-ui's own `--input-min-width` UA-baseline derivation) so a select in a shrinking flex/grid cell doesn't crush to unusable width. Set to `0` to opt back into full collapse (gh#1633)."
|
|
22686
|
+
}
|
|
22687
|
+
},
|
|
22650
22688
|
"traits": [],
|
|
22651
22689
|
"version": 1
|
|
22652
22690
|
}
|
|
@@ -24934,8 +24972,13 @@
|
|
|
24934
24972
|
}
|
|
24935
24973
|
],
|
|
24936
24974
|
"properties": {
|
|
24975
|
+
"clickable-rows": {
|
|
24976
|
+
"description": "Renders body rows with `cursor: pointer`. `row-click` fires unconditionally whether or not a listener is attached, so the cursor can't be inferred from listener presence — set this explicitly when row-click behavior is wired up (master-detail, open-flyout, navigation) so rows read as actionable.",
|
|
24977
|
+
"type": "boolean",
|
|
24978
|
+
"default": false
|
|
24979
|
+
},
|
|
24937
24980
|
"columns": {
|
|
24938
|
-
"description": "Column definitions. Array of {key, label, type?, width?, minWidth?, maxWidth?, flex?, sortable?, resizable?, filterable?, pinned?, hidden?, wrap?, valign?, accessor?, format?, render?, sortFn?, filterType?, meta?}. `valign` ('top'|'center') overrides the host [valign] for that column's body cells only — header cells always stay centered. Alternative to declarative <col-def> children (<col-def valign=\"top\">); col-def also accepts `meta` as a JSON attribute (gh#925) — e.g. <col-def type=\"badge\" meta='{\"variants\":{\"Online\":\"success\"}}'> — so cell-type meta (badge variant maps, currency codes) is expressible in static HTML.",
|
|
24981
|
+
"description": "Column definitions. Array of {key, label, type?, width?, minWidth?, maxWidth?, flex?, sortable?, resizable?, filterable?, pinned?, hidden?, wrap?, valign?, accessor?, format?, render?, sortFn?, filterType?, meta?}. `valign` ('top'|'center') overrides the host [valign] for that column's body cells only — header cells always stay centered. Alternative to declarative <col-def> children (<col-def valign=\"top\">); col-def also accepts `meta` as a JSON attribute (gh#925) — e.g. <col-def type=\"badge\" meta='{\"variants\":{\"Online\":\"success\"}}'> — so cell-type meta (badge variant maps, currency codes) is expressible in static HTML. Truncation contract for `render` cells (gh#1681) — a `render(value, row, cell, dataIndex)` function's returned markup isn't guaranteed to be a bare <span>/<a> the way built-in cell types are, so single-line ellipsis truncation isn't automatic; set `data-truncate` on whichever rendered element (any tag, including a custom element) should single-line-ellipsis to opt it into the same contract built-in cells get for free. `[wrap]` (host) / `[data-wrap]` (per-column) override it back to multi-line, matching built-in cells.",
|
|
24939
24982
|
"$ref": "#/$defs/DynamicStringList"
|
|
24940
24983
|
},
|
|
24941
24984
|
"component": {
|
|
@@ -25671,7 +25714,7 @@
|
|
|
25671
25714
|
},
|
|
25672
25715
|
"TableToolbar": {
|
|
25673
25716
|
"title": "TableToolbar",
|
|
25674
|
-
"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.",
|
|
25717
|
+
"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 [slot=\"actions-leading\"] region, 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.",
|
|
25675
25718
|
"type": "object",
|
|
25676
25719
|
"allOf": [
|
|
25677
25720
|
{
|
|
@@ -25682,6 +25725,11 @@
|
|
|
25682
25725
|
}
|
|
25683
25726
|
],
|
|
25684
25727
|
"properties": {
|
|
25728
|
+
"chromeOnly": {
|
|
25729
|
+
"description": "Suppress all four native controls/search at once (filter, sort, columns, search) as additive sugar over noFilter/noSort/noColumns/ noSearch (ADR-0076, ADIA2-9123). Precedence is pure, absolute OR — while set, all four stay off regardless of any individual no-* attribute's own value, with no partial re-enable path; to re-enable one control, remove chrome-only entirely and set the other three no-* attributes explicitly instead. The four granular attributes are not deprecated or removed — they remain the independently-addressable shipped API; chrome-only never replaces them, it's a convenience preset on top.",
|
|
25730
|
+
"type": "boolean",
|
|
25731
|
+
"default": false
|
|
25732
|
+
},
|
|
25685
25733
|
"component": {
|
|
25686
25734
|
"const": "TableToolbar"
|
|
25687
25735
|
},
|
|
@@ -25744,6 +25792,18 @@
|
|
|
25744
25792
|
"type": "number",
|
|
25745
25793
|
"default": 0
|
|
25746
25794
|
},
|
|
25795
|
+
"stage": {
|
|
25796
|
+
"description": "Explicit compaction-stage override (ADR-0076). Unset (the default, empty string) means auto-snap: the toolbar's own inline-size container query picks the nearest stage from its live width against the three --table-toolbar-bp-* breakpoints, snapping discretely, never interpolating. Setting stage explicitly pins that stage's rendering regardless of the container's actual width — overriding the container query, mirroring chart-ui's ratio override shape. Primary use: visual-eval fixtures that need a deterministic stage without resizing a real container, and a consumer embedding the toolbar inside a known-narrow panel who wants to skip auto-detection entirely. All four stages' CSS is now live (ADR-0076): search-tight steps the search field down (step 2); icon-only drops control labels and compacts/hides the range summary (steps 3+4); overflow collapses Filter/Sort/Columns into one \"More\" trigger routed through the same menu-ui/menu-item-ui pattern used elsewhere in the corpus (step 5). The resolved stage — the pin if set, otherwise the live width classification — also reflects onto the host as `data-stage-resolved` (step 7, informational only, mirrors chart-ui's `data-ratio-resolved` convention — never drives table-toolbar's own rendering, which stays 100% CSS-driven).",
|
|
25797
|
+
"type": "string",
|
|
25798
|
+
"enum": [
|
|
25799
|
+
"",
|
|
25800
|
+
"full",
|
|
25801
|
+
"search-tight",
|
|
25802
|
+
"icon-only",
|
|
25803
|
+
"overflow"
|
|
25804
|
+
],
|
|
25805
|
+
"default": ""
|
|
25806
|
+
},
|
|
25747
25807
|
"text": {
|
|
25748
25808
|
"description": "Title text shown on the left.",
|
|
25749
25809
|
"type": "string",
|
|
@@ -25774,6 +25834,7 @@
|
|
|
25774
25834
|
"field-ui",
|
|
25775
25835
|
"select-ui",
|
|
25776
25836
|
"input-ui",
|
|
25837
|
+
"menu-ui",
|
|
25777
25838
|
"menu-item-ui",
|
|
25778
25839
|
"icon-ui",
|
|
25779
25840
|
"check-ui"
|
|
@@ -25802,8 +25863,8 @@
|
|
|
25802
25863
|
"name": "members-toolbar"
|
|
25803
25864
|
},
|
|
25804
25865
|
{
|
|
25805
|
-
"description": "The ratified adiav2 list-page toolbar row (ADIA2-9123): scope menu, range summary, filter/columns
|
|
25806
|
-
"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]",
|
|
25866
|
+
"description": "The ratified adiav2 list-page toolbar row (ADIA2-9123, gh#1649): scope menu, range summary, app-owned Filter/Columns triggers (their own filter drawer, not the native popovers — [no-filter]/[no-columns]/ [no-sort]/[no-search] drop the native affordances), page-size select, and a primary CTA — [slot=\"actions-leading\"] carries the Filter/Columns triggers so they land BEFORE the page-size select, while [slot=\"actions\"] carries the CTA so it lands after.",
|
|
25867
|
+
"a2ui": "[\n {\"id\": \"root\", \"component\": \"Column\", \"gap\": \"3\", \"children\": [\"bar\", \"card\"]},\n {\"id\": \"bar\", \"component\": \"TableToolbar\", \"for\": \"accounts\", \"no-filter\": true, \"no-sort\": true, \"no-columns\": true, \"no-search\": true, \"range-start\": 1, \"range-end\": 25, \"range-total\": 320, \"page-size\": 25, \"page-size-options\": [10, 25, 50, 100], \"children\": [\"btn-filter\", \"btn-columns\", \"btn-new\"]},\n {\"id\": \"btn-filter\", \"component\": \"Button\", \"text\": \"Filter\", \"variant\": \"ghost\", \"slot\": \"actions-leading\"},\n {\"id\": \"btn-columns\", \"component\": \"Button\", \"text\": \"Columns\", \"variant\": \"ghost\", \"slot\": \"actions-leading\"},\n {\"id\": \"btn-new\", \"component\": \"Button\", \"text\": \"New account\", \"variant\": \"primary\", \"slot\": \"actions\"},\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]",
|
|
25807
25868
|
"name": "adiav2-list-page-toolbar-row"
|
|
25808
25869
|
}
|
|
25809
25870
|
],
|
|
@@ -25832,7 +25893,13 @@
|
|
|
25832
25893
|
],
|
|
25833
25894
|
"slots": {
|
|
25834
25895
|
"actions": {
|
|
25835
|
-
"description": "Trailing action area — primary buttons (e.g. \"New row\") rendered after the search input."
|
|
25896
|
+
"description": "Trailing action area — primary buttons (e.g. \"New row\") rendered after the search input, [slot=\"actions-leading\"], and the page-size select."
|
|
25897
|
+
},
|
|
25898
|
+
"actions-leading": {
|
|
25899
|
+
"description": "Region rendered AFTER the search input and BEFORE the native page-size select (gh#1649) — for app-owned trigger buttons (e.g. custom Filter / Columns triggers that open the consumer's own drawer instead of the native filter/columns popovers) that must land ahead of the page-size select rather than after it, unlike [slot=\"actions\"]. Same real-insertion-point pattern as [slot=\"scope\"] / [slot=\"actions\"] — positioning is CSS by DOM order, not a template stamp. Empty (the default) has zero footprint on existing consumers."
|
|
25900
|
+
},
|
|
25901
|
+
"empty": {
|
|
25902
|
+
"description": "Renders in place of the range-summary text — the same [data-summary] region — when [range-total] is EXPLICITLY present and equal to \"0\" (checked via hasAttribute, never the computed value alone, so an unset range-total during loading never flashes this content; ADR-0076, REQ-E-001). Mutually exclusive with a positive [range-total]: the normal \"Showing X-Y of N\" text always wins whenever range-total is a positive number. Empty (the default) preserves today's exact behavior — [data-summary] hides on a confirmed range-total=\"0\" exactly as before this slot existed. Plain author-supplied markup (text, an empty-state-ui composite, an icon+text pair) — table-toolbar does not template or constrain its shape. Naming matches chart-ui's own existing `empty` slot convention."
|
|
25836
25903
|
},
|
|
25837
25904
|
"scope": {
|
|
25838
25905
|
"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."
|
|
@@ -26705,10 +26772,10 @@
|
|
|
26705
26772
|
"deck": "Sub-title under a `title`. One-line lead, slightly larger than body. Use for the lead sentence after a title.",
|
|
26706
26773
|
"display": "Top-level hero / brand display. Tallest visual rank. Use for page-level hero one-liners.",
|
|
26707
26774
|
"heading": "Major page heading (visual rank H2). 16-18px / bold. Use for major sub-section dividers.",
|
|
26708
|
-
"kicker": "Eyebrow text above a `title`. UPPERCASE + small + tracking. Use for content eyebrows (NOT form labels — use `label` for those).",
|
|
26709
|
-
"label": "Form-control label (above an `<input-ui>` / `<select-ui>` etc). UI-sized
|
|
26775
|
+
"kicker": "Eyebrow text above a `title`. UPPERCASE + small + tracking, mono font stack at regular (400) weight. Use for content eyebrows (NOT form labels — use `label` for those).",
|
|
26776
|
+
"label": "Form-control label (above an `<input-ui>` / `<select-ui>` etc). UI-sized, mono font stack at regular (400) weight. Use for field labels bound to form controls.",
|
|
26710
26777
|
"metric": "Numeric KPI / big-number stat. Bold + large. Use for dashboard metric numbers.",
|
|
26711
|
-
"section": "Inline form-group / navlist heading (visual rank H4).
|
|
26778
|
+
"section": "Inline form-group / navlist heading (visual rank H4). Mono font stack at medium (500) weight, normal casing. Use for form group labels, nav list headings.",
|
|
26712
26779
|
"subsection": "Sub-landmark within a section (visual rank H3). 14px / semibold. Use for card titles within a section."
|
|
26713
26780
|
}
|
|
26714
26781
|
},
|
|
@@ -168,6 +168,7 @@
|
|
|
168
168
|
- Standalone legend primitive — a row of <badge-ui>+<swatch-ui> chips that are keyboard-focusable and click-toggleable.
|
|
169
169
|
- Pairs with <chart-ui> via [for] id-ref (auto-bidirectional series toggling) or via items= for standalone use.
|
|
170
170
|
- position attribute (top|bottom|left|right) places legend relative to its chart; interactive="false" disables interactivity.
|
|
171
|
+
- 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.
|
|
171
172
|
|
|
172
173
|
## Chart
|
|
173
174
|
- Declarative SVG chart supporting 18 types via the type attribute (bar, line, pie, donut, radar, area, ...).
|
|
@@ -366,7 +367,7 @@
|
|
|
366
367
|
|
|
367
368
|
## Input
|
|
368
369
|
- <input-ui> is the canonical single-line text input. The host IS the contenteditable surface — NEVER wrap a native <input>. The sole exception is type="password", which internally uses a real <input type="password"> for masking (per ADR-0025).
|
|
369
|
-
- Wrap <input-ui> in <field-ui label="…" hint="…" error="…"> for the canonical stacked label / hint / error chrome.
|
|
370
|
+
- Wrap <input-ui> in <field-ui label="…" hint="…" error="…"> for the canonical stacked label / hint / error chrome. input-ui itself only supports inline [label] / [error] (gh#1669 — [hint] is a field-ui-only prop; input-ui has no equivalent) — use field-ui when a hint line is needed.
|
|
370
371
|
- Form participation is implicit via UIFormElement. Set [name] for FormData submission; [required] / [disabled] / [readonly] reflect; listen for `change` (blur or Enter commit) and `input` (per keystroke). `submit` event fires when Enter commits the value (used by <chat-composer>'s `composer-submit` forwarding).
|
|
371
372
|
- For numeric input use [type="number"] with [min] [max] [step] [precision] [prefix] / [suffix] — this stamps a contenteditable surface + <button-ui> / <icon-ui> stepper column with ARIA spinbutton semantics. Read `el.valueAsNumber` for the parsed Number. Never substitute a native <input type="number">.
|
|
372
373
|
- Inside <chat-composer>, the canonical inner input is <chat-input-ui> (chat variant subclass — adds the send button + model picker + paste-to-attach plumbing). The plain <input-ui> primitive ALSO fires a bubbling `submit` event on Enter (unconditional, no opt-in attribute); <chat-input-ui> simply builds on that semantic.
|
|
@@ -706,6 +707,10 @@
|
|
|
706
707
|
- Use slot="action" (or [slot="actions"]) for trailing primary buttons (Invite, Export, +New). Use [text] / [count] props for the left cluster, or slotted [slot="title"] / [slot="count"] when content is markup (a <span> + <badge-ui>, etc.).
|
|
707
708
|
- Listen for toolbar events (`search`, `filter-change`, `sort-change`, `columns-change`, `page-size-change`) only to mirror state to URL / persistence / analytics. The toolbar already wires its changes into the bound table — you don't need to manually update the table.
|
|
708
709
|
- Use [slot="scope"] for a leading scope/view switcher (an org's teams, a saved view) rendered before [text]/[count]. Use [range-start] / [range-end] / [range-total] together for a "Showing X–Y of N" summary — it renders independently of, and alongside, [text]/[count], never in place of them. Use [page-size] + [page-size-options] for a rows-per-page select; it applies directly to the bound table's [paginate] prop the same way filter/sort/columns changes apply directly to the target.
|
|
710
|
+
- Use [slot="actions-leading"] (gh#1649) for app-owned trigger buttons that must land BEFORE the page-size select — e.g. custom Filter / Columns triggers that open the consumer's own drawer instead of the native filter/columns popovers (drop [no-filter] [no-columns] to hide the native ones when doing this). [slot="actions"] stays the trailing region AFTER the page-size select, for a primary CTA.
|
|
711
|
+
- Use [chrome-only] (ADR-0076, ADIA2-9123) instead of stacking [no-filter] [no-sort] [no-columns] [no-search] individually when an app owns ALL FOUR affordances itself (its own drawer/menu). Pure OR, absolute while set — clearing an individual no-* attribute does NOT re-enable that one control; drop [chrome-only] entirely and set the three you still want off explicitly instead. Combine with [slot="actions-leading"] for the app's own Filter/Columns triggers.
|
|
712
|
+
- Use <span slot="empty"> (or any markup) inside a table-toolbar-ui that also sets [range-total="0"] to show a "no results" message in the range-summary's own position, without a layout shift versus the normal "Showing X-Y of N" text (ADR-0076, REQ-E). Only fires on an EXPLICIT range-total="0" — omitting range-* entirely (loading) never shows it.
|
|
713
|
+
- Read the host's [data-stage-resolved] attribute (ADR-0076 REQ-M-005, ADIA2-9123 S4-ii) to compact a consumer's own [slot="actions-leading"] content in sympathy with table-toolbar's native regions, without re-deriving the same breakpoints yourself. Informational only — mirrors the CSS-decided compaction stage (full | search-tight | icon-only | overflow), never drives table-toolbar's own rendering. Reports the pinned [stage] value when set, the live width classification otherwise; updates on both a live resize and a [stage] attribute change.
|
|
709
714
|
|
|
710
715
|
## Table
|
|
711
716
|
- Canonical composition: wrap <table-ui> in <card-ui><section bleed> for edge-to-edge tables. The [bleed] removes section padding so columns span the full card width (see apps/saas/members, billing, admin-dashboard).
|
package/catalog/tier-index.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"catalogId": "adia.tiers@0.8.
|
|
2
|
+
"catalogId": "adia.tiers@0.8.44",
|
|
3
3
|
"description": "Tier index of the AdiaUI catalog contract (ADR-0050). L0-L4 ladder; every tier-N entry is a declared composition of tier-(N-1) entries. L1 `composes` edges speak A2UI component TYPE names — the R-C7 catalogs’ `components` keys (genui-system SPEC R-C13). Derived — regenerate with `npm run build:catalog-tiers`, never hand-edit.",
|
|
4
4
|
"extends": {
|
|
5
5
|
"catalogId": "adia.base",
|
|
6
|
-
"version": "0.8.
|
|
6
|
+
"version": "0.8.44"
|
|
7
7
|
},
|
|
8
8
|
"tiers": {
|
|
9
9
|
"L0": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adia-ai/a2ui",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.44",
|
|
4
4
|
"description": "The A2UI protocol — runtime (renderer, registry, streams, surface manifest, wiring primitives, dockable base classes) plus protocol-side validation. Framework-agnostic and dependency-free; pairs with any A2UI-conformant component set. Folded from @adia-ai/a2ui-runtime + the protocol half of @adia-ai/a2ui-validator (ADR-0048).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|