@godxjp/ui 20.2.0 → 21.0.0

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 (60) hide show
  1. package/dist/components/data-display/chat-bubble.d.ts +30 -0
  2. package/dist/components/data-display/chat-bubble.js +229 -0
  3. package/dist/components/data-display/descriptions.js +4 -1
  4. package/dist/components/data-display/index.d.ts +4 -2
  5. package/dist/components/data-display/index.js +5 -2
  6. package/dist/components/data-display/popover.js +3 -2
  7. package/dist/components/data-display/scroll-area.js +26 -1
  8. package/dist/components/data-display/tree.d.ts +8 -0
  9. package/dist/components/data-display/tree.js +426 -0
  10. package/dist/components/data-entry/chat-composer.d.ts +50 -0
  11. package/dist/components/data-entry/chat-composer.js +163 -0
  12. package/dist/components/data-entry/chat-suggestion.d.ts +28 -0
  13. package/dist/components/data-entry/chat-suggestion.js +285 -0
  14. package/dist/components/data-entry/index.d.ts +4 -0
  15. package/dist/components/data-entry/index.js +4 -0
  16. package/dist/components/data-entry/textarea.js +3 -1
  17. package/dist/components/data-entry/tree-utils.d.ts +10 -48
  18. package/dist/components/data-entry/tree-utils.js +1 -154
  19. package/dist/components/layout/org-switcher.js +22 -2
  20. package/dist/i18n/messages/en.json +50 -0
  21. package/dist/i18n/messages/ja.json +48 -0
  22. package/dist/i18n/messages/vi.json +49 -0
  23. package/dist/lib/tree.d.ts +53 -0
  24. package/dist/lib/tree.js +155 -0
  25. package/dist/props/components/data-display.prop.d.ts +187 -1
  26. package/dist/props/components/data-entry.prop.d.ts +127 -0
  27. package/dist/props/registry.d.ts +140 -3
  28. package/dist/props/registry.js +202 -3
  29. package/dist/styles/control.css +7 -0
  30. package/dist/styles/data-display-layout.css +309 -55
  31. package/dist/styles/data-entry-layout.css +64 -0
  32. package/dist/styles/shell-layout.css +41 -11
  33. package/dist/tokens/base.css +3 -0
  34. package/dist/tokens/components/chat-bubble.css +36 -0
  35. package/dist/tokens/components/chat-composer.css +19 -0
  36. package/dist/tokens/components/data-display.css +0 -6
  37. package/dist/tokens/components/descriptions.css +4 -0
  38. package/dist/tokens/components/shell.css +13 -3
  39. package/dist/tokens/components/tree.css +27 -0
  40. package/docs/FRAME-COVERAGE-LEDGER.md +1 -1
  41. package/docs/FRAME-COVERAGE-REPORT.md +8 -3
  42. package/docs/data-display/chat-bubble.tsx +397 -0
  43. package/docs/data-display/timeline.tsx +46 -0
  44. package/docs/data-display/tree.tsx +394 -0
  45. package/docs/data-entry/chat-composer.tsx +464 -0
  46. package/docs/data-entry/chat-suggestion.tsx +301 -0
  47. package/docs/roadmap/ai-chat-components.md +207 -0
  48. package/docs/roadmap/antd-parity.md +154 -0
  49. package/docs/roadmap/badge-tag-chip-count.md +172 -0
  50. package/docs/roadmap/list-masonry.md +159 -0
  51. package/docs/roadmap/parity-audit-data-display-feedback.md +567 -0
  52. package/docs/roadmap/parity-audit-data-entry.md +344 -0
  53. package/docs/roadmap/parity-audit-layout-navigation-general.md +464 -0
  54. package/docs/roadmap/parity-backlog.md +79 -0
  55. package/docs/roadmap/tree-components.md +151 -0
  56. package/docs/showcase/table-tree-rows.tsx +4 -4
  57. package/package.json +5 -3
  58. package/dist/components/data-display/tree-list.d.ts +0 -13
  59. package/dist/components/data-display/tree-list.js +0 -26
  60. package/docs/data-display/tree-list.tsx +0 -107
@@ -1376,3 +1376,130 @@ export type BranchScopePickerProp = FieldA11yProps & {
1376
1376
  id?: IdProp;
1377
1377
  className?: ClassNameProp;
1378
1378
  };
1379
+ /**
1380
+ * Which keystroke SENDS and which one breaks the line — Ant Design X `Sender.submitType`.
1381
+ *
1382
+ * `enter` (default) is the chat convention: `Enter` sends, `Shift+Enter` inserts a newline.
1383
+ * `shiftEnter` is the inverse, for composers that hold long, deliberately multi-line drafts.
1384
+ * Neither ever fires while an IME conversion is in flight.
1385
+ * @see ChatComposer
1386
+ */
1387
+ export type ChatComposerSubmitTypeProp = "enter" | "shiftEnter";
1388
+ /**
1389
+ * @see ChatComposer — the message input of a conversation (Ant Design X `Sender`; the industry
1390
+ * calls the control a *composer*, so that is what it is named).
1391
+ *
1392
+ * Built on the real `Textarea` (auto-growing between `--chat-composer-min-height` and
1393
+ * `--chat-composer-max-height`, both derived from the `--control-height` tier) plus real
1394
+ * `Button`s. The `<textarea>` is the semantic focus target: `ref`, `id`, `name` and the whole
1395
+ * `FormField` label/helper/error contract land on it, so a ChatComposer inside a `FormField`
1396
+ * behaves exactly like an `Input` does.
1397
+ */
1398
+ export type ChatComposerProp = Omit<React.HTMLAttributes<HTMLDivElement>, "onSubmit" | "defaultValue" | "prefix" | "onChange" | "onKeyDown"> & FieldA11yProps & {
1399
+ /** Controlled draft text. Pair with `onValueChange` or the box freezes. */
1400
+ value?: ValueProp<string>;
1401
+ /** Uncontrolled initial draft text. */
1402
+ defaultValue?: DefaultValueProp<string>;
1403
+ /** Draft-text change handler — fires on every keystroke, including during an IME conversion. */
1404
+ onValueChange?: OnValueChangeProp<string>;
1405
+ /**
1406
+ * Send the draft. Receives the text as typed; never fires for an empty or whitespace-only
1407
+ * draft, and never while `loading`, `disabled` or `readOnly`.
1408
+ */
1409
+ onSubmit?: (value: string) => void;
1410
+ /** Stop the in-flight response. Only reachable while `loading`. */
1411
+ onCancel?: () => void;
1412
+ /**
1413
+ * A response is streaming. The trailing action becomes CANCEL — exactly one trailing action
1414
+ * exists at a time, the same discipline as the picker trailing-action rule.
1415
+ */
1416
+ loading?: PendingProp;
1417
+ /** Which keystroke sends and which breaks the line. Default `enter`. */
1418
+ submitType?: ChatComposerSubmitTypeProp;
1419
+ /** Empty-state text of the draft box; pass it through `t()` at the call site. */
1420
+ placeholder?: PlaceholderProp;
1421
+ /** Disable the whole composer (draft box and every action). */
1422
+ disabled?: DisabledProp;
1423
+ /** Show the draft without allowing an edit; still focusable and selectable. */
1424
+ readOnly?: boolean;
1425
+ /** Slot ABOVE the draft row — attachments, a reply-to banner, a model picker. */
1426
+ header?: React.ReactNode;
1427
+ /** Slot at the inline START of the draft row — an attach button, an avatar. */
1428
+ prefix?: React.ReactNode;
1429
+ /** Slot BELOW the draft row — a hint line, a token counter. */
1430
+ footer?: React.ReactNode;
1431
+ /** Extra trailing actions, rendered BEFORE the send/cancel action. */
1432
+ actions?: React.ReactNode;
1433
+ /** Control height tier on the shared `--control-height` ladder. Default `md`. */
1434
+ size?: SizeProp;
1435
+ /** Hard ceiling on the draft length, forwarded to the textarea. */
1436
+ maxLength?: number;
1437
+ /** Validation state the composer paints. `error` also reports `aria-invalid`. */
1438
+ status?: ControlStatusProp;
1439
+ /** Accessible name override for the send action (localized default otherwise). */
1440
+ submitLabel?: string;
1441
+ /** Accessible name override for the cancel action (localized default otherwise). */
1442
+ cancelLabel?: string;
1443
+ /** Keydown on the draft box — how `ChatSuggestion` drives its list from the composer. */
1444
+ onKeyDown?: React.KeyboardEventHandler<HTMLTextAreaElement>;
1445
+ name?: NameProp;
1446
+ id?: IdProp;
1447
+ className?: ClassNameProp;
1448
+ };
1449
+ /** @see ChatSuggestion — one row of the trigger-character list. One level of `children` is honoured. */
1450
+ export type ChatSuggestionItemProp = {
1451
+ /** Stable value handed to `onValueChange`, and the search haystack when there is no `label`. */
1452
+ value: string;
1453
+ /** Human row label. Falls back to `value`. */
1454
+ label?: string;
1455
+ /** Secondary line under the label. */
1456
+ description?: string;
1457
+ /** Decorative leading node (an icon). */
1458
+ icon?: React.ReactNode;
1459
+ /** Keep the row visible but unselectable. */
1460
+ disabled?: DisabledProp;
1461
+ /** One level of sub-rows; picking the parent drills into them instead of emitting a value. */
1462
+ children?: readonly ChatSuggestionItemProp[];
1463
+ };
1464
+ /** The render-prop bag `ChatSuggestion` hands to the composer it wraps. */
1465
+ export type ChatSuggestionRenderProp = {
1466
+ /**
1467
+ * Re-read the caret and decide whether the list belongs open — call it from the composer's
1468
+ * `onValueChange`. `false` force-closes; no argument force-opens with an empty query.
1469
+ */
1470
+ onTrigger: (value?: string | false) => void;
1471
+ /** Forward to the composer's `onKeyDown`: arrows move, Enter/Tab pick, Escape closes. */
1472
+ onKeyDown: React.KeyboardEventHandler<HTMLTextAreaElement>;
1473
+ };
1474
+ /**
1475
+ * @see ChatSuggestion — trigger-character autocomplete over a `ChatComposer` (Ant Design X
1476
+ * `Suggestion`).
1477
+ *
1478
+ * The list itself is the existing `Command` (cmdk) inside a `Popover`, so the listbox ARIA comes
1479
+ * from a primitive that already ships it. What this component owns is the part `Command` does not:
1480
+ * spotting the trigger character at the caret in a textarea, tracking the query as the caret
1481
+ * moves, and closing on `Escape` / blur / a word break — `Escape` returns focus to the textarea
1482
+ * and leaves the typed text exactly as it was.
1483
+ */
1484
+ export type ChatSuggestionProp = {
1485
+ /** The rows to offer. One level of `children` is honoured. */
1486
+ items: readonly ChatSuggestionItemProp[];
1487
+ /** Fires with the picked row's `value`. The caller owns what that does to the draft text. */
1488
+ onValueChange?: OnValueChangeProp<string>;
1489
+ /** The character that opens the list when typed at a word boundary. Default `/`. */
1490
+ triggerCharacter?: string;
1491
+ /** Controlled open state. */
1492
+ open?: OpenProp;
1493
+ /** Uncontrolled initial open state. */
1494
+ defaultOpen?: DefaultOpenProp;
1495
+ /** Open-state change handler. */
1496
+ onOpenChange?: OnOpenChangeProp;
1497
+ /** The composer to wrap — receives `{ onTrigger, onKeyDown }`. */
1498
+ children: (props: ChatSuggestionRenderProp) => React.ReactNode;
1499
+ /** Text shown when the query matches nothing (localized default otherwise). */
1500
+ emptyMessage?: EmptyMessageProp;
1501
+ /** Accessible name of the suggestion listbox — a plain string (localized default otherwise). */
1502
+ listLabel?: string;
1503
+ id?: IdProp;
1504
+ className?: ClassNameProp;
1505
+ };
@@ -2212,10 +2212,114 @@ export declare const COMPONENT_PROP_REGISTRY: {
2212
2212
  readonly reason: "Block click handler carrying the event; its presence turns every block into a real button.";
2213
2213
  }];
2214
2214
  };
2215
- readonly TreeListProp: {
2215
+ readonly ChatBubblePlacementProp: {
2216
2216
  readonly group: "data-display";
2217
- readonly file: "components/data-display/tree-list.tsx";
2218
- readonly vocabulary: readonly ["ClassNameProp"];
2217
+ readonly file: "components/data-display.prop.ts";
2218
+ readonly vocabulary: readonly [{
2219
+ readonly field: "placement";
2220
+ readonly local: true;
2221
+ readonly reason: 'Side of the conversation a message sits on ("start" | "end"), spelled on the LOGICAL inline axis so a feed flips under dir="rtl" with no per-locale branch.';
2222
+ }];
2223
+ };
2224
+ readonly ChatBubbleVariantProp: {
2225
+ readonly group: "data-display";
2226
+ readonly file: "components/data-display.prop.ts";
2227
+ readonly vocabulary: readonly [{
2228
+ readonly field: "variant";
2229
+ readonly local: true;
2230
+ readonly reason: "Structural treatment of the message body (filled | borderless | outlined). Status colour stays on `tone`; Ant Design X's `shadow` is absent because this system has no drop shadows.";
2231
+ }];
2232
+ };
2233
+ readonly ChatBubbleToneProp: {
2234
+ readonly group: "data-display";
2235
+ readonly file: "components/data-display.prop.ts";
2236
+ readonly vocabulary: readonly ["ToneProp"];
2237
+ };
2238
+ readonly ChatBubbleTypingProp: {
2239
+ readonly group: "data-display";
2240
+ readonly file: "components/data-display.prop.ts";
2241
+ readonly vocabulary: readonly [{
2242
+ readonly field: "typing";
2243
+ readonly local: true;
2244
+ readonly reason: "Stream-in animation: `true` or `{ step, interval }`. Dropped entirely under prefers-reduced-motion, which renders the full text at once (WCAG 2.3.3).";
2245
+ }];
2246
+ };
2247
+ readonly ChatBubbleProp: {
2248
+ readonly group: "data-display";
2249
+ readonly file: "components/data-display.prop.ts";
2250
+ readonly vocabulary: readonly ["ChildrenProp", "SizeProp", "ToneProp", "PendingProp", "ClassNameProp", "IdProp", {
2251
+ readonly field: "placement";
2252
+ readonly local: true;
2253
+ readonly reason: "See ChatBubblePlacementProp, the conversation-side vocabulary.";
2254
+ }, {
2255
+ readonly field: "variant";
2256
+ readonly local: true;
2257
+ readonly reason: "See ChatBubbleVariantProp, the message-body treatment vocabulary.";
2258
+ }, {
2259
+ readonly field: "avatar";
2260
+ readonly local: true;
2261
+ readonly reason: "The author's mark — a real <Avatar> node. A slot, not a label: the accessible name comes from `header`, so a decorative avatar is aria-hidden at the call site.";
2262
+ }, {
2263
+ readonly field: "header";
2264
+ readonly local: true;
2265
+ readonly reason: "Line above the body naming the turn's author. Distinct from TitleProp: it is the bubble's ACCESSIBLE NAME, not a heading in the document outline.";
2266
+ }, {
2267
+ readonly field: "footer";
2268
+ readonly local: true;
2269
+ readonly reason: "Line below the body (timestamp, per-message actions). Not FooterProp, which is a page-level action bar.";
2270
+ }, {
2271
+ readonly field: "typing";
2272
+ readonly local: true;
2273
+ readonly reason: "See ChatBubbleTypingProp, the stream-in animation vocabulary.";
2274
+ }];
2275
+ };
2276
+ readonly ChatMessageProp: {
2277
+ readonly group: "data-display";
2278
+ readonly file: "components/data-display.prop.ts";
2279
+ readonly vocabulary: readonly ["IdProp", "ChildrenProp", {
2280
+ readonly field: "role";
2281
+ readonly local: true;
2282
+ readonly reason: 'Key into ChatBubbleList\'s `roles` map ("user" | "assistant" | "system" | a product\'s own). A data field, not the ARIA `role` attribute.';
2283
+ }, {
2284
+ readonly field: "content";
2285
+ readonly local: true;
2286
+ readonly reason: "The message body. Spelled `content` rather than `children` because a data item in an array is not a JSX child.";
2287
+ }];
2288
+ };
2289
+ readonly ChatBubbleListProp: {
2290
+ readonly group: "data-display";
2291
+ readonly file: "components/data-display.prop.ts";
2292
+ readonly vocabulary: readonly ["LabelProp", "ClassNameProp", "IdProp", {
2293
+ readonly field: "items";
2294
+ readonly local: true;
2295
+ readonly reason: "Consumer-supplied messages in conversation order (see ChatMessageProp).";
2296
+ }, {
2297
+ readonly field: "roles";
2298
+ readonly local: true;
2299
+ readonly reason: "Per-role bubble defaults merged UNDER each message's own props, so a feed's shape is declared once instead of on every message.";
2300
+ }, {
2301
+ readonly field: "autoScroll";
2302
+ readonly local: true;
2303
+ readonly reason: 'Stick-to-bottom while the reader is already at the bottom. Not a generic boolean flag: revoking the pin the moment they scroll up is the behaviour, and it drives the "jump to latest" affordance.';
2304
+ }];
2305
+ };
2306
+ readonly TreeNodeProp: {
2307
+ readonly group: "data-display";
2308
+ readonly file: "components/data-display.prop.ts";
2309
+ readonly vocabulary: readonly [{
2310
+ readonly field: "icon";
2311
+ readonly local: true;
2312
+ readonly reason: "Per-node glyph drawn when Tree's showIcon is on.";
2313
+ }, {
2314
+ readonly field: "children";
2315
+ readonly local: true;
2316
+ readonly reason: "The node's own child nodes — the hierarchy itself, not a slot.";
2317
+ }];
2318
+ };
2319
+ readonly TreeProp: {
2320
+ readonly group: "data-display";
2321
+ readonly file: "components/data-display.prop.ts";
2322
+ readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "DisabledProp", "SizeProp", "ClassNameProp", "IdProp"];
2219
2323
  };
2220
2324
  readonly CardProp: {
2221
2325
  readonly group: "data-display";
@@ -2562,6 +2666,39 @@ export declare const COMPONENT_PROP_REGISTRY: {
2562
2666
  readonly reason: "Forwarded MasterDetail stacking threshold override.";
2563
2667
  }];
2564
2668
  };
2669
+ readonly ChatComposerSubmitTypeProp: {
2670
+ readonly group: "data-entry";
2671
+ readonly file: "components/data-entry.prop.ts";
2672
+ readonly vocabulary: readonly [];
2673
+ };
2674
+ readonly ChatComposerProp: {
2675
+ readonly group: "data-entry";
2676
+ readonly file: "components/data-entry.prop.ts";
2677
+ readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "PendingProp", "SizeProp", "ControlStatusProp", "NameProp", "IdProp", "ClassNameProp"];
2678
+ };
2679
+ readonly ChatSuggestionItemProp: {
2680
+ readonly group: "data-entry";
2681
+ readonly file: "components/data-entry.prop.ts";
2682
+ readonly vocabulary: readonly ["ValueProp", "LabelProp", "DisabledProp"];
2683
+ };
2684
+ readonly ChatSuggestionRenderProp: {
2685
+ readonly group: "data-entry";
2686
+ readonly file: "components/data-entry.prop.ts";
2687
+ readonly vocabulary: readonly [{
2688
+ readonly field: "onTrigger";
2689
+ readonly local: true;
2690
+ readonly reason: "Render-prop callback the composer calls to re-read the caret; not a value change.";
2691
+ }, {
2692
+ readonly field: "onKeyDown";
2693
+ readonly local: true;
2694
+ readonly reason: "Render-prop keydown forwarder — the composer's own DOM handler, not a state axis.";
2695
+ }];
2696
+ };
2697
+ readonly ChatSuggestionProp: {
2698
+ readonly group: "data-entry";
2699
+ readonly file: "components/data-entry.prop.ts";
2700
+ readonly vocabulary: readonly ["OnValueChangeProp", "OpenProp", "DefaultOpenProp", "OnOpenChangeProp", "ChildrenProp", "EmptyMessageProp", "IdProp", "ClassNameProp"];
2701
+ };
2565
2702
  };
2566
2703
  export type ComponentPropName = keyof typeof COMPONENT_PROP_REGISTRY;
2567
2704
  /** Forbidden duplicate concepts — use the canonical name on the left. */
@@ -2570,10 +2570,152 @@ const COMPONENT_PROP_REGISTRY = {
2570
2570
  }
2571
2571
  ]
2572
2572
  },
2573
- TreeListProp: {
2573
+ ChatBubblePlacementProp: {
2574
2574
  group: "data-display",
2575
- file: "components/data-display/tree-list.tsx",
2576
- vocabulary: ["ClassNameProp"]
2575
+ file: "components/data-display.prop.ts",
2576
+ vocabulary: [
2577
+ {
2578
+ field: "placement",
2579
+ local: true,
2580
+ reason: 'Side of the conversation a message sits on ("start" | "end"), spelled on the LOGICAL inline axis so a feed flips under dir="rtl" with no per-locale branch.'
2581
+ }
2582
+ ]
2583
+ },
2584
+ ChatBubbleVariantProp: {
2585
+ group: "data-display",
2586
+ file: "components/data-display.prop.ts",
2587
+ vocabulary: [
2588
+ {
2589
+ field: "variant",
2590
+ local: true,
2591
+ reason: "Structural treatment of the message body (filled | borderless | outlined). Status colour stays on `tone`; Ant Design X's `shadow` is absent because this system has no drop shadows."
2592
+ }
2593
+ ]
2594
+ },
2595
+ ChatBubbleToneProp: {
2596
+ group: "data-display",
2597
+ file: "components/data-display.prop.ts",
2598
+ vocabulary: ["ToneProp"]
2599
+ },
2600
+ ChatBubbleTypingProp: {
2601
+ group: "data-display",
2602
+ file: "components/data-display.prop.ts",
2603
+ vocabulary: [
2604
+ {
2605
+ field: "typing",
2606
+ local: true,
2607
+ reason: "Stream-in animation: `true` or `{ step, interval }`. Dropped entirely under prefers-reduced-motion, which renders the full text at once (WCAG 2.3.3)."
2608
+ }
2609
+ ]
2610
+ },
2611
+ ChatBubbleProp: {
2612
+ group: "data-display",
2613
+ file: "components/data-display.prop.ts",
2614
+ vocabulary: [
2615
+ "ChildrenProp",
2616
+ "SizeProp",
2617
+ "ToneProp",
2618
+ "PendingProp",
2619
+ "ClassNameProp",
2620
+ "IdProp",
2621
+ {
2622
+ field: "placement",
2623
+ local: true,
2624
+ reason: "See ChatBubblePlacementProp, the conversation-side vocabulary."
2625
+ },
2626
+ {
2627
+ field: "variant",
2628
+ local: true,
2629
+ reason: "See ChatBubbleVariantProp, the message-body treatment vocabulary."
2630
+ },
2631
+ {
2632
+ field: "avatar",
2633
+ local: true,
2634
+ reason: "The author's mark \u2014 a real <Avatar> node. A slot, not a label: the accessible name comes from `header`, so a decorative avatar is aria-hidden at the call site."
2635
+ },
2636
+ {
2637
+ field: "header",
2638
+ local: true,
2639
+ reason: "Line above the body naming the turn's author. Distinct from TitleProp: it is the bubble's ACCESSIBLE NAME, not a heading in the document outline."
2640
+ },
2641
+ {
2642
+ field: "footer",
2643
+ local: true,
2644
+ reason: "Line below the body (timestamp, per-message actions). Not FooterProp, which is a page-level action bar."
2645
+ },
2646
+ {
2647
+ field: "typing",
2648
+ local: true,
2649
+ reason: "See ChatBubbleTypingProp, the stream-in animation vocabulary."
2650
+ }
2651
+ ]
2652
+ },
2653
+ ChatMessageProp: {
2654
+ group: "data-display",
2655
+ file: "components/data-display.prop.ts",
2656
+ vocabulary: [
2657
+ "IdProp",
2658
+ "ChildrenProp",
2659
+ {
2660
+ field: "role",
2661
+ local: true,
2662
+ reason: 'Key into ChatBubbleList\'s `roles` map ("user" | "assistant" | "system" | a product\'s own). A data field, not the ARIA `role` attribute.'
2663
+ },
2664
+ {
2665
+ field: "content",
2666
+ local: true,
2667
+ reason: "The message body. Spelled `content` rather than `children` because a data item in an array is not a JSX child."
2668
+ }
2669
+ ]
2670
+ },
2671
+ ChatBubbleListProp: {
2672
+ group: "data-display",
2673
+ file: "components/data-display.prop.ts",
2674
+ vocabulary: [
2675
+ "LabelProp",
2676
+ "ClassNameProp",
2677
+ "IdProp",
2678
+ {
2679
+ field: "items",
2680
+ local: true,
2681
+ reason: "Consumer-supplied messages in conversation order (see ChatMessageProp)."
2682
+ },
2683
+ {
2684
+ field: "roles",
2685
+ local: true,
2686
+ reason: "Per-role bubble defaults merged UNDER each message's own props, so a feed's shape is declared once instead of on every message."
2687
+ },
2688
+ {
2689
+ field: "autoScroll",
2690
+ local: true,
2691
+ reason: 'Stick-to-bottom while the reader is already at the bottom. Not a generic boolean flag: revoking the pin the moment they scroll up is the behaviour, and it drives the "jump to latest" affordance.'
2692
+ }
2693
+ ]
2694
+ },
2695
+ TreeNodeProp: {
2696
+ group: "data-display",
2697
+ file: "components/data-display.prop.ts",
2698
+ vocabulary: [
2699
+ { field: "icon", local: true, reason: "Per-node glyph drawn when Tree's showIcon is on." },
2700
+ {
2701
+ field: "children",
2702
+ local: true,
2703
+ reason: "The node's own child nodes \u2014 the hierarchy itself, not a slot."
2704
+ }
2705
+ ]
2706
+ },
2707
+ TreeProp: {
2708
+ group: "data-display",
2709
+ file: "components/data-display.prop.ts",
2710
+ vocabulary: [
2711
+ "ValueProp",
2712
+ "DefaultValueProp",
2713
+ "OnValueChangeProp",
2714
+ "DisabledProp",
2715
+ "SizeProp",
2716
+ "ClassNameProp",
2717
+ "IdProp"
2718
+ ]
2577
2719
  },
2578
2720
  CardProp: {
2579
2721
  group: "data-display",
@@ -3010,6 +3152,63 @@ const COMPONENT_PROP_REGISTRY = {
3010
3152
  reason: "Forwarded MasterDetail stacking threshold override."
3011
3153
  }
3012
3154
  ]
3155
+ },
3156
+ ChatComposerSubmitTypeProp: {
3157
+ group: "data-entry",
3158
+ file: "components/data-entry.prop.ts",
3159
+ vocabulary: []
3160
+ },
3161
+ ChatComposerProp: {
3162
+ group: "data-entry",
3163
+ file: "components/data-entry.prop.ts",
3164
+ vocabulary: [
3165
+ "ValueProp",
3166
+ "DefaultValueProp",
3167
+ "OnValueChangeProp",
3168
+ "PlaceholderProp",
3169
+ "DisabledProp",
3170
+ "PendingProp",
3171
+ "SizeProp",
3172
+ "ControlStatusProp",
3173
+ "NameProp",
3174
+ "IdProp",
3175
+ "ClassNameProp"
3176
+ ]
3177
+ },
3178
+ ChatSuggestionItemProp: {
3179
+ group: "data-entry",
3180
+ file: "components/data-entry.prop.ts",
3181
+ vocabulary: ["ValueProp", "LabelProp", "DisabledProp"]
3182
+ },
3183
+ ChatSuggestionRenderProp: {
3184
+ group: "data-entry",
3185
+ file: "components/data-entry.prop.ts",
3186
+ vocabulary: [
3187
+ {
3188
+ field: "onTrigger",
3189
+ local: true,
3190
+ reason: "Render-prop callback the composer calls to re-read the caret; not a value change."
3191
+ },
3192
+ {
3193
+ field: "onKeyDown",
3194
+ local: true,
3195
+ reason: "Render-prop keydown forwarder \u2014 the composer's own DOM handler, not a state axis."
3196
+ }
3197
+ ]
3198
+ },
3199
+ ChatSuggestionProp: {
3200
+ group: "data-entry",
3201
+ file: "components/data-entry.prop.ts",
3202
+ vocabulary: [
3203
+ "OnValueChangeProp",
3204
+ "OpenProp",
3205
+ "DefaultOpenProp",
3206
+ "OnOpenChangeProp",
3207
+ "ChildrenProp",
3208
+ "EmptyMessageProp",
3209
+ "IdProp",
3210
+ "ClassNameProp"
3211
+ ]
3013
3212
  }
3014
3213
  };
3015
3214
  const PROP_ALIASES_FORBIDDEN = {
@@ -1840,6 +1840,13 @@
1840
1840
  }
1841
1841
  }
1842
1842
 
1843
+ @layer components {
1844
+
1845
+ .ui-chat-suggestion-panel {
1846
+ --popover-surface-inline-size: var(--radix-popover-trigger-width);
1847
+ }
1848
+ }
1849
+
1843
1850
  @layer components {
1844
1851
 
1845
1852
  .ui-tree-select-popover {