@adia-ai/gen-ui 0.8.40 → 0.8.41

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 (61) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/compose/transpiler/transpiler-maps.js +45 -4
  4. package/corpus/chunk-embeddings.json +1 -1
  5. package/corpus/chunks/_index.json +288 -6
  6. package/corpus/chunks/_source-hashes.json +54 -54
  7. package/corpus/chunks/admin-shell-rounded-borderless.json +2 -1
  8. package/corpus/chunks/admin-topbar-search.json +4 -4
  9. package/corpus/chunks/agent-activity-feed.json +5 -5
  10. package/corpus/chunks/agent-prompt-library-grid.json +4 -4
  11. package/corpus/chunks/agent-rate-limit.json +1 -1
  12. package/corpus/chunks/agent-reasoning-collapsed.json +7 -7
  13. package/corpus/chunks/auth-new-password-form.json +1 -1
  14. package/corpus/chunks/auth-new-password.json +1 -1
  15. package/corpus/chunks/billing-overview.json +14 -14
  16. package/corpus/chunks/billing-progress-label.json +16 -16
  17. package/corpus/chunks/conversion-funnel-4-step-funnel.json +11 -11
  18. package/corpus/chunks/conversion-funnel-6step.json +17 -17
  19. package/corpus/chunks/conversion-funnel-wide-summary.json +11 -11
  20. package/corpus/chunks/conversion-funnel-with-segment-compare.json +11 -11
  21. package/corpus/chunks/dashboard-admin-page.json +2 -2
  22. package/corpus/chunks/dashboard-conversion-panel.json +10 -10
  23. package/corpus/chunks/dashboard-funnel.json +11 -11
  24. package/corpus/chunks/dashboard-overview-panel.json +13 -13
  25. package/corpus/chunks/dashboard-storage-card.json +14 -14
  26. package/corpus/chunks/dashboard-team-actions-storage.json +13 -13
  27. package/corpus/chunks/date-range-picker-canonical.json +51 -0
  28. package/corpus/chunks/date-range-picker-comparison.json +50 -0
  29. package/corpus/chunks/date-time-picker-form.json +5 -6
  30. package/corpus/chunks/drawer-report.json +5 -6
  31. package/corpus/chunks/filter-bar-filter-bar-with-table.json +4 -4
  32. package/corpus/chunks/form-system-live-demo.json +1 -1
  33. package/corpus/chunks/image-thumbnail-grid.json +5 -5
  34. package/corpus/chunks/inline-dialog-schedule.json +4 -6
  35. package/corpus/chunks/list-window-chat-thread.json +76 -0
  36. package/corpus/chunks/list-window-loading.json +39 -0
  37. package/corpus/chunks/loading-skeleton-placeholder.json +11 -11
  38. package/corpus/chunks/map-with-location-list.json +3 -3
  39. package/corpus/chunks/members-active-table-search-filter.json +4 -6
  40. package/corpus/chunks/patient-visit-shell.json +1 -1
  41. package/corpus/chunks/permissions-share-people.json +4 -4
  42. package/corpus/chunks/playground-app-shell.json +2 -1
  43. package/corpus/chunks/progress-tracker-milestones.json +1 -1
  44. package/corpus/chunks/rating-stars-review-summary.json +1 -1
  45. package/corpus/chunks/real-time-metrics-dashboard.json +1 -1
  46. package/corpus/chunks/search-with-filters.json +4 -4
  47. package/corpus/chunks/spinner-button-saving.json +50 -0
  48. package/corpus/chunks/spinner-button-uploading.json +49 -0
  49. package/corpus/chunks/spinner-centered-card.json +36 -0
  50. package/corpus/chunks/spinner-typing-indicator.json +41 -0
  51. package/corpus/chunks/time-picker-appointment-form.json +126 -0
  52. package/corpus/chunks/time-picker-min-max.json +50 -0
  53. package/corpus/chunks/timeline-events.json +3 -3
  54. package/corpus/chunks/timezone-selector-preview.json +3 -4
  55. package/corpus/chunks/usage-quota-meter-card.json +1 -1
  56. package/corpus/chunks/user-onboarding-checklist.json +1 -1
  57. package/corpus/chunks/video-player-controls.json +1 -1
  58. package/corpus/manifest.json +4 -4
  59. package/package.json +1 -1
  60. package/retrieval/README.md +1 -1
  61. package/retrieval/catalog.js +67 -40
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog — @adia-ai/gen-ui
2
2
 
3
+ ## [0.8.41] — 2026-08-17
4
+
5
+ ### Fixed
6
+ - **Union-typed catalog props (nullable number/object) coerce again (gh#1425, regression from gh#1329's PR #1418).** A nullable prop's catalog `type` is a JSON Schema UNION (`["number","null"]`, `["object","null"]`) — every `pdef.type === 'x'` strict-equality check in the transpiler's `extractCatalogProps()` type dispatch never matched the array form, so nullable props of ANY declared type (Progress.value, Input/Select's min/max/minlength/maxlength/precision, Chart.cornerRadius, InvoiceDetail.invoice, NotificationPreferences.channelEnabled) silently fell through to the catch-all string branch. New `hasType()`/`isNumberType()` in `compose/transpiler/transpiler-maps.js` matches both forms uniformly, closing the bug class for booleans/numbers/arrays/objects at once. The same file also stops `search-ui`'s self-referencing alias from claiming the reverse-registry slot, so the docs transpiler emits `"component": "Search"` again.
7
+ - **Category map derived from yaml, recursively, across both component trees (gh#1363 B9 + gh#1380, ADR-0065).** `retrieval/catalog.js` scanned only `components/<dir>/<dir-name>.a2ui.json`, missing family sidecars (`feed/feed-item.a2ui.json`, `tabs/tab.a2ui.json`) and the entire web-modules composite tree — every missed component silently defaulted its category to `other`. The scan is now recursive over both roots, and the engine's `categoryMap` derives from the ratified yaml category vocabulary instead of a hand-kept list.
8
+
9
+ ### Changed
10
+ - **Corpus re-harvested for the 0.8.41 catalog wave (gh#764 re-harvests + gh#1382 wave 1).** Four corpus-invisible components gain harvested chunks; the spinner/progress, date-time-picker, and toggle-family chunks re-harvested against the post-consolidation markup (`progress-ui[variant]` retirement, `calendar-picker-ui[precision]`, `segmented-ui[multiple]`); `corpus/chunks/_index.json` + `corpus/chunk-embeddings.json` regenerated. Generated artifacts — regenerated, not hand-edited.
11
+
12
+ ### Maintenance
13
+ - **`validate/` touched in this release window** (1 file(s), e.g. `validate/catalog-package-load.test.js`) — carried by the entries above.
14
+
3
15
  ## [0.8.40] — 2026-08-15
4
16
 
5
17
  ### Maintenance
package/README.md CHANGED
@@ -7,7 +7,7 @@ One-way dependency: `gen-ui → a2ui`. This package produces A2UI documents;
7
7
  `@adia-ai/a2ui` is the protocol runtime that renders them. Nothing here is
8
8
  required to *render* A2UI — only to *generate* it.
9
9
 
10
- Minted by [ADR-0048](../../../docs/adr/adr-0048-a2ui-gen-ui-estate-split.md) by
10
+ Minted by [ADR-0048](../../../docs/ops/adr/adr-0048-a2ui-gen-ui-estate-split.md) by
11
11
  folding together four previously separate packages.
12
12
 
13
13
  ## What's inside
@@ -137,6 +137,34 @@ const TYPE_ALIAS = (() => {
137
137
  return m;
138
138
  })();
139
139
 
140
+ /**
141
+ * gh#1425 (regression from gh#1329/PR #1418): a nullable prop's catalog
142
+ * `type` is a JSON Schema type UNION — e.g. `["number", "null"]`,
143
+ * `["object", "null"]` — not a bare string. Every `pdef.type === 'x'`
144
+ * strict-equality check in extractCatalogProps()'s type dispatch below
145
+ * never matched the array form, so a nullable prop of ANY declared type
146
+ * (numeric — Progress.value, Input/Select's maxlength/minlength/min/max/
147
+ * precision, Chart.cornerRadius; object — InvoiceDetail.invoice,
148
+ * NotificationPreferences.channelEnabled) silently fell through to the
149
+ * catch-all string branch instead of being coerced/parsed. `hasType()`
150
+ * matches a type name against either the bare-string form or an array
151
+ * containing it; every branch below uses it uniformly so this bug class
152
+ * closes for booleans/numbers/arrays/objects at once, not just numbers.
153
+ *
154
+ * @param {{type?: string|string[]}} pdef — catalog prop schema
155
+ * @param {...string} names — type name(s) to match against
156
+ * @returns {boolean}
157
+ */
158
+ function hasType(pdef, ...names) {
159
+ if (typeof pdef.type === 'string') return names.includes(pdef.type);
160
+ return Array.isArray(pdef.type) && pdef.type.some((t) => names.includes(t));
161
+ }
162
+
163
+ /** Numeric-prop convenience wrapper — gh#1425's own named fix target. */
164
+ export function isNumberType(pdef) {
165
+ return hasType(pdef, 'number', 'integer');
166
+ }
167
+
140
168
  /**
141
169
  * §163 generic extractor: pull every catalog-declared prop from the
142
170
  * element's attributes. Type-aware (booleans become true on presence,
@@ -170,18 +198,18 @@ function extractCatalogProps(el, a2uiType) {
170
198
  const raw = attr(pname) ?? (kebab !== pname ? attr(kebab) : null);
171
199
  if (raw === null || raw === undefined) continue;
172
200
 
173
- if (pdef.type === 'boolean') {
201
+ if (hasType(pdef, 'boolean')) {
174
202
  // HTML boolean attr convention: presence (incl. empty string) = true.
175
203
  // <input required> → raw === '' → true
176
204
  // <input required=""> → raw === '' → true
177
205
  // <input required="required"> → raw === 'required' → true
178
206
  // <input required="false"> → raw === 'false' → false (defensive)
179
207
  props[pname] = raw !== 'false';
180
- } else if (pdef.type === 'number' || pdef.type === 'integer') {
208
+ } else if (isNumberType(pdef)) {
181
209
  if (raw === '') continue;
182
210
  const n = Number(raw);
183
211
  props[pname] = Number.isFinite(n) ? n : raw;
184
- } else if (pdef.type === 'array') {
212
+ } else if (hasType(pdef, 'array')) {
185
213
  // TKT-0010: declarative JSON-array attribute (e.g. chart-ui/table-ui's
186
214
  // data='[{...}]'), hydrated once at connect per those components' own
187
215
  // yaml docs. Parse it — the raw string never satisfies the catalog's
@@ -193,7 +221,7 @@ function extractCatalogProps(el, a2uiType) {
193
221
  const parsed = JSON.parse(raw);
194
222
  if (Array.isArray(parsed)) props[pname] = parsed;
195
223
  } catch { /* not valid JSON — skip */ }
196
- } else if (pdef.type === 'object') {
224
+ } else if (hasType(pdef, 'object')) {
197
225
  // gh#853 sibling of the array branch above: object-typed props (e.g.
198
226
  // InvoiceDetail.invoice, NotificationPreferences.channelEnabled) are
199
227
  // JSON-encoded HTML attributes too — same declarative-data convention,
@@ -217,6 +245,19 @@ function extractCatalogProps(el, a2uiType) {
217
245
  const ALIAS_TYPES = new Set([
218
246
  'Select', 'LoadingIndicator', 'ErrorContainer', 'Keyboard',
219
247
  'DatePicker', 'CommandPalette', 'Segmented', 'OTP', 'SideNav', 'IconSource',
248
+ // 'search-ui' — registry.js's "AgentUI Aliases (backwards compat with
249
+ // -ui tags)" block registers the tag name itself as a self-referencing
250
+ // type (`['search-ui', 'search-ui']`) ahead of the real canonical
251
+ // `['Search', 'search-ui']` entry later in the file — first-write-wins
252
+ // let the alias claim the reverse-registry slot, so the docs transpiler
253
+ // emitted `"component": "search-ui"` instead of `"component": "Search"`
254
+ // for any harvested chunk composing <search-ui> directly (gh#1381 PR
255
+ // #1414 review — packages/gen-ui/engine/corpus/chunks/
256
+ // members-active-table-search-filter.json). Forward resolution
257
+ // (`resolveTag('search-ui')`) is untouched — this only reorders which
258
+ // type wins the REVERSE (tag → canonical type) lookup, same mechanism
259
+ // already used for 'Select' above.
260
+ 'search-ui',
220
261
  ]);
221
262
 
222
263
  // ── Reverse Registry: tag → primary A2UI type ────────────────────────────