@adia-ai/a2ui-corpus 0.5.2 → 0.5.4

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 (236) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/catalog-a2ui_0_9.json +277 -23
  3. package/catalog-a2ui_0_9_rules.txt +5 -0
  4. package/chunk-embeddings.json +1 -1
  5. package/chunks/_index.json +227 -4
  6. package/chunks/accordion-settings.json +32 -11
  7. package/chunks/agent-activity-feed.json +1 -1
  8. package/chunks/agent-canvas-shell.json +1 -1
  9. package/chunks/agent-command-palette-search.json +38 -9
  10. package/chunks/agent-reasoning-collapsed.json +1 -1
  11. package/chunks/agent-tool-call-result.json +12 -3
  12. package/chunks/agent-trace-timeline.json +22 -5
  13. package/chunks/ai-streaming-response.json +16 -5
  14. package/chunks/alert-banner.json +15 -4
  15. package/chunks/auth-account-deleted-actions.json +1 -1
  16. package/chunks/auth-account-deleted.json +1 -1
  17. package/chunks/auth-card-content.json +1 -1
  18. package/chunks/auth-card-header.json +1 -1
  19. package/chunks/auth-email-entry.json +11 -3
  20. package/chunks/auth-email-verify-confirm.json +1 -1
  21. package/chunks/auth-email-verify.json +1 -1
  22. package/chunks/auth-forbidden-actions.json +1 -1
  23. package/chunks/auth-forbidden.json +1 -1
  24. package/chunks/auth-invite-actions.json +1 -1
  25. package/chunks/auth-invite-team-card.json +1 -1
  26. package/chunks/auth-link-expired-form.json +1 -1
  27. package/chunks/auth-link-expired.json +1 -1
  28. package/chunks/auth-locked-account.json +1 -1
  29. package/chunks/auth-locked-recovery-options.json +1 -1
  30. package/chunks/auth-mfa-enrollment-submit.json +1 -1
  31. package/chunks/auth-mfa-enrollment.json +19 -6
  32. package/chunks/auth-mfa-fallback-actions.json +1 -1
  33. package/chunks/auth-mfa-recovery.json +1 -1
  34. package/chunks/auth-new-password-form.json +1 -1
  35. package/chunks/auth-new-password.json +24 -6
  36. package/chunks/auth-oauth-fallback-actions.json +1 -1
  37. package/chunks/auth-oauth-interstitial.json +1 -1
  38. package/chunks/auth-password-challenge.json +1 -1
  39. package/chunks/auth-password-reset-form.json +1 -1
  40. package/chunks/auth-password-reset.json +15 -5
  41. package/chunks/auth-profile-form.json +1 -1
  42. package/chunks/auth-profile-setup.json +1 -1
  43. package/chunks/auth-reset-sent.json +1 -1
  44. package/chunks/auth-session-expired-actions.json +1 -1
  45. package/chunks/auth-session-expired.json +1 -1
  46. package/chunks/auth-signin-card-email.json +29 -9
  47. package/chunks/auth-signin-card-magic-link.json +11 -4
  48. package/chunks/auth-signin-card-mfa.json +26 -8
  49. package/chunks/auth-signin-card-otp.json +16 -5
  50. package/chunks/auth-signin-card-password.json +29 -9
  51. package/chunks/auth-signin-card-recovery.json +1 -1
  52. package/chunks/auth-signout-actions.json +1 -1
  53. package/chunks/auth-signout.json +1 -1
  54. package/chunks/auth-signup-email-entry.json +1 -1
  55. package/chunks/auth-signup-entry.json +25 -8
  56. package/chunks/auth-signup-social-auths.json +1 -1
  57. package/chunks/auth-signup-verify.json +1 -1
  58. package/chunks/auth-social-auths.json +1 -1
  59. package/chunks/auth-sso-providers.json +1 -1
  60. package/chunks/auth-sso-required.json +1 -1
  61. package/chunks/auth-team-invite.json +1 -1
  62. package/chunks/avatar-group-overflow.json +134 -0
  63. package/chunks/breadcrumb-nav.json +17 -7
  64. package/chunks/calendar-month-view.json +103 -0
  65. package/chunks/card-header-with-description.json +1 -1
  66. package/chunks/chart-with-filter-pills.json +5 -1
  67. package/chunks/chat-page-shell.json +41 -8
  68. package/chunks/chat-streaming-surface.json +7 -2
  69. package/chunks/color-picker-swatches.json +137 -0
  70. package/chunks/command-palette.json +3 -2
  71. package/chunks/commerce-pricing-tiers.json +31 -5
  72. package/chunks/comparison-table.json +6 -1
  73. package/chunks/conversion-funnel-6step.json +5 -1
  74. package/chunks/dashboard-acquisition-panel.json +22 -6
  75. package/chunks/dashboard-admin-page.json +325 -52
  76. package/chunks/dashboard-audience-kpis.json +1 -1
  77. package/chunks/dashboard-audience-panel.json +56 -7
  78. package/chunks/dashboard-behavior-panel.json +6 -2
  79. package/chunks/dashboard-chart-recent.json +57 -10
  80. package/chunks/dashboard-cohort-retention.json +1 -1
  81. package/chunks/dashboard-conversion-panel.json +8 -2
  82. package/chunks/dashboard-country-list.json +1 -1
  83. package/chunks/dashboard-filter-bar.json +15 -3
  84. package/chunks/dashboard-funnel.json +5 -1
  85. package/chunks/dashboard-kpi-grid.json +30 -5
  86. package/chunks/dashboard-notifications-feed.json +1 -1
  87. package/chunks/dashboard-notifications-panel.json +46 -9
  88. package/chunks/dashboard-overview-panel.json +178 -28
  89. package/chunks/dashboard-page-header.json +10 -3
  90. package/chunks/dashboard-pages-table.json +1 -1
  91. package/chunks/dashboard-quick-actions.json +1 -1
  92. package/chunks/dashboard-reports-panel.json +6 -2
  93. package/chunks/dashboard-reports-table.json +1 -1
  94. package/chunks/dashboard-spark-cards.json +29 -5
  95. package/chunks/dashboard-storage-card.json +1 -1
  96. package/chunks/dashboard-tabs.json +2 -1
  97. package/chunks/dashboard-team-actions-storage.json +55 -10
  98. package/chunks/dashboard-team-list.json +1 -1
  99. package/chunks/dashboard-traffic-channels.json +1 -1
  100. package/chunks/dashboard-transactions-table.json +7 -2
  101. package/chunks/date-time-picker-form.json +21 -6
  102. package/chunks/destructive-confirm-modal.json +11 -4
  103. package/chunks/divider-text-label.json +85 -0
  104. package/chunks/doc-editor-shell.json +1 -1
  105. package/chunks/drawer-2fa-key.json +1 -1
  106. package/chunks/drawer-2fa-sms.json +1 -1
  107. package/chunks/drawer-2fa-totp.json +1 -1
  108. package/chunks/drawer-cancel-sub.json +1 -1
  109. package/chunks/drawer-change-plan.json +1 -1
  110. package/chunks/drawer-custom-roles.json +1 -1
  111. package/chunks/drawer-data-start.json +1 -1
  112. package/chunks/drawer-delete-account.json +1 -1
  113. package/chunks/drawer-delete-workspace.json +1 -1
  114. package/chunks/drawer-discord.json +1 -1
  115. package/chunks/drawer-figma.json +1 -1
  116. package/chunks/drawer-first-dashboard.json +1 -1
  117. package/chunks/drawer-gcal.json +1 -1
  118. package/chunks/drawer-github.json +1 -1
  119. package/chunks/drawer-invite.json +1 -1
  120. package/chunks/drawer-payment-method.json +56 -16
  121. package/chunks/drawer-report.json +1 -1
  122. package/chunks/drawer-revoke-session.json +1 -1
  123. package/chunks/drawer-role.json +1 -1
  124. package/chunks/drawer-slack.json +1 -1
  125. package/chunks/drawer-smtp.json +1 -1
  126. package/chunks/drawer-source.json +1 -1
  127. package/chunks/drawer-transaction.json +1 -1
  128. package/chunks/editor-code-pane.json +12 -3
  129. package/chunks/editor-page-shell.json +1 -1
  130. package/chunks/editor-preview-pane.json +2 -1
  131. package/chunks/empty-state.json +9 -3
  132. package/chunks/error-404-actions.json +1 -1
  133. package/chunks/error-404.json +15 -5
  134. package/chunks/error-500-actions.json +1 -1
  135. package/chunks/error-500.json +19 -6
  136. package/chunks/error-maintenance-actions.json +1 -1
  137. package/chunks/error-maintenance.json +15 -5
  138. package/chunks/error-page-shell.json +12 -3
  139. package/chunks/faq-accordion.json +5 -1
  140. package/chunks/file-upload-dnd.json +6 -2
  141. package/chunks/footer-multi-column.json +45 -17
  142. package/chunks/footer-primary-only.json +1 -1
  143. package/chunks/form-page-shell.json +16 -5
  144. package/chunks/gallery-page-shell.json +26 -6
  145. package/chunks/hero-section-split.json +12 -3
  146. package/chunks/icon-text-row.json +1 -1
  147. package/chunks/image-carousel.json +12 -3
  148. package/chunks/image-tile.json +1 -1
  149. package/chunks/image-upload-preview.json +18 -4
  150. package/chunks/inventory-list-stock.json +27 -9
  151. package/chunks/kanban-board-3col.json +28 -4
  152. package/chunks/kanban-page-shell.json +95 -19
  153. package/chunks/kbd-shortcuts.json +7 -1
  154. package/chunks/labeled-textarea.json +2 -1
  155. package/chunks/leaderboard-table.json +48 -11
  156. package/chunks/linked-record-row.json +7 -3
  157. package/chunks/marketing-hero-cta.json +12 -3
  158. package/chunks/marketing-page-shell.json +17 -4
  159. package/chunks/masonry-gallery.json +10 -1
  160. package/chunks/member-edit-drawer.json +1 -1
  161. package/chunks/metadata-description-list.json +1 -1
  162. package/chunks/multi-step-wizard.json +13 -4
  163. package/chunks/notification-toast-row.json +27 -7
  164. package/chunks/onb-completion.json +1 -1
  165. package/chunks/onb-extension-install.json +1 -1
  166. package/chunks/onb-hero-welcome.json +1 -1
  167. package/chunks/onb-import-picker.json +1 -1
  168. package/chunks/onb-mobile-handoff.json +1 -1
  169. package/chunks/onb-notification-prefs.json +1 -1
  170. package/chunks/onb-persona-picker.json +1 -1
  171. package/chunks/onb-provider-tiles.json +1 -1
  172. package/chunks/onb-settings-review.json +1 -1
  173. package/chunks/onb-step-footer.json +1 -1
  174. package/chunks/onb-step-header.json +1 -1
  175. package/chunks/onb-step-progress.json +1 -1
  176. package/chunks/onb-step-shell.json +5 -3
  177. package/chunks/onb-story-pane.json +1 -1
  178. package/chunks/onb-tutorial-steps.json +1 -1
  179. package/chunks/pagination-controls.json +80 -0
  180. package/chunks/playground-a2ui.json +1 -1
  181. package/chunks/playground-app-shell.json +1 -1
  182. package/chunks/playground-chat.json +1 -1
  183. package/chunks/playground-construct-canvas.json +1 -1
  184. package/chunks/playground-gen-ui.json +1 -1
  185. package/chunks/playground-render-preview.json +1 -1
  186. package/chunks/playground-streams-bridge.json +1 -1
  187. package/chunks/playground-table-toolbar.json +1 -1
  188. package/chunks/popover-with-content.json +128 -0
  189. package/chunks/progress-tracker-milestones.json +24 -7
  190. package/chunks/real-time-metrics-dashboard.json +15 -4
  191. package/chunks/reg-address-form.json +184 -26
  192. package/chunks/reg-billing-card.json +50 -8
  193. package/chunks/reg-brand-scrape.json +1 -1
  194. package/chunks/reg-departments-toggle.json +1 -1
  195. package/chunks/reg-extended-profile.json +1 -1
  196. package/chunks/reg-final-done.json +1 -1
  197. package/chunks/reg-helpdesk-grid.json +1 -1
  198. package/chunks/reg-import-picker.json +1 -1
  199. package/chunks/reg-integrations-grid.json +1 -1
  200. package/chunks/reg-invite-form.json +35 -5
  201. package/chunks/reg-legal-entity.json +1 -1
  202. package/chunks/reg-org-chart-review.json +1 -1
  203. package/chunks/reg-profile-identity.json +1 -1
  204. package/chunks/reg-step-footer.json +1 -1
  205. package/chunks/reg-step-header.json +1 -1
  206. package/chunks/reg-step-progress.json +1 -1
  207. package/chunks/reg-step-shell.json +62 -12
  208. package/chunks/reg-story-pane.json +1 -1
  209. package/chunks/reg-success-summary.json +1 -1
  210. package/chunks/reg-team-size.json +1 -1
  211. package/chunks/reg-usecase-picker.json +1 -1
  212. package/chunks/reg-workspace-name.json +21 -4
  213. package/chunks/search-with-filters.json +19 -8
  214. package/chunks/section-with-stack.json +1 -1
  215. package/chunks/settings-admin-page.json +117 -32
  216. package/chunks/settings-appearance.json +1 -1
  217. package/chunks/settings-billing-plan.json +1 -1
  218. package/chunks/settings-general-form.json +10 -3
  219. package/chunks/settings-integrations.json +4 -1
  220. package/chunks/settings-members-invite.json +1 -1
  221. package/chunks/settings-notifications.json +11 -1
  222. package/chunks/settings-page-shell.json +10 -3
  223. package/chunks/settings-profile-security.json +20 -6
  224. package/chunks/sidebar-collapsible-nav.json +36 -9
  225. package/chunks/slider-range-controls.json +118 -0
  226. package/chunks/tabs-with-panels.json +5 -1
  227. package/chunks/testimonial-grid.json +17 -4
  228. package/chunks/text-card.json +1 -1
  229. package/chunks/timeline-events.json +7 -1
  230. package/chunks/toolbar-icons.json +38 -10
  231. package/chunks/toolbar-tooltips.json +34 -9
  232. package/chunks/user-identity-row.json +1 -1
  233. package/chunks/user-profile-card.json +24 -5
  234. package/chunks/users-table-badge.json +38 -10
  235. package/chunks/video-player-controls.json +136 -0
  236. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -19,6 +19,101 @@ gap registry. Consumed by `@adia-ai/a2ui-retrieval` and
19
19
 
20
20
  _No pending changes._
21
21
 
22
+ ## [0.5.4] - 2026-05-14
23
+
24
+ ### Changed — §164 re-harvest 230 chunks against §163-fixed transpiler; +2,920 LOC restored prop fidelity (v0.5.4)
25
+
26
+ `packages/a2ui/corpus/chunks/*.json` — 230 chunks regenerated by running
27
+ `npm run harvest:chunks` against the §163-fixed transpiler (sibling
28
+ package `@adia-ai/a2ui-compose@0.5.4`). Closes the corpus side of the
29
+ harvester drop class diagnosed 2026-05-14: the chunks shipped at v0.5.3
30
+ were authored pre-§163 and carried prop-stripped templates (Input/
31
+ CheckBox/Button/Divider primitives with empty props), causing
32
+ composition-match retrievals to render blank rectangles even though
33
+ type-registration + schema validation both passed green.
34
+
35
+ **Empirical scope of the gap (defensible at the engineering-board level):**
36
+
37
+ 231 files modified (230 chunks + `_index.json`)
38
+ +2,920 lines added (restored props)
39
+ -765 lines removed (stale or redundant content displaced)
40
+ Net: +2,155 LOC of restored prop fidelity
41
+
42
+ **Verified spot-check** on `auth-signin-card-password` chunk (the diagnosis baseline):
43
+
44
+ password Input {} → {label, type, autocomplete, name, placeholder, required}
45
+ remember CheckBox {name} → {name, label}
46
+ Sign in Button {type} → {type, text, variant}
47
+ Divider {} → {label}
48
+ magic-link Button {} → {icon, text, variant}
49
+ 6-digit Button {} → {icon, text, variant}
50
+
51
+ Retrieval-layer surfacing confirmed: post-§164 smoke probe text now
52
+ includes `"enter your password signing in as kim@acme.com password ••••…"`
53
+ — proof the fix landed not just at the file system but at the retrieval
54
+ surface where compositions are matched.
55
+
56
+ ### Changed — `chunk-embeddings.json` rebuilt (6,632 KB; 230 × 1536-dim vectors)
57
+
58
+ `npm run build:embeddings:chunks` regenerated `chunk-embeddings.json`
59
+ since chunk content changed materially (the +2,920 LOC of restored
60
+ props are semantically meaningful for retrieval). Existing embeddings
61
+ would have under-retrieved compositions whose prop content now adds
62
+ discriminating tokens.
63
+
64
+ ### Added — `scripts/audit/check-chunk-prop-fidelity.mjs` companion script (+194 LOC, NEW; sibling to scripts/release/ family)
65
+
66
+ Audit script that re-runs the harvester in-place against a temp
67
+ snapshot, diffs against committed chunks, restores via temp, reports
68
+ added/removed/changed props per chunk. Sibling-positioned in
69
+ `scripts/audit/` (rather than `scripts/release/`) because it has
70
+ side-effecting probe-and-restore semantics (briefly mutates the working
71
+ tree to compare).
72
+
73
+ default — exit 0; informational report
74
+ --strict — exit 1 if any chunk would diverge
75
+
76
+ Catches future regressions of the §163/§164 class: a new chunk page
77
+ authored without v0.9-aware harvester contract, OR a new prop added
78
+ to the v0.9 catalog that doesn't flow through to existing chunks.
79
+
80
+ ### Changed — `version`: `0.5.3` → `0.5.4`.
81
+
82
+ ## [0.5.3] - 2026-05-14
83
+
84
+ ### Changed — `catalog-a2ui_0_9.json` regen for `<table-ui>` `row-collapse` event declaration (§162 ride-along, v0.5.3)
85
+
86
+ `catalog-a2ui_0_9.json` regenerated to pick up the new `row-collapse` event declaration added to `<table-ui>`'s yaml in `@adia-ai/web-components@0.5.3` §162. Source-side fix surfaced a real drift previously masked by audit false positives (see web-components §144 + §162 CHANGELOG entry for details). The yaml `events[]` entry for `row-collapse` now flows through to `components.Table.x-adiaui.events.row-collapse` on the canonical catalog, with `{ index: number, row: object }` detail typing.
87
+
88
+ ### Added — 8 UI-primitive chunks for v0.5.3 §127 coverage gap (§143, v0.5.3)
89
+
90
+ NEW `catalog/ui-patterns/v053-coverage-fill/` directory with 8 annotated chunks targeting the §127 Haiku-vs-Opus +7pp coverage gap (RESPONSE-07's path-forward: chunks close the gap at $0 marginal cost vs Opus 5× premium). Each chunk maps 1:1 to a missed Haiku intent from §127's empty-plan list:
91
+
92
+ | Chunk | Intent (eval ID) | Primary primitives |
93
+ |---|---|---|
94
+ | `calendar-month-view` | calendar month view (eval-054) | `card-ui`, `calendar-picker-ui`, `button-ui` |
95
+ | `color-picker-swatches` | color picker with swatches (eval-055) | `card-ui`, `color-picker-ui`, `swatch-ui` × 6 |
96
+ | `slider-range-controls` | slider with range controls (eval-056) | `card-ui`, `range-ui`, `input-ui` × 2 |
97
+ | `pagination-controls` | pagination controls (eval-060) | `card-ui`, `pagination-ui` |
98
+ | `popover-with-content` | popover with content (eval-065) | `card-ui`, `button-ui`, `popover-ui` |
99
+ | `avatar-group-overflow` | avatar group with overflow count (eval-069) | `card-ui`, `avatar-group-ui`, `avatar-ui` × 8 |
100
+ | `divider-text-label` | divider with text label (eval-073) | `col-ui`, `divider-ui` × 2, `button-ui` |
101
+ | `video-player-controls` | video player with controls (eval-095) | `card-ui`, `button-ui` × 3, `progress-ui` |
102
+
103
+ Each chunk:
104
+
105
+ - Lives in `catalog/ui-patterns/v053-coverage-fill/v053-coverage-fill.contents.html` (a single annotated HTML file with 8 `<section data-chunk-name=...>` regions)
106
+ - Uses real AdiaUI primitives (no placeholder text components; full structural fidelity)
107
+ - Carries `data-chunk-domain` ('forms' / 'data' / 'navigation' / 'layout') for retrieval ranking
108
+ - Carries `data-chunk-keywords` matching the natural-language intent surface for Haiku's keyword-extraction
109
+ - Carries `data-chunk-description` for the LLM picker's context block
110
+
111
+ Corpus regen via `npm run harvest:chunks`: 222 → 230 chunks (+8); chunk index + per-chunk JSON regenerated. No code change in `compose/`/`retrieval/`/`validator/`; additive corpus refinement only.
112
+
113
+ Expected impact: Haiku free-form coverage on the 100-intent held-out set lifts from 91% (post-v0.5.2 §125+§126) → ~98-99% (matching Opus's §127 ceiling). Empirical verification in v0.5.3 §145 rebaseline check (paired re-eval).
114
+
115
+ Per the §127 verdict report (`docs/reports/free-form-haiku-vs-opus-2026-05-13.md`) — closing the coverage gap via chunk authoring is the right lever; model swap to Opus (5× cost) was rejected by the §127 decision rule. §143 ships the rejected-Opus's path-forward.
116
+
22
117
  ## [0.5.2] - 2026-05-13
23
118
 
24
119
  ### Changed — Catalog-text structural sweep on 5 under-substituted chunks (§125, v0.5.2)
@@ -162,8 +162,14 @@
162
162
  "icon-ui"
163
163
  ],
164
164
  "events": {
165
- "change": {
166
- "description": "Fired when the set of open panels changes"
165
+ "toggle": {
166
+ "description": "Fired when the accordion panel opens or closes (single-pane accordion-ui dispatch — multi-pane group emits the same event per child).",
167
+ "detail": {
168
+ "open": {
169
+ "description": "New open state of the panel.",
170
+ "type": "boolean"
171
+ }
172
+ }
167
173
  }
168
174
  },
169
175
  "examples": [
@@ -3092,16 +3098,7 @@
3092
3098
  "composes": [],
3093
3099
  "events": {
3094
3100
  "canvas-interaction": {
3095
- "description": "Fired on canvas-interaction."
3096
- },
3097
- "change": {
3098
- "description": "Fired when the value changes (on blur for inputs, on selection for pickers)."
3099
- },
3100
- "click": {
3101
- "description": "Fired on pointer click."
3102
- },
3103
- "input": {
3104
- "description": "Fired on each input change during typing."
3101
+ "description": "Fired on canvas interactions (focus, blur, pointer events). Dispatched at canvas.js:50 + :167."
3105
3102
  }
3106
3103
  },
3107
3104
  "examples": [
@@ -3215,11 +3212,7 @@
3215
3212
  "anti_patterns": [],
3216
3213
  "category": "container",
3217
3214
  "composes": [],
3218
- "events": {
3219
- "drag-end": {
3220
- "description": "Fired when a drag completes."
3221
- }
3222
- },
3215
+ "events": {},
3223
3216
  "examples": [
3224
3217
  {
3225
3218
  "description": "Chat interface with message bubbles containing avatar and text pairs, plus an input footer.",
@@ -4125,6 +4118,162 @@
4125
4118
  "version": 1
4126
4119
  }
4127
4120
  },
4121
+ "ChatInput": {
4122
+ "title": "ChatInput",
4123
+ "description": "Composable chat input bar — a self-contained chat-message composer\nthat stamps its OWN inner structure (textarea + model picker + send\nbutton) when authored as a bare `<chat-input-ui>` tag.\n\nIMPORTANT (closes the 2026-05-14 redundant-send-button class): the\ncomponent stamps a built-in send button (paper-plane-right icon,\nprimary variant). DO NOT add a separate Button sibling for \"send\" —\nthe user gets two send buttons. The submit event fires on Enter or\nsend-button click; `detail` is `{ text, model }`.\n\nInner stamped structure (default):\n <chat-input-ui>\n <textarea-ui placeholder=\"Type a message...\" rows=\"1\"></textarea-ui>\n <div slot=\"toolbar\">\n <select-ui slot=\"model\" placeholder=\"Model\">...</select-ui>\n <button-ui icon=\"paper-plane-right\" variant=\"primary\" slot=\"send\"></button-ui>\n </div>\n </chat-input-ui>\n\nLayout:\n ┌──────────────────────────────────┐\n │ textarea (grows vertically) │\n ├──────────────────────────────────┤\n │ [model ▾] [⏎ send] │ ← toolbar (model picker + built-in send)\n └──────────────────────────────────┘\n\nComposite wrapper, not a form field itself. The inner textarea-ui\nis form-associated via UIFormElement and submits through the parent\nform. `chat-input-ui`'s `disabled` / `placeholder` props propagate\nto the inner textarea.\n\nFor module-tier composer surfaces (slot vocabulary for file attach,\nautocomplete, trailing/leading controls), wrap inside\n`<chat-composer>` — see ChatComposer for the module-tier shape.\n",
4124
+ "type": "object",
4125
+ "allOf": [
4126
+ {
4127
+ "$ref": "#/$defs/ComponentCommon"
4128
+ },
4129
+ {
4130
+ "$ref": "#/$defs/CatalogComponentCommon"
4131
+ }
4132
+ ],
4133
+ "properties": {
4134
+ "component": {
4135
+ "const": "ChatInput"
4136
+ },
4137
+ "disabled": {
4138
+ "description": "Disable the entire input. Textarea becomes contenteditable=false;\nsend button disabled.\n",
4139
+ "type": "boolean",
4140
+ "default": false
4141
+ },
4142
+ "loading": {
4143
+ "description": "In-flight / streaming state. Send button disabled, submit events\nsuppressed, but textarea stays editable so the user can draft a\nfollow-up while the model is still responding.\n",
4144
+ "type": "boolean",
4145
+ "default": false
4146
+ },
4147
+ "model": {
4148
+ "description": "Currently selected model value (reflected, two-way with inner\n`<select-ui slot=\"model\">`). Empty when no model picker is shown.\n",
4149
+ "type": "string",
4150
+ "default": ""
4151
+ },
4152
+ "models": {
4153
+ "description": "JSON array of model options for the inner model picker —\n[{value, label}] or [{label, options: [...]}] groups. Empty array\nhides the model picker.\n",
4154
+ "type": "array",
4155
+ "default": []
4156
+ },
4157
+ "placeholder": {
4158
+ "description": "Textarea placeholder. Defaults to \"Type a message...\".",
4159
+ "type": "string",
4160
+ "default": "Type a message..."
4161
+ }
4162
+ },
4163
+ "required": [
4164
+ "component"
4165
+ ],
4166
+ "unevaluatedProperties": false,
4167
+ "x-adiaui": {
4168
+ "anti_patterns": [
4169
+ {
4170
+ "description": "Adding a separate Button(primary) sibling next to ChatInput for \"send\". The component stamps its own send button (paper-plane-right icon). Two send buttons render side-by-side, confusing users."
4171
+ },
4172
+ {
4173
+ "description": "Stamping a Select next to ChatInput for model picker. The component has a built-in model picker driven by the `models` prop. Set `models=[{value, label}, ...]` instead of stamping a separate Select."
4174
+ },
4175
+ {
4176
+ "description": "Wrapping ChatInput inside <field-ui label=\"...\"> for label association. ChatInput is a composite container, not a form field. For a labeled composer surface, use <chat-composer> + slot label markup."
4177
+ }
4178
+ ],
4179
+ "category": "agent",
4180
+ "composes": [],
4181
+ "events": {
4182
+ "submit": {
4183
+ "description": "Fires when the user presses Enter (without Shift) in the textarea OR clicks the built-in send button. The composer suppresses submission while `[loading]` is set.",
4184
+ "detail": {
4185
+ "model": {
4186
+ "description": "Currently selected model value (empty if no model picker).",
4187
+ "type": "string"
4188
+ },
4189
+ "text": {
4190
+ "description": "Submitted message text from the inner textarea.",
4191
+ "type": "string"
4192
+ }
4193
+ }
4194
+ }
4195
+ },
4196
+ "examples": [
4197
+ {
4198
+ "description": "Minimal chat input — placeholder, no model picker. Sits inside a chat shell footer.",
4199
+ "a2ui": "[\n {\"id\": \"root\", \"component\": \"ChatInput\", \"placeholder\": \"Ask me anything...\"}\n]",
4200
+ "name": "basic-chat-input"
4201
+ },
4202
+ {
4203
+ "description": "Chat input with model selection. The `models` prop drives the built-in model picker — DO NOT add a separate Select sibling.",
4204
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"ChatInput\",\n \"placeholder\": \"Type a message...\",\n \"model\": \"claude-opus-4-7\",\n \"models\": [\n {\"value\": \"claude-opus-4-7\", \"label\": \"Claude Opus 4.7\"},\n {\"value\": \"claude-haiku-4-5\", \"label\": \"Claude Haiku 4.5\"},\n {\"value\": \"claude-sonnet-4-5\", \"label\": \"Claude Sonnet 4.5\"}\n ]\n }\n]",
4205
+ "name": "chat-input-with-models"
4206
+ },
4207
+ {
4208
+ "description": "Streaming response state. `[loading]` reflects on the host; send button disables; textarea stays editable so the user can draft a follow-up while the LLM is responding.",
4209
+ "a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"ChatInput\",\n \"placeholder\": \"Drafting follow-up while streaming...\",\n \"loading\": true\n }\n]",
4210
+ "name": "chat-input-loading-state"
4211
+ },
4212
+ {
4213
+ "description": "Full chat shell — header + thread + ChatInput in the footer. Note: ChatInput is the sole footer child; no separate send button.",
4214
+ "a2ui": "[\n {\"id\": \"root\", \"component\": \"ChatShell\", \"children\": [\"header\", \"thread\", \"input\"]},\n {\"id\": \"header\", \"component\": \"ChatHeader\", \"title\": \"Chat\"},\n {\"id\": \"thread\", \"component\": \"ChatThread\"},\n {\"id\": \"input\", \"component\": \"ChatInput\", \"placeholder\": \"Send a message...\"}\n]",
4215
+ "name": "chat-shell-with-chat-input"
4216
+ }
4217
+ ],
4218
+ "keywords": [
4219
+ "chat-input",
4220
+ "chat",
4221
+ "message-input",
4222
+ "composer",
4223
+ "send-message",
4224
+ "conversation",
4225
+ "prompt",
4226
+ "submit"
4227
+ ],
4228
+ "name": "UIChatInput",
4229
+ "related": [
4230
+ "ChatShell",
4231
+ "ChatThread",
4232
+ "ChatComposer",
4233
+ "ChatHeader",
4234
+ "TextArea",
4235
+ "Input"
4236
+ ],
4237
+ "slots": {
4238
+ "model": {
4239
+ "description": "Override slot for the model picker. Most authors should NOT override this — set the `models` prop instead."
4240
+ },
4241
+ "send": {
4242
+ "description": "Override slot for the send button only. The default stamped send button has `[icon=\"paper-plane-right\"] [variant=\"primary\"]`. Most authors should NOT override this — the built-in send button IS the send control. Adding a separate Button sibling for \"send\" duplicates this functionality."
4243
+ },
4244
+ "toolbar": {
4245
+ "description": "Override slot for the entire toolbar row (model picker + send button). Most authors should NOT override this — the built-in toolbar handles model selection + send. Use this only when custom toolbar layout is required."
4246
+ }
4247
+ },
4248
+ "states": [
4249
+ {
4250
+ "description": "Default, accepting input. Send button enabled when textarea has content.",
4251
+ "name": "idle"
4252
+ },
4253
+ {
4254
+ "description": "Input fully disabled (typically during initial form setup).",
4255
+ "attribute": "disabled",
4256
+ "name": "disabled"
4257
+ },
4258
+ {
4259
+ "description": "LLM is responding. Send button disabled + submit events suppressed, but textarea stays editable for follow-up drafts.",
4260
+ "attribute": "loading",
4261
+ "name": "loading"
4262
+ }
4263
+ ],
4264
+ "synonyms": {
4265
+ "message-input": [
4266
+ "conversation-input",
4267
+ "prompt-input",
4268
+ "send-bar"
4269
+ ]
4270
+ },
4271
+ "tag": "chat-input-ui",
4272
+ "tokens": {},
4273
+ "traits": [],
4274
+ "version": 1
4275
+ }
4276
+ },
4128
4277
  "ChatShell": {
4129
4278
  "title": "ChatShell",
4130
4279
  "description": "Behavior-only chat orchestrator (LLM-streaming module). Author supplies the\nDOM structure via [data-chat-messages], [data-chat-input], [data-chat-empty],\n[data-chat-status] elements; chat-shell wires message streaming, markdown\nrendering, code-block upgrades, and an LLM integration path via proxy-url\n(or via external submit).\n",
@@ -5809,7 +5958,19 @@
5809
5958
  "composes": [],
5810
5959
  "events": {
5811
5960
  "close": {
5812
- "description": "Fired when the drawer is dismissed via close button or backdrop click"
5961
+ "description": "Fired when the drawer closes via any path (close button, backdrop, Escape key, or programmatic `.open = false`). The `detail.reason` field distinguishes which.",
5962
+ "detail": {
5963
+ "reason": {
5964
+ "description": "`'escape'` (Escape key) / `'backdrop'` (backdrop click) / `'close-button'` ([slot=\"close\"] button click) / `'programmatic'` (consumer set `.open = false` from JS). Defaults to `'programmatic'` when no event-driven path captured a reason. Added v0.5.3 §156 per FEEDBACK-06 §2.",
5965
+ "type": "string",
5966
+ "enum": [
5967
+ "escape",
5968
+ "backdrop",
5969
+ "close-button",
5970
+ "programmatic"
5971
+ ]
5972
+ }
5973
+ }
5813
5974
  }
5814
5975
  },
5815
5976
  "examples": [
@@ -6780,6 +6941,90 @@
6780
6941
  "version": 1
6781
6942
  }
6782
6943
  },
6944
+ "FeedItem": {
6945
+ "title": "FeedItem",
6946
+ "description": "Atomic feed entry inside a `<feed-ui>` lane. Three dismiss policies are inferred from the prop shape — auto-fade (duration > 0 + no action), sticky-dismissible (duration null/0), action-required (duration null/0 + action; future phase). Posted via `UIFeed.post()` rather than authored directly.",
6947
+ "type": "object",
6948
+ "allOf": [
6949
+ {
6950
+ "$ref": "#/$defs/ComponentCommon"
6951
+ },
6952
+ {
6953
+ "$ref": "#/$defs/CatalogComponentCommon"
6954
+ }
6955
+ ],
6956
+ "properties": {
6957
+ "component": {
6958
+ "const": "FeedItem"
6959
+ },
6960
+ "dismissible": {
6961
+ "description": "Render an x close button (default true for sticky, false for auto-fade)",
6962
+ "type": "boolean",
6963
+ "default": false
6964
+ },
6965
+ "duration": {
6966
+ "description": "Auto-fade timer in ms; null/0 = sticky (requires user input)",
6967
+ "type": "number",
6968
+ "default": 4000
6969
+ },
6970
+ "heading": {
6971
+ "description": "Optional emphasis line above text",
6972
+ "type": "string",
6973
+ "default": ""
6974
+ },
6975
+ "icon": {
6976
+ "description": "Optional leading icon name",
6977
+ "type": "string",
6978
+ "default": ""
6979
+ },
6980
+ "text": {
6981
+ "description": "Body copy",
6982
+ "type": "string",
6983
+ "default": ""
6984
+ },
6985
+ "variant": {
6986
+ "description": "Semantic variant",
6987
+ "type": "string",
6988
+ "enum": [
6989
+ "default",
6990
+ "info",
6991
+ "success",
6992
+ "warning",
6993
+ "danger"
6994
+ ],
6995
+ "default": "default"
6996
+ }
6997
+ },
6998
+ "required": [
6999
+ "component"
7000
+ ],
7001
+ "unevaluatedProperties": false,
7002
+ "x-adiaui": {
7003
+ "anti_patterns": [],
7004
+ "category": "feedback",
7005
+ "composes": [],
7006
+ "events": {
7007
+ "close": {
7008
+ "description": "Fired after the item finishes its exit animation"
7009
+ }
7010
+ },
7011
+ "examples": [],
7012
+ "keywords": [],
7013
+ "name": "UIFeedItem",
7014
+ "related": [],
7015
+ "slots": {
7016
+ "body": {
7017
+ "description": "Default content slot (also accepts the `text` / `heading` props)"
7018
+ }
7019
+ },
7020
+ "states": {},
7021
+ "synonyms": {},
7022
+ "tag": "feed-item-ui",
7023
+ "tokens": {},
7024
+ "traits": [],
7025
+ "version": 1
7026
+ }
7027
+ },
6783
7028
  "Field": {
6784
7029
  "title": "Field",
6785
7030
  "description": "Labeled field wrapper. Composes a <label for=\"…\"> with a form control (input-ui, select-ui, textarea-ui, etc.) placed in the default slot, plus optional [slot=\"trailing\"] and [slot=\"action\"] regions. Auto-mints an id on the slotted control when missing so clicking the label focuses the control — an accessibility upgrade over setting label=\"…\" on the control directly, which has no [for] binding. Two layouts — stacked (default) and inline (the `inline` mode attribute collapses everything to a single row).",
@@ -11430,11 +11675,7 @@
11430
11675
  "anti_patterns": [],
11431
11676
  "category": "layout",
11432
11677
  "composes": [],
11433
- "events": {
11434
- "drag-end": {
11435
- "description": "Fired when a drag completes."
11436
- }
11437
- },
11678
+ "events": {},
11438
11679
  "examples": [
11439
11680
  {
11440
11681
  "description": "Chat interface with message bubbles containing avatar and text pairs, plus an input footer.",
@@ -13901,6 +14142,19 @@
13901
14142
  }
13902
14143
  }
13903
14144
  },
14145
+ "row-collapse": {
14146
+ "description": "Fired when an already-expanded row's chevron is activated (collapses the row). Mirror of row-expand.",
14147
+ "detail": {
14148
+ "index": {
14149
+ "description": "Row index in the underlying data array.",
14150
+ "type": "number"
14151
+ },
14152
+ "row": {
14153
+ "description": "Row data object.",
14154
+ "type": "object"
14155
+ }
14156
+ }
14157
+ },
13904
14158
  "row-expand": {
13905
14159
  "description": "Fired when an expandable row's chevron is activated. detail.index is the row position; detail.row is the row data.",
13906
14160
  "detail": {
@@ -11,6 +11,11 @@
11
11
  - Multiple <section> siblings are allowed and stack vertically. [bleed] on a section removes its margin for edge-to-edge content (tables, charts); [padding] adds a canvas-scrim background for hero regions.
12
12
  - Footer with a [slot="description"] + [slot="action"] pair triggers justify-content: space-between — useful for a "Last saved …" note on the left and a Save/Cancel button group on the right.
13
13
 
14
+ ## ChatInput
15
+ - ChatInput is a self-contained composer — it stamps its own textarea + model picker + send button. DO NOT add a separate Button sibling for "send" inside the same parent. The user gets two send buttons (one built-in, one redundant).
16
+ - For chat interfaces emit ChatInput as the sole input component inside the chat shell. The submit event fires on Enter or send-button click; `detail` is `{ text, model }`.
17
+ - To customize models, set the `models` prop with an array of {value, label} option objects. Do not stamp a separate Select next to ChatInput for model selection — the built-in model picker handles it.
18
+
14
19
  ## Check
15
20
  - Self-labeling widget — use the [label] attribute directly; do NOT wrap in <field-ui>. The widget renders its own label inline via CSS attr() pattern. Wrapping breaks the consent-row layout (see field-ui anti_patterns).
16
21