@adia-ai/a2ui 0.8.38 → 0.8.40
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 +16 -0
- package/catalog/catalog-a2ui_0_9.json +32 -27
- package/catalog/catalog-a2ui_0_9_rules.txt +4 -2
- package/catalog/tier-index.json +6789 -5
- package/catalog/tiers/README.md +54 -5
- package/catalog/tiers/curation/l1-widgets.curation.json +153 -0
- package/catalog/tiers/l1-widgets.json +6789 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@
|
|
|
4
4
|
> 0.8.37 (the estate-split cut) were released under the old name and are kept
|
|
5
5
|
> verbatim.
|
|
6
6
|
|
|
7
|
+
## [0.8.40] — 2026-08-15
|
|
8
|
+
|
|
9
|
+
### Maintenance
|
|
10
|
+
- **Lockstep version bump only.** No source changes in this package; bumped to maintain the lockstep version coherence enforced by `scripts/release/check-lockstep.mjs`. Substantive v0.8.40 work shipped in the ADR-0052/0053/0054/0056 attribute-grammar and token-convention breaking wave. See `packages/web-components/CHANGELOG.md#0840--2026-08-15` for details.
|
|
11
|
+
- **`catalog/` touched in this release window** (2 file(s), e.g. `catalog/catalog-a2ui_0_9.json`) — carried by the entries above.
|
|
12
|
+
|
|
13
|
+
## [0.8.39] — 2026-08-15
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **L1 is populated — 44 curated widgets in `@adia-ai/a2ui/catalog/tiers` (ADR-0050, gh#1291 phase 1).** The gap tier the ladder was built for: named, versioned, chat-scale functional units, each carrying its `composes` edge to L0, an A2UI `template`, a description, retrieval keywords, and `source` provenance — enough for a consumer to enumerate a widget and emit it without the corpus. Breadth-first across 17 domains (agent, auth, billing, content, dashboard, data, data-management, display, error, forms, input, layout, marketing, navigation, onboarding, overlay, settings), capped at 3 per domain. Curated from the 516 harvested templates by five mechanical gates and three selection rules, both authored in `catalog/tiers/curation/l1-widgets.curation.json` with their rationale. L2 is unblocked — the composability law had L1 as its precondition. The tier index grows 25 KB → 213 KB; `wiring` and `preview` remain unpopulated (later phases).
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- **The composability law now reaches into templates (gh#1291).** For any tier entry carrying a `template`, `composes` must be exactly the set of rung-below entries the template uses — no undeclared uses, no unused declarations — joining A2UI standard type names (`Column`, `CheckBox`) to catalog component names (`Col`, `Check`) through the registry's tag mapping. Additive: the index schema is unchanged, and L0's derivation is untouched. Previously `composes` was a hand-claimed list nothing verified, which made the ladder's one law decorative for any tier shipping templates.
|
|
20
|
+
- **The `preview` key is documented as reserved-and-unbuilt (gh#1291 phase 2).** `catalog/tiers/README.md` now says so at the file-shape sketch instead of implying a generator exists. Rendering a widget needs a browser, and every rendering path in the repo is ephemeral review tooling against a running dev server; the scope-out rationale and the re-entry checklist live in `.claude/docs/specs/tiered-catalogs.md` ## Previews. `source.page` remains the pointer at a live demo page.
|
|
21
|
+
- **The L0+L1 rungs are served over MCP** by `adia-mcp protocol`'s new `get_catalog_ladder` (see `@adia-ai/mcp`) — reading this package's `./catalog/tiers` export, which is what lets a protocol-only consumer enumerate widgets without the generation system.
|
|
22
|
+
|
|
7
23
|
## [0.8.38] — 2026-08-15
|
|
8
24
|
|
|
9
25
|
### Added
|
|
@@ -3310,7 +3310,7 @@
|
|
|
3310
3310
|
"name": "open"
|
|
3311
3311
|
}
|
|
3312
3312
|
],
|
|
3313
|
-
"status": "
|
|
3313
|
+
"status": "experimental",
|
|
3314
3314
|
"synonyms": {
|
|
3315
3315
|
"embed": [
|
|
3316
3316
|
"embedded",
|
|
@@ -5442,6 +5442,11 @@
|
|
|
5442
5442
|
"component": {
|
|
5443
5443
|
"const": "Chart"
|
|
5444
5444
|
},
|
|
5445
|
+
"cornerRadius": {
|
|
5446
|
+
"description": "Bar corner radius in px (null = let CSS tokens decide)",
|
|
5447
|
+
"type": "number",
|
|
5448
|
+
"default": null
|
|
5449
|
+
},
|
|
5445
5450
|
"data": {
|
|
5446
5451
|
"description": "JS property (set programmatically — `el.data = [...]`). An array of plain objects; each object's keys are named by the `x` and `y` attributes — e.g. `<chart-ui x=\"month\" y=\"revenue\">` consumes `[{month:'Jan', revenue:3200}, {month:'Feb', revenue:4100}]`. The Chart.js `{labels, datasets}` envelope is NOT chart-ui's API — passing it (or any non-array value) renders an empty chart. May also be supplied declaratively as a JSON-array `data=\"[…]\"` attribute, hydrated once at connect. Custom accessor on the element class, not a reflected attribute.",
|
|
5447
5452
|
"$ref": "#/$defs/DynamicObjectList"
|
|
@@ -5488,11 +5493,6 @@
|
|
|
5488
5493
|
"type": "boolean",
|
|
5489
5494
|
"default": false
|
|
5490
5495
|
},
|
|
5491
|
-
"radius": {
|
|
5492
|
-
"description": "Bar corner radius (null = let CSS tokens decide)",
|
|
5493
|
-
"type": "number",
|
|
5494
|
-
"default": null
|
|
5495
|
-
},
|
|
5496
5496
|
"seriesEmphasis": {
|
|
5497
5497
|
"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.",
|
|
5498
5498
|
"type": "string",
|
|
@@ -8078,6 +8078,9 @@
|
|
|
8078
8078
|
"footer": {
|
|
8079
8079
|
"description": "Keyboard hint bar"
|
|
8080
8080
|
},
|
|
8081
|
+
"input": {
|
|
8082
|
+
"description": "The auto-stamped search field — a contenteditable=\"plaintext-only\" span carrying role=\"combobox\" (per ADR-0025/ADR-0055; no native <input>). Internal only; not consumer-slottable."
|
|
8083
|
+
},
|
|
8081
8084
|
"list": {
|
|
8082
8085
|
"description": "Container for command items and groups"
|
|
8083
8086
|
}
|
|
@@ -10539,7 +10542,9 @@
|
|
|
10539
10542
|
"composes": [
|
|
10540
10543
|
"icon-ui",
|
|
10541
10544
|
"skeleton-ui",
|
|
10542
|
-
"empty-state-ui"
|
|
10545
|
+
"empty-state-ui",
|
|
10546
|
+
"input-ui",
|
|
10547
|
+
"button-ui"
|
|
10543
10548
|
],
|
|
10544
10549
|
"events": {
|
|
10545
10550
|
"navigate": {
|
|
@@ -16684,6 +16689,11 @@
|
|
|
16684
16689
|
"type": "string",
|
|
16685
16690
|
"default": ""
|
|
16686
16691
|
},
|
|
16692
|
+
"multiExpand": {
|
|
16693
|
+
"description": "Opt out of the default single-expanded-group behavior. When unset, selecting a nav-item-ui collapses every nav-group-ui except the one containing the newly selected item (all, when the selection is ungrouped); manual multi-expansion still works up until the next selection.",
|
|
16694
|
+
"type": "boolean",
|
|
16695
|
+
"default": false
|
|
16696
|
+
},
|
|
16687
16697
|
"variant": {
|
|
16688
16698
|
"description": "Visual treatment. primary = app sidebar; section = subnav rail.",
|
|
16689
16699
|
"type": "string",
|
|
@@ -20447,7 +20457,7 @@
|
|
|
20447
20457
|
},
|
|
20448
20458
|
"QRCode": {
|
|
20449
20459
|
"title": "QRCode",
|
|
20450
|
-
"description": "Inline QR code generator — renders a scannable code as inline SVG.\nTwo modes:\n\n**A. Auto-encode (default).** Set `[value]` to a string (URL, plain\ntext, share link, 2FA secret). The component encodes the data with\nthe built-in zero-deps QR encoder (byte mode, ECC level configurable,\nversions 1–10 up to ~150 byte chars) and renders an SVG.\n\n**B. Bring-your-own matrix.** Set `[matrix]` to a JSON string of a\n2-D 0/1 array (`[[1,0,1,...],[...],...]`). The component renders the\nsupplied matrix directly without invoking its own encoder. Use this\nwhen you need versions 11–40, kanji/alphanumeric mode, or any\nencoder feature beyond the built-in. When both `[value]` and\n`[matrix]` are set, the matrix wins (BYO override).\n\nOutput is a single `<svg>` with `viewBox=\"0 0 N N\"`. Crisp-edges\nrendering preserves the scannable cell boundaries at any size.\nSizing is controlled by the `[size]` prop (host CSS-pixel dimension);\ninternal cell size is computed from `size / (matrix-size + 2 ·\
|
|
20460
|
+
"description": "Inline QR code generator — renders a scannable code as inline SVG.\nTwo modes:\n\n**A. Auto-encode (default).** Set `[value]` to a string (URL, plain\ntext, share link, 2FA secret). The component encodes the data with\nthe built-in zero-deps QR encoder (byte mode, ECC level configurable,\nversions 1–10 up to ~150 byte chars) and renders an SVG.\n\n**B. Bring-your-own matrix.** Set `[matrix]` to a JSON string of a\n2-D 0/1 array (`[[1,0,1,...],[...],...]`). The component renders the\nsupplied matrix directly without invoking its own encoder. Use this\nwhen you need versions 11–40, kanji/alphanumeric mode, or any\nencoder feature beyond the built-in. When both `[value]` and\n`[matrix]` are set, the matrix wins (BYO override).\n\nOutput is a single `<svg>` with `viewBox=\"0 0 N N\"`. Crisp-edges\nrendering preserves the scannable cell boundaries at any size.\nSizing is controlled by the `[size]` prop (host CSS-pixel dimension);\ninternal cell size is computed from `size / (matrix-size + 2 ·\nquiet-zone)`. ARIA: `role=\"img\"` with `aria-label` (default \"QR code\"\nor the `[label]` prop).\n",
|
|
20451
20461
|
"type": "object",
|
|
20452
20462
|
"allOf": [
|
|
20453
20463
|
{
|
|
@@ -20487,18 +20497,18 @@
|
|
|
20487
20497
|
"type": "string",
|
|
20488
20498
|
"default": "QR code"
|
|
20489
20499
|
},
|
|
20490
|
-
"margin": {
|
|
20491
|
-
"description": "Quiet zone in cells around the QR pattern. QR spec requires a\nminimum 4-cell margin for reliable scanning; smaller values may\nnot scan on some devices. Default `4`.\n",
|
|
20492
|
-
"type": "number",
|
|
20493
|
-
"default": 4
|
|
20494
|
-
},
|
|
20495
20500
|
"matrix": {
|
|
20496
20501
|
"description": "BYO precomputed bit matrix as JSON — a 2-D array of 0/1\n(`[[1,0,...],[0,1,...],...]`). When set, the built-in encoder is\nbypassed and this matrix renders directly. Useful for QR variants\nthe built-in doesn't support (versions 11–40, alphanumeric mode,\nkanji, etc.) — bring your own encoder, pass the matrix here.\n",
|
|
20497
20502
|
"type": "string",
|
|
20498
20503
|
"default": ""
|
|
20499
20504
|
},
|
|
20505
|
+
"quietZone": {
|
|
20506
|
+
"description": "Quiet zone in cells around the QR pattern. QR spec requires a\nminimum 4-cell quiet zone for reliable scanning; smaller values\nmay not scan on some devices. Default `4`. (Renamed from\n`[margin]` — that name collided with the framework's global\n`[margin]` Scale attribute; `margin` on `qr-code-ui` now means\nthe global spacing attribute, per ADR-0053.)\n",
|
|
20507
|
+
"type": "number",
|
|
20508
|
+
"default": 4
|
|
20509
|
+
},
|
|
20500
20510
|
"size": {
|
|
20501
|
-
"description": "Host display size in CSS pixels (width and height; the SVG is\nalways square). Default 200. Internal cell size is computed from\nthis divided by `matrix-size + 2·
|
|
20511
|
+
"description": "Host display size in CSS pixels (width and height; the SVG is\nalways square). Default 200. Internal cell size is computed from\nthis divided by `matrix-size + 2·quiet-zone`.\n",
|
|
20502
20512
|
"type": "number",
|
|
20503
20513
|
"default": 200
|
|
20504
20514
|
},
|
|
@@ -20520,9 +20530,9 @@
|
|
|
20520
20530
|
"wrong": "<qr-code-ui value=\"https://very.long.url.that.exceeds.150.bytes.of.utf8.encoded.length...\"></qr-code-ui>\n"
|
|
20521
20531
|
},
|
|
20522
20532
|
{
|
|
20523
|
-
"fix": "<qr-code-ui value=\"...\"
|
|
20524
|
-
"why": "Zero
|
|
20525
|
-
"wrong": "<qr-code-ui value=\"...\"
|
|
20533
|
+
"fix": "<qr-code-ui value=\"...\" quiet-zone=\"4\"></qr-code-ui>\n",
|
|
20534
|
+
"why": "Zero quiet zone breaks scanning. QR spec requires a 4-cell quiet\nzone for reliable detection.\n",
|
|
20535
|
+
"wrong": "<qr-code-ui value=\"...\" quiet-zone=\"0\"></qr-code-ui>\n"
|
|
20526
20536
|
}
|
|
20527
20537
|
],
|
|
20528
20538
|
"category": "display",
|
|
@@ -24605,16 +24615,6 @@
|
|
|
24605
24615
|
"description": "JS property (set programmatically — `el.data = [...]`) — row records, an array of plain objects keyed to columns[].key. May also be supplied declaratively as a JSON-array `data=\"[…]\"` attribute, hydrated once at connect (gh#288) — the same pattern chart-ui's `data` attribute uses. Custom accessor on the element class, not a reflected attribute.",
|
|
24606
24616
|
"$ref": "#/$defs/DynamicObjectList"
|
|
24607
24617
|
},
|
|
24608
|
-
"density": {
|
|
24609
|
-
"description": "Controls cell padding and row height. 'compact' for dense data, 'standard' for default spacing, 'comfortable' for spacious rows.",
|
|
24610
|
-
"type": "string",
|
|
24611
|
-
"enum": [
|
|
24612
|
-
"compact",
|
|
24613
|
-
"standard",
|
|
24614
|
-
"comfortable"
|
|
24615
|
-
],
|
|
24616
|
-
"default": "standard"
|
|
24617
|
-
},
|
|
24618
24618
|
"expandable": {
|
|
24619
24619
|
"description": "Enable row expansion",
|
|
24620
24620
|
"type": "boolean",
|
|
@@ -27635,6 +27635,11 @@
|
|
|
27635
27635
|
"type": "string",
|
|
27636
27636
|
"default": ""
|
|
27637
27637
|
},
|
|
27638
|
+
"selected": {
|
|
27639
|
+
"description": "Whether this option is currently selected. Managed by the parent\n<toggle-group-ui> container (ADR-0056) — don't set directly; the group's\n`value` is the single source of truth. Converges onto <segment-ui>'s\ndeclared reflected-prop mechanism.",
|
|
27640
|
+
"type": "boolean",
|
|
27641
|
+
"default": false
|
|
27642
|
+
},
|
|
27638
27643
|
"text": {
|
|
27639
27644
|
"description": "Visible label text.",
|
|
27640
27645
|
"type": "string",
|
|
@@ -478,6 +478,7 @@
|
|
|
478
478
|
- Variants: variant="primary" (default) — app sidebar; ResizeObserver collapses to icon-only ≤96px; collapsible groups open as a popover when collapsed. variant="section" — subnav rail; quieter chrome; optional [heading] kicker rendered via ::before.
|
|
479
479
|
- Section-variant cascade (ADR-0015 § Nav consolidation): variant="section" on <nav-ui> cascades visually to direct <nav-group-ui> / <nav-item-ui> descendants via CSS `:not([variant])`. Children's JS state is NOT mutated; the cascade is purely visual. Explicit [variant] on a child always wins — use it to escape the cascade or style a standalone group/item.
|
|
480
480
|
- Decision rule: if the user navigates AWAY (different page, route, or anchor) → <nav-ui>. If the user switches VIEWS within the same logical page → <tabs-ui>. Never use <nav-ui> as an in-page section switcher.
|
|
481
|
+
- Group expansion on selection: selecting a <nav-item-ui> collapses every <nav-group-ui> except the one containing the newly selected item (all groups, when the selection is ungrouped). Manual multi-expansion is allowed right up until the next selection. Set [multi-expand] on <nav-ui> to opt out and keep multiple groups open across selections. This clears the JS [open] state (and aria-expanded) on every collapsed group in BOTH variants — primary visually hides that group's children as a result; section variant's CSS keeps children visible regardless of [open] (per the section-variant cascade rule above), so only the accessibility state resets there, with no visible change.
|
|
481
482
|
- Anti-patterns: do NOT wrap <nav-ui> children in <col-ui> / <row-ui> — wrapping breaks selection bubbling + the variant cascade. Do NOT nest <nav-ui> inside <nav-ui>. The legacy 6-element family (<app-nav-ui> / <section-nav-ui> / <app-nav-item-ui> / <section-nav-item-ui> / <app-nav-group-ui> / <section-nav-group-ui>) was retired in ADR-0015 — only <nav-ui> / <nav-group-ui> / <nav-item-ui> remain.
|
|
482
483
|
|
|
483
484
|
## Noodles
|
|
@@ -559,7 +560,7 @@
|
|
|
559
560
|
- Set [value] for URLs / share links / plain text. The built-in encoder covers byte-mode UTF-8 up to QR version 10 (~150 chars at ECC-M, more at lower ECC levels).
|
|
560
561
|
- For data that exceeds version 10, switch to a higher ECC level downgrade ([error-correction=L]) OR use a BYO encoder and pass the precomputed [matrix].
|
|
561
562
|
- When QR sits over a non-white surface, set [background] to a solid color. White-on-image QR backgrounds are unreliable for scanners — quiet-zone contrast against the dark cells is the load-bearing visual.
|
|
562
|
-
- The [
|
|
563
|
+
- The [quiet-zone] defaults to 4 cells per QR spec. Smaller values may scan on some devices but not others; do not go below 2.
|
|
563
564
|
|
|
564
565
|
## RadioGroup
|
|
565
566
|
- The canonical radio-group shape is <radio-group-ui label="…"> wrapping a set of bare <radio-ui label="…" name="…"> children — the wrapper supplies the group's accessible name (role=radiogroup + aria-labelledby); Column/Section cannot carry a role, so a bare Column of radios has no programmatic question↔group association.
|
|
@@ -793,11 +794,12 @@
|
|
|
793
794
|
- Multi-select button cluster — hosts <toggle-option-ui> children, each independently toggleable.
|
|
794
795
|
- Different from <segmented-ui> (single-select) — toggle-group emits a SET of active values.
|
|
795
796
|
- Use for filter chips, multi-flag toggles, day-of-week pickers; for binary on/off use <switch-ui>.
|
|
797
|
+
- Sets the child <toggle-option-ui>'s declared [selected] prop to reflect the group value (ADR-0056) — do not author [selected] directly in generated markup; author the group's value instead.
|
|
796
798
|
|
|
797
799
|
## ToggleOption
|
|
798
800
|
- Child of <toggle-group-ui> — one independently-toggleable button in a multi-select cluster.
|
|
799
801
|
- Different from <segment-ui> (which is single-select inside <segmented-ui>).
|
|
800
|
-
-
|
|
802
|
+
- Selected state exposed via its own declared [selected] reflected prop, set by the parent <toggle-group-ui> (ADR-0056) — mirrors <segment-ui>'s convention. Do not set [selected] directly; drive the group's value instead.
|
|
801
803
|
|
|
802
804
|
## ToggleScheme
|
|
803
805
|
- Place toggle-scheme-ui in the shell topbar's trailing action cluster — slot="action" inside <admin-topbar slot="header"> of <admin-content>. It is a persistent, app-wide preference control; never put it in a sidebar footer / <admin-statusbar>, which hosts user-account items only.
|