entangle-ui 0.6.2 → 0.7.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 (152) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +5 -3
  3. package/dist/esm/_virtual/_commonjsHelpers.js +6 -0
  4. package/dist/esm/_virtual/_commonjsHelpers.js.map +1 -0
  5. package/dist/esm/_virtual/cssesc.js +5 -1
  6. package/dist/esm/_virtual/cssesc.js.map +1 -1
  7. package/dist/esm/_virtual/picocolors.js +8 -0
  8. package/dist/esm/_virtual/picocolors.js.map +1 -0
  9. package/dist/esm/_virtual/picocolors2.js +4 -0
  10. package/dist/esm/_virtual/picocolors2.js.map +1 -0
  11. package/dist/esm/assets/src/components/editor/ChatPanel/{ChatPanel.css.ts.vanilla-DPIGnZ4A.css → ChatPanel.css.ts.vanilla-BI5569ZO.css} +81 -1
  12. package/dist/esm/assets/src/components/feedback/EmptyState/EmptyState.css.ts.vanilla-B_TWsTOW.css +58 -0
  13. package/dist/esm/assets/src/components/feedback/Spinner/Spinner.css.ts.vanilla-DEUewqdK.css +80 -0
  14. package/dist/esm/assets/src/components/layout/Divider/Divider.css.ts.vanilla-CPvd_RW9.css +72 -0
  15. package/dist/esm/assets/src/components/layout/ListItem/ListItem.css.ts.vanilla-BwAZrX2f.css +68 -0
  16. package/dist/esm/assets/src/components/layout/PageHeader/PageHeader.css.ts.vanilla-DdbyyWAN.css +70 -0
  17. package/dist/esm/assets/src/components/layout/SplitPane/{SplitPane.css.ts.vanilla-BFxdvwyI.css → SplitPane.css.ts.vanilla-BGFZ7zDa.css} +5 -0
  18. package/dist/esm/assets/src/components/primitives/Badge/Badge.css.ts.vanilla-DxCUcxYW.css +95 -0
  19. package/dist/esm/assets/src/components/primitives/Code/Code.css.ts.vanilla-mayBqLDM.css +19 -0
  20. package/dist/esm/assets/src/components/primitives/TextArea/TextArea.css.ts.vanilla-DTOMjGkp.css +85 -0
  21. package/dist/esm/assets/src/theme/{darkTheme.css.ts.vanilla-DCe89yCJ.css → darkTheme.css.ts.vanilla-ab1WD4dr.css} +3 -0
  22. package/dist/esm/assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css +21 -0
  23. package/dist/esm/assets/src/utils/animations.css.ts.vanilla-DOVlpljP.css +58 -0
  24. package/dist/esm/components/editor/ChatPanel/ChatInput.js +18 -7
  25. package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
  26. package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js +268 -0
  27. package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js.map +1 -0
  28. package/dist/esm/components/editor/ChatPanel/ChatMessage.js +15 -3
  29. package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
  30. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js +19 -5
  31. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js.map +1 -1
  32. package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js +14 -2
  33. package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js.map +1 -1
  34. package/dist/esm/components/editor/ChatPanel/ChatPanel.js +15 -3
  35. package/dist/esm/components/editor/ChatPanel/ChatPanel.js.map +1 -1
  36. package/dist/esm/components/editor/ChatPanel/useChatInput.js +3 -3
  37. package/dist/esm/components/editor/ChatPanel/useChatInput.js.map +1 -1
  38. package/dist/esm/components/editor/ChatPanel/useChatScroll.js +59 -2
  39. package/dist/esm/components/editor/ChatPanel/useChatScroll.js.map +1 -1
  40. package/dist/esm/components/feedback/EmptyState/EmptyState.css.js +13 -0
  41. package/dist/esm/components/feedback/EmptyState/EmptyState.css.js.map +1 -0
  42. package/dist/esm/components/feedback/EmptyState/EmptyState.js +43 -0
  43. package/dist/esm/components/feedback/EmptyState/EmptyState.js.map +1 -0
  44. package/dist/esm/components/feedback/Spinner/Spinner.css.js +16 -0
  45. package/dist/esm/components/feedback/Spinner/Spinner.css.js.map +1 -0
  46. package/dist/esm/components/feedback/Spinner/Spinner.js +50 -0
  47. package/dist/esm/components/feedback/Spinner/Spinner.js.map +1 -0
  48. package/dist/esm/components/layout/Divider/Divider.css.js +9 -0
  49. package/dist/esm/components/layout/Divider/Divider.css.js.map +1 -0
  50. package/dist/esm/components/layout/Divider/Divider.js +51 -0
  51. package/dist/esm/components/layout/Divider/Divider.js.map +1 -0
  52. package/dist/esm/components/layout/ListItem/ListItem.css.js +10 -0
  53. package/dist/esm/components/layout/ListItem/ListItem.css.js.map +1 -0
  54. package/dist/esm/components/layout/ListItem/ListItem.js +45 -0
  55. package/dist/esm/components/layout/ListItem/ListItem.js.map +1 -0
  56. package/dist/esm/components/layout/PageHeader/PageHeader.css.js +13 -0
  57. package/dist/esm/components/layout/PageHeader/PageHeader.css.js.map +1 -0
  58. package/dist/esm/components/layout/PageHeader/PageHeader.js +29 -0
  59. package/dist/esm/components/layout/PageHeader/PageHeader.js.map +1 -0
  60. package/dist/esm/components/layout/SplitPane/SplitPane.css.js +1 -1
  61. package/dist/esm/components/navigation/Tabs/TabPanel.js +6 -3
  62. package/dist/esm/components/navigation/Tabs/TabPanel.js.map +1 -1
  63. package/dist/esm/components/navigation/Tabs/Tabs.js +3 -1
  64. package/dist/esm/components/navigation/Tabs/Tabs.js.map +1 -1
  65. package/dist/esm/components/primitives/Badge/Badge.css.js +12 -0
  66. package/dist/esm/components/primitives/Badge/Badge.css.js.map +1 -0
  67. package/dist/esm/components/primitives/Badge/Badge.js +67 -0
  68. package/dist/esm/components/primitives/Badge/Badge.js.map +1 -0
  69. package/dist/esm/components/primitives/Code/Code.css.js +7 -0
  70. package/dist/esm/components/primitives/Code/Code.css.js.map +1 -0
  71. package/dist/esm/components/primitives/Code/Code.js +24 -0
  72. package/dist/esm/components/primitives/Code/Code.js.map +1 -0
  73. package/dist/esm/components/primitives/TextArea/TextArea.css.js +10 -0
  74. package/dist/esm/components/primitives/TextArea/TextArea.css.js.map +1 -0
  75. package/dist/esm/components/primitives/TextArea/TextArea.js +97 -0
  76. package/dist/esm/components/primitives/TextArea/TextArea.js.map +1 -0
  77. package/dist/esm/index.js +12 -1
  78. package/dist/esm/index.js.map +1 -1
  79. package/dist/esm/node_modules/@emotion/hash/dist/emotion-hash.esm.js +56 -0
  80. package/dist/esm/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
  81. package/dist/esm/node_modules/@vanilla-extract/css/adapter/dist/vanilla-extract-css-adapter.esm.js +32 -1
  82. package/dist/esm/node_modules/@vanilla-extract/css/adapter/dist/vanilla-extract-css-adapter.esm.js.map +1 -1
  83. package/dist/esm/node_modules/@vanilla-extract/css/dist/taggedTemplateLiteral-10998315.esm.js +13 -0
  84. package/dist/esm/node_modules/@vanilla-extract/css/dist/taggedTemplateLiteral-10998315.esm.js.map +1 -0
  85. package/dist/esm/node_modules/@vanilla-extract/css/dist/transformCss-fd0786e1.esm.js +837 -3
  86. package/dist/esm/node_modules/@vanilla-extract/css/dist/transformCss-fd0786e1.esm.js.map +1 -1
  87. package/dist/esm/node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js +244 -5
  88. package/dist/esm/node_modules/@vanilla-extract/css/dist/vanilla-extract-css.esm.js.map +1 -1
  89. package/dist/esm/node_modules/@vanilla-extract/css/fileScope/dist/vanilla-extract-css-fileScope.esm.js +18 -0
  90. package/dist/esm/node_modules/@vanilla-extract/css/fileScope/dist/vanilla-extract-css-fileScope.esm.js.map +1 -0
  91. package/dist/esm/node_modules/@vanilla-extract/css/injectStyles/dist/vanilla-extract-css-injectStyles.esm.js +23 -0
  92. package/dist/esm/node_modules/@vanilla-extract/css/injectStyles/dist/vanilla-extract-css-injectStyles.esm.js.map +1 -0
  93. package/dist/esm/node_modules/@vanilla-extract/private/dist/vanilla-extract-private.esm.js +38 -0
  94. package/dist/esm/node_modules/@vanilla-extract/private/dist/vanilla-extract-private.esm.js.map +1 -0
  95. package/dist/esm/node_modules/css-what/lib/es/parse.js +424 -0
  96. package/dist/esm/node_modules/css-what/lib/es/parse.js.map +1 -0
  97. package/dist/esm/node_modules/css-what/lib/es/types.js +29 -0
  98. package/dist/esm/node_modules/css-what/lib/es/types.js.map +1 -0
  99. package/dist/esm/node_modules/dedent/dist/dedent.js +3 -1
  100. package/dist/esm/node_modules/dedent/dist/dedent.js.map +1 -1
  101. package/dist/esm/node_modules/deep-object-diff/mjs/diff.js +40 -0
  102. package/dist/esm/node_modules/deep-object-diff/mjs/diff.js.map +1 -0
  103. package/dist/esm/node_modules/deep-object-diff/mjs/utils.js +9 -0
  104. package/dist/esm/node_modules/deep-object-diff/mjs/utils.js.map +1 -0
  105. package/dist/esm/node_modules/media-query-parser/dist/media-query-parser.esm.js +1386 -0
  106. package/dist/esm/node_modules/media-query-parser/dist/media-query-parser.esm.js.map +1 -0
  107. package/dist/esm/node_modules/modern-ahocorasick/dist/index.js +102 -0
  108. package/dist/esm/node_modules/modern-ahocorasick/dist/index.js.map +1 -0
  109. package/dist/esm/node_modules/picocolors/picocolors.js +87 -0
  110. package/dist/esm/node_modules/picocolors/picocolors.js.map +1 -0
  111. package/dist/esm/theme/ThemeProvider.js +17 -3
  112. package/dist/esm/theme/ThemeProvider.js.map +1 -1
  113. package/dist/esm/theme/contract.css.js +1 -1
  114. package/dist/esm/theme/createCustomTheme.js +33 -0
  115. package/dist/esm/theme/createCustomTheme.js.map +1 -0
  116. package/dist/esm/theme/darkTheme.css.js +2 -2
  117. package/dist/esm/theme/globalScrollbars.css.js +6 -0
  118. package/dist/esm/theme/globalScrollbars.css.js.map +1 -0
  119. package/dist/esm/utils/animations.css.js +13 -0
  120. package/dist/esm/utils/animations.css.js.map +1 -0
  121. package/dist/esm/utils/objects.js +22 -0
  122. package/dist/esm/utils/objects.js.map +1 -0
  123. package/dist/types/components/editor/ChatPanel/ChatMarkdownRenderer.d.ts +323 -0
  124. package/dist/types/components/editor/ChatPanel/ChatMarkdownRenderer.types.d.ts +46 -0
  125. package/dist/types/components/editor/ChatPanel/ChatMessage.d.ts +1 -0
  126. package/dist/types/components/editor/ChatPanel/ChatMessageList.d.ts +2 -1
  127. package/dist/types/components/editor/ChatPanel/ChatPanel.d.ts +1 -0
  128. package/dist/types/components/editor/ChatPanel/ChatPanel.types.d.ts +82 -1
  129. package/dist/types/components/feedback/EmptyState/EmptyState.d.ts +313 -0
  130. package/dist/types/components/feedback/EmptyState/EmptyState.types.d.ts +31 -0
  131. package/dist/types/components/feedback/Spinner/Spinner.d.ts +306 -0
  132. package/dist/types/components/feedback/Spinner/Spinner.types.d.ts +41 -0
  133. package/dist/types/components/layout/Divider/Divider.d.ts +307 -0
  134. package/dist/types/components/layout/Divider/Divider.types.d.ts +50 -0
  135. package/dist/types/components/layout/ListItem/ListItem.d.ts +312 -0
  136. package/dist/types/components/layout/ListItem/ListItem.types.d.ts +35 -0
  137. package/dist/types/components/layout/PageHeader/PageHeader.d.ts +311 -0
  138. package/dist/types/components/layout/PageHeader/PageHeader.types.d.ts +30 -0
  139. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +10 -0
  140. package/dist/types/components/primitives/Badge/Badge.d.ts +310 -0
  141. package/dist/types/components/primitives/Badge/Badge.types.d.ts +67 -0
  142. package/dist/types/components/primitives/Code/Code.d.ts +301 -0
  143. package/dist/types/components/primitives/Code/Code.types.d.ts +17 -0
  144. package/dist/types/components/primitives/TextArea/TextArea.d.ts +26 -0
  145. package/dist/types/components/primitives/TextArea/TextArea.types.d.ts +76 -0
  146. package/dist/types/index.d.ts +22 -2
  147. package/dist/types/theme/ThemeProvider.d.ts +14 -2
  148. package/dist/types/theme/contract.css.d.ts +3 -0
  149. package/dist/types/theme/createCustomTheme.d.ts +29 -0
  150. package/dist/types/theme/darkTheme.css.d.ts +3 -0
  151. package/dist/types/utils/animations.css.d.ts +18 -0
  152. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.js","sources":["../../../../src/utils/objects.ts"],"sourcesContent":[null],"names":[],"mappings":"MAEa,SAAS,GAAG,CACvB,MAAS,EACT,MAAsB,KACjB;AACL,IAAA,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE;AAC5B,IAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AACxB,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC;AAC/B,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC;AAE/B,QAAA,IACE,WAAW;YACX,OAAO,WAAW,KAAK,QAAQ;AAC/B,YAAA,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,WAAW;YACX,OAAO,WAAW,KAAK,QAAQ;AAC/B,YAAA,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC3B;YACA,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,WAAsC,EACtC,WAAmD,CACrB;QAClC;AAAO,aAAA,IAAI,WAAW,KAAK,SAAS,EAAE;AACpC,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,WAA0C;QAC1D;IACF;AACA,IAAA,OAAO,MAAM;AACf;;;;"}
@@ -0,0 +1,323 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * Lightweight markdown renderer for chat messages.
5
+ *
6
+ * Pass it to `ChatMessage.renderContent` to render assistant responses
7
+ * with bold / italic / inline code, links, fenced code blocks, lists,
8
+ * blockquotes, horizontal rules, and GFM pipe tables.
9
+ *
10
+ * For advanced markdown features, supply a custom `renderContent`
11
+ * function that uses your markdown library of choice.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <ChatMessage
16
+ * message={msg}
17
+ * renderContent={content => <ChatMarkdownRenderer content={content} />}
18
+ * />
19
+ * ```
20
+ */
21
+ declare const ChatMarkdownRenderer: React.NamedExoticComponent<{
22
+ content: string;
23
+ gfm?: boolean | undefined;
24
+ linkTarget?: "_self" | "_blank" | undefined;
25
+ components?: Partial<{
26
+ code: React.ComponentType<{
27
+ children: React.ReactNode;
28
+ }>;
29
+ codeBlock: React.ComponentType<{
30
+ code: string;
31
+ language?: string;
32
+ }>;
33
+ link: React.ComponentType<{
34
+ href: string;
35
+ target?: string;
36
+ rel?: string;
37
+ children: React.ReactNode;
38
+ }>;
39
+ }> | undefined;
40
+ id?: string | undefined | undefined;
41
+ className?: string | undefined | undefined;
42
+ testId?: string | undefined;
43
+ style?: React.CSSProperties | undefined;
44
+ ref?: React.Ref<HTMLDivElement> | undefined;
45
+ defaultChecked?: boolean | undefined | undefined;
46
+ defaultValue?: string | number | readonly string[] | undefined;
47
+ suppressContentEditableWarning?: boolean | undefined | undefined;
48
+ suppressHydrationWarning?: boolean | undefined | undefined;
49
+ accessKey?: string | undefined | undefined;
50
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
51
+ autoFocus?: boolean | undefined | undefined;
52
+ contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
53
+ contextMenu?: string | undefined | undefined;
54
+ dir?: string | undefined | undefined;
55
+ draggable?: (boolean | "true" | "false") | undefined;
56
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
57
+ hidden?: boolean | undefined | undefined;
58
+ lang?: string | undefined | undefined;
59
+ nonce?: string | undefined | undefined;
60
+ slot?: string | undefined | undefined;
61
+ spellCheck?: (boolean | "true" | "false") | undefined;
62
+ tabIndex?: number | undefined | undefined;
63
+ title?: string | undefined | undefined;
64
+ translate?: "yes" | "no" | undefined | undefined;
65
+ radioGroup?: string | undefined | undefined;
66
+ role?: React.AriaRole | undefined;
67
+ about?: string | undefined | undefined;
68
+ datatype?: string | undefined | undefined;
69
+ inlist?: any;
70
+ prefix?: string | undefined | undefined;
71
+ property?: string | undefined | undefined;
72
+ rel?: string | undefined | undefined;
73
+ resource?: string | undefined | undefined;
74
+ rev?: string | undefined | undefined;
75
+ typeof?: string | undefined | undefined;
76
+ vocab?: string | undefined | undefined;
77
+ autoCorrect?: string | undefined | undefined;
78
+ autoSave?: string | undefined | undefined;
79
+ color?: string | undefined | undefined;
80
+ itemProp?: string | undefined | undefined;
81
+ itemScope?: boolean | undefined | undefined;
82
+ itemType?: string | undefined | undefined;
83
+ itemID?: string | undefined | undefined;
84
+ itemRef?: string | undefined | undefined;
85
+ results?: number | undefined | undefined;
86
+ security?: string | undefined | undefined;
87
+ unselectable?: "on" | "off" | undefined | undefined;
88
+ popover?: "" | "auto" | "manual" | "hint" | undefined | undefined;
89
+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined | undefined;
90
+ popoverTarget?: string | undefined | undefined;
91
+ inert?: boolean | undefined | undefined;
92
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
93
+ is?: string | undefined | undefined;
94
+ exportparts?: string | undefined | undefined;
95
+ part?: string | undefined | undefined;
96
+ "aria-activedescendant"?: string | undefined | undefined;
97
+ "aria-atomic"?: (boolean | "true" | "false") | undefined;
98
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
99
+ "aria-braillelabel"?: string | undefined | undefined;
100
+ "aria-brailleroledescription"?: string | undefined | undefined;
101
+ "aria-busy"?: (boolean | "true" | "false") | undefined;
102
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
103
+ "aria-colcount"?: number | undefined | undefined;
104
+ "aria-colindex"?: number | undefined | undefined;
105
+ "aria-colindextext"?: string | undefined | undefined;
106
+ "aria-colspan"?: number | undefined | undefined;
107
+ "aria-controls"?: string | undefined | undefined;
108
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
109
+ "aria-describedby"?: string | undefined | undefined;
110
+ "aria-description"?: string | undefined | undefined;
111
+ "aria-details"?: string | undefined | undefined;
112
+ "aria-disabled"?: (boolean | "true" | "false") | undefined;
113
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
114
+ "aria-errormessage"?: string | undefined | undefined;
115
+ "aria-expanded"?: (boolean | "true" | "false") | undefined;
116
+ "aria-flowto"?: string | undefined | undefined;
117
+ "aria-grabbed"?: (boolean | "true" | "false") | undefined;
118
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
119
+ "aria-hidden"?: (boolean | "true" | "false") | undefined;
120
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
121
+ "aria-keyshortcuts"?: string | undefined | undefined;
122
+ "aria-label"?: string | undefined | undefined;
123
+ "aria-labelledby"?: string | undefined | undefined;
124
+ "aria-level"?: number | undefined | undefined;
125
+ "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
126
+ "aria-modal"?: (boolean | "true" | "false") | undefined;
127
+ "aria-multiline"?: (boolean | "true" | "false") | undefined;
128
+ "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
129
+ "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
130
+ "aria-owns"?: string | undefined | undefined;
131
+ "aria-placeholder"?: string | undefined | undefined;
132
+ "aria-posinset"?: number | undefined | undefined;
133
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
134
+ "aria-readonly"?: (boolean | "true" | "false") | undefined;
135
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
136
+ "aria-required"?: (boolean | "true" | "false") | undefined;
137
+ "aria-roledescription"?: string | undefined | undefined;
138
+ "aria-rowcount"?: number | undefined | undefined;
139
+ "aria-rowindex"?: number | undefined | undefined;
140
+ "aria-rowindextext"?: string | undefined | undefined;
141
+ "aria-rowspan"?: number | undefined | undefined;
142
+ "aria-selected"?: (boolean | "true" | "false") | undefined;
143
+ "aria-setsize"?: number | undefined | undefined;
144
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
145
+ "aria-valuemax"?: number | undefined | undefined;
146
+ "aria-valuemin"?: number | undefined | undefined;
147
+ "aria-valuenow"?: number | undefined | undefined;
148
+ "aria-valuetext"?: string | undefined | undefined;
149
+ children?: React.ReactNode;
150
+ dangerouslySetInnerHTML?: {
151
+ __html: string | TrustedHTML;
152
+ } | undefined | undefined;
153
+ onCopy?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
154
+ onCopyCapture?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
155
+ onCut?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
156
+ onCutCapture?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
157
+ onPaste?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
158
+ onPasteCapture?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
159
+ onCompositionEnd?: React.CompositionEventHandler<HTMLDivElement> | undefined;
160
+ onCompositionEndCapture?: React.CompositionEventHandler<HTMLDivElement> | undefined;
161
+ onCompositionStart?: React.CompositionEventHandler<HTMLDivElement> | undefined;
162
+ onCompositionStartCapture?: React.CompositionEventHandler<HTMLDivElement> | undefined;
163
+ onCompositionUpdate?: React.CompositionEventHandler<HTMLDivElement> | undefined;
164
+ onCompositionUpdateCapture?: React.CompositionEventHandler<HTMLDivElement> | undefined;
165
+ onFocus?: React.FocusEventHandler<HTMLDivElement> | undefined;
166
+ onFocusCapture?: React.FocusEventHandler<HTMLDivElement> | undefined;
167
+ onBlur?: React.FocusEventHandler<HTMLDivElement> | undefined;
168
+ onBlurCapture?: React.FocusEventHandler<HTMLDivElement> | undefined;
169
+ onChange?: React.ChangeEventHandler<HTMLDivElement, Element> | undefined;
170
+ onChangeCapture?: React.ChangeEventHandler<HTMLDivElement, Element> | undefined;
171
+ onBeforeInput?: React.InputEventHandler<HTMLDivElement> | undefined;
172
+ onBeforeInputCapture?: React.InputEventHandler<HTMLDivElement> | undefined;
173
+ onInput?: React.InputEventHandler<HTMLDivElement> | undefined;
174
+ onInputCapture?: React.InputEventHandler<HTMLDivElement> | undefined;
175
+ onReset?: React.ReactEventHandler<HTMLDivElement> | undefined;
176
+ onResetCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
177
+ onSubmit?: React.SubmitEventHandler<HTMLDivElement> | undefined;
178
+ onSubmitCapture?: React.SubmitEventHandler<HTMLDivElement> | undefined;
179
+ onInvalid?: React.ReactEventHandler<HTMLDivElement> | undefined;
180
+ onInvalidCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
181
+ onLoad?: React.ReactEventHandler<HTMLDivElement> | undefined;
182
+ onLoadCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
183
+ onError?: React.ReactEventHandler<HTMLDivElement> | undefined;
184
+ onErrorCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
185
+ onKeyDown?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
186
+ onKeyDownCapture?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
187
+ onKeyPress?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
188
+ onKeyPressCapture?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
189
+ onKeyUp?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
190
+ onKeyUpCapture?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
191
+ onAbort?: React.ReactEventHandler<HTMLDivElement> | undefined;
192
+ onAbortCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
193
+ onCanPlay?: React.ReactEventHandler<HTMLDivElement> | undefined;
194
+ onCanPlayCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
195
+ onCanPlayThrough?: React.ReactEventHandler<HTMLDivElement> | undefined;
196
+ onCanPlayThroughCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
197
+ onDurationChange?: React.ReactEventHandler<HTMLDivElement> | undefined;
198
+ onDurationChangeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
199
+ onEmptied?: React.ReactEventHandler<HTMLDivElement> | undefined;
200
+ onEmptiedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
201
+ onEncrypted?: React.ReactEventHandler<HTMLDivElement> | undefined;
202
+ onEncryptedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
203
+ onEnded?: React.ReactEventHandler<HTMLDivElement> | undefined;
204
+ onEndedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
205
+ onLoadedData?: React.ReactEventHandler<HTMLDivElement> | undefined;
206
+ onLoadedDataCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
207
+ onLoadedMetadata?: React.ReactEventHandler<HTMLDivElement> | undefined;
208
+ onLoadedMetadataCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
209
+ onLoadStart?: React.ReactEventHandler<HTMLDivElement> | undefined;
210
+ onLoadStartCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
211
+ onPause?: React.ReactEventHandler<HTMLDivElement> | undefined;
212
+ onPauseCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
213
+ onPlay?: React.ReactEventHandler<HTMLDivElement> | undefined;
214
+ onPlayCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
215
+ onPlaying?: React.ReactEventHandler<HTMLDivElement> | undefined;
216
+ onPlayingCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
217
+ onProgress?: React.ReactEventHandler<HTMLDivElement> | undefined;
218
+ onProgressCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
219
+ onRateChange?: React.ReactEventHandler<HTMLDivElement> | undefined;
220
+ onRateChangeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
221
+ onSeeked?: React.ReactEventHandler<HTMLDivElement> | undefined;
222
+ onSeekedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
223
+ onSeeking?: React.ReactEventHandler<HTMLDivElement> | undefined;
224
+ onSeekingCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
225
+ onStalled?: React.ReactEventHandler<HTMLDivElement> | undefined;
226
+ onStalledCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
227
+ onSuspend?: React.ReactEventHandler<HTMLDivElement> | undefined;
228
+ onSuspendCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
229
+ onTimeUpdate?: React.ReactEventHandler<HTMLDivElement> | undefined;
230
+ onTimeUpdateCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
231
+ onVolumeChange?: React.ReactEventHandler<HTMLDivElement> | undefined;
232
+ onVolumeChangeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
233
+ onWaiting?: React.ReactEventHandler<HTMLDivElement> | undefined;
234
+ onWaitingCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
235
+ onAuxClick?: React.MouseEventHandler<HTMLDivElement> | undefined;
236
+ onAuxClickCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
237
+ onClick?: React.MouseEventHandler<HTMLDivElement> | undefined;
238
+ onClickCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
239
+ onContextMenu?: React.MouseEventHandler<HTMLDivElement> | undefined;
240
+ onContextMenuCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
241
+ onDoubleClick?: React.MouseEventHandler<HTMLDivElement> | undefined;
242
+ onDoubleClickCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
243
+ onDrag?: React.DragEventHandler<HTMLDivElement> | undefined;
244
+ onDragCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
245
+ onDragEnd?: React.DragEventHandler<HTMLDivElement> | undefined;
246
+ onDragEndCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
247
+ onDragEnter?: React.DragEventHandler<HTMLDivElement> | undefined;
248
+ onDragEnterCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
249
+ onDragExit?: React.DragEventHandler<HTMLDivElement> | undefined;
250
+ onDragExitCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
251
+ onDragLeave?: React.DragEventHandler<HTMLDivElement> | undefined;
252
+ onDragLeaveCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
253
+ onDragOver?: React.DragEventHandler<HTMLDivElement> | undefined;
254
+ onDragOverCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
255
+ onDragStart?: React.DragEventHandler<HTMLDivElement> | undefined;
256
+ onDragStartCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
257
+ onDrop?: React.DragEventHandler<HTMLDivElement> | undefined;
258
+ onDropCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
259
+ onMouseDown?: React.MouseEventHandler<HTMLDivElement> | undefined;
260
+ onMouseDownCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
261
+ onMouseEnter?: React.MouseEventHandler<HTMLDivElement> | undefined;
262
+ onMouseLeave?: React.MouseEventHandler<HTMLDivElement> | undefined;
263
+ onMouseMove?: React.MouseEventHandler<HTMLDivElement> | undefined;
264
+ onMouseMoveCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
265
+ onMouseOut?: React.MouseEventHandler<HTMLDivElement> | undefined;
266
+ onMouseOutCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
267
+ onMouseOver?: React.MouseEventHandler<HTMLDivElement> | undefined;
268
+ onMouseOverCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
269
+ onMouseUp?: React.MouseEventHandler<HTMLDivElement> | undefined;
270
+ onMouseUpCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
271
+ onSelect?: React.ReactEventHandler<HTMLDivElement> | undefined;
272
+ onSelectCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
273
+ onTouchCancel?: React.TouchEventHandler<HTMLDivElement> | undefined;
274
+ onTouchCancelCapture?: React.TouchEventHandler<HTMLDivElement> | undefined;
275
+ onTouchEnd?: React.TouchEventHandler<HTMLDivElement> | undefined;
276
+ onTouchEndCapture?: React.TouchEventHandler<HTMLDivElement> | undefined;
277
+ onTouchMove?: React.TouchEventHandler<HTMLDivElement> | undefined;
278
+ onTouchMoveCapture?: React.TouchEventHandler<HTMLDivElement> | undefined;
279
+ onTouchStart?: React.TouchEventHandler<HTMLDivElement> | undefined;
280
+ onTouchStartCapture?: React.TouchEventHandler<HTMLDivElement> | undefined;
281
+ onPointerDown?: React.PointerEventHandler<HTMLDivElement> | undefined;
282
+ onPointerDownCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
283
+ onPointerMove?: React.PointerEventHandler<HTMLDivElement> | undefined;
284
+ onPointerMoveCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
285
+ onPointerUp?: React.PointerEventHandler<HTMLDivElement> | undefined;
286
+ onPointerUpCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
287
+ onPointerCancel?: React.PointerEventHandler<HTMLDivElement> | undefined;
288
+ onPointerCancelCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
289
+ onPointerEnter?: React.PointerEventHandler<HTMLDivElement> | undefined;
290
+ onPointerLeave?: React.PointerEventHandler<HTMLDivElement> | undefined;
291
+ onPointerOver?: React.PointerEventHandler<HTMLDivElement> | undefined;
292
+ onPointerOverCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
293
+ onPointerOut?: React.PointerEventHandler<HTMLDivElement> | undefined;
294
+ onPointerOutCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
295
+ onGotPointerCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
296
+ onGotPointerCaptureCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
297
+ onLostPointerCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
298
+ onLostPointerCaptureCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
299
+ onScroll?: React.UIEventHandler<HTMLDivElement> | undefined;
300
+ onScrollCapture?: React.UIEventHandler<HTMLDivElement> | undefined;
301
+ onScrollEnd?: React.UIEventHandler<HTMLDivElement> | undefined;
302
+ onScrollEndCapture?: React.UIEventHandler<HTMLDivElement> | undefined;
303
+ onWheel?: React.WheelEventHandler<HTMLDivElement> | undefined;
304
+ onWheelCapture?: React.WheelEventHandler<HTMLDivElement> | undefined;
305
+ onAnimationStart?: React.AnimationEventHandler<HTMLDivElement> | undefined;
306
+ onAnimationStartCapture?: React.AnimationEventHandler<HTMLDivElement> | undefined;
307
+ onAnimationEnd?: React.AnimationEventHandler<HTMLDivElement> | undefined;
308
+ onAnimationEndCapture?: React.AnimationEventHandler<HTMLDivElement> | undefined;
309
+ onAnimationIteration?: React.AnimationEventHandler<HTMLDivElement> | undefined;
310
+ onAnimationIterationCapture?: React.AnimationEventHandler<HTMLDivElement> | undefined;
311
+ onToggle?: React.ToggleEventHandler<HTMLDivElement> | undefined;
312
+ onBeforeToggle?: React.ToggleEventHandler<HTMLDivElement> | undefined;
313
+ onTransitionCancel?: React.TransitionEventHandler<HTMLDivElement> | undefined;
314
+ onTransitionCancelCapture?: React.TransitionEventHandler<HTMLDivElement> | undefined;
315
+ onTransitionEnd?: React.TransitionEventHandler<HTMLDivElement> | undefined;
316
+ onTransitionEndCapture?: React.TransitionEventHandler<HTMLDivElement> | undefined;
317
+ onTransitionRun?: React.TransitionEventHandler<HTMLDivElement> | undefined;
318
+ onTransitionRunCapture?: React.TransitionEventHandler<HTMLDivElement> | undefined;
319
+ onTransitionStart?: React.TransitionEventHandler<HTMLDivElement> | undefined;
320
+ onTransitionStartCapture?: React.TransitionEventHandler<HTMLDivElement> | undefined;
321
+ }>;
322
+
323
+ export { ChatMarkdownRenderer };
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import { BaseComponent } from '../../../types/common.js';
3
+ import { Prettify } from '../../../types/utilities.js';
4
+
5
+ interface ChatMarkdownRendererBaseProps extends BaseComponent {
6
+ /** Raw markdown content. */
7
+ content: string;
8
+ /**
9
+ * Enable GitHub-flavored markdown extensions
10
+ * (tables, task lists, autolinks).
11
+ * @default true
12
+ */
13
+ gfm?: boolean;
14
+ /**
15
+ * Link `target` attribute. External links are always rendered with
16
+ * `rel="noopener noreferrer"`.
17
+ * @default "_blank"
18
+ */
19
+ linkTarget?: '_self' | '_blank';
20
+ /**
21
+ * Override individual node renderers. Keys match the node type:
22
+ * `code`, `codeBlock`, `link`, `paragraph`, `heading`, `list`,
23
+ * `listItem`, `blockquote`, `table`, `hr`, `text`.
24
+ *
25
+ * Rarely needed — use a custom `renderContent` on `ChatMessage` for
26
+ * substantially different renderers.
27
+ */
28
+ components?: Partial<{
29
+ code: React.ComponentType<{
30
+ children: React.ReactNode;
31
+ }>;
32
+ codeBlock: React.ComponentType<{
33
+ code: string;
34
+ language?: string;
35
+ }>;
36
+ link: React.ComponentType<{
37
+ href: string;
38
+ target?: string;
39
+ rel?: string;
40
+ children: React.ReactNode;
41
+ }>;
42
+ }>;
43
+ }
44
+ type ChatMarkdownRendererProps = Prettify<ChatMarkdownRendererBaseProps>;
45
+
46
+ export type { ChatMarkdownRendererBaseProps, ChatMarkdownRendererProps };
@@ -7,6 +7,7 @@ declare const ChatMessage: React.NamedExoticComponent<{
7
7
  showAvatar?: boolean | undefined;
8
8
  actions?: React.ReactNode;
9
9
  renderContent?: ((content: string) => React.ReactNode) | undefined;
10
+ maxWidth?: number | string | undefined;
10
11
  id?: string | undefined | undefined;
11
12
  className?: string | undefined | undefined;
12
13
  testId?: string | undefined;
@@ -1,4 +1,4 @@
1
- import { ChatMessageData } from './ChatPanel.types.js';
1
+ import { ChatMessageData, ChatMessageListScrollApi } from './ChatPanel.types.js';
2
2
  import React from 'react';
3
3
 
4
4
  declare const ChatMessageList: React.NamedExoticComponent<{
@@ -6,6 +6,7 @@ declare const ChatMessageList: React.NamedExoticComponent<{
6
6
  renderMessage?: ((message: ChatMessageData, index: number) => React.ReactNode) | undefined;
7
7
  emptyState?: React.ReactNode;
8
8
  autoScroll?: boolean | undefined;
9
+ scrollApiRef?: React.Ref<ChatMessageListScrollApi> | undefined;
9
10
  id?: string | undefined | undefined;
10
11
  className?: string | undefined | undefined;
11
12
  testId?: string | undefined;
@@ -3,6 +3,7 @@ import React from 'react';
3
3
 
4
4
  declare const ChatPanel: React.NamedExoticComponent<{
5
5
  density?: ChatPanelDensity | undefined;
6
+ messageMaxWidth?: number | string | undefined;
6
7
  children: React.ReactNode;
7
8
  id?: string | undefined | undefined;
8
9
  className?: string | undefined | undefined;
@@ -104,6 +104,16 @@ interface ChatPanelBaseProps extends BaseComponent {
104
104
  * @default "comfortable"
105
105
  */
106
106
  density?: ChatPanelDensity;
107
+ /**
108
+ * Maximum width of message bubbles inside this panel.
109
+ *
110
+ * Cascades to every `ChatMessage` via the
111
+ * `--etui-chat-message-max-width` CSS variable. Individual messages
112
+ * can override with their own `maxWidth` prop.
113
+ *
114
+ * Numbers are interpreted as pixels; strings are used verbatim.
115
+ */
116
+ messageMaxWidth?: number | string;
107
117
  /** Panel content — typically ChatMessageList + ChatInput */
108
118
  children: React.ReactNode;
109
119
  }
@@ -126,6 +136,21 @@ interface ChatMessageListBaseProps extends BaseComponent {
126
136
  * @default true
127
137
  */
128
138
  autoScroll?: boolean;
139
+ /**
140
+ * Imperative handle exposing scroll helpers.
141
+ *
142
+ * Kept separate from the DOM `ref` (which points to the scroll
143
+ * container element) so methods like `scrollToBottom` don't
144
+ * overload the DOM ref.
145
+ *
146
+ * @example
147
+ * ```tsx
148
+ * const apiRef = useRef<ChatMessageListScrollApi>(null);
149
+ * <ChatMessageList scrollApiRef={apiRef} messages={messages} />
150
+ * apiRef.current?.scrollToBottom('smooth');
151
+ * ```
152
+ */
153
+ scrollApiRef?: React.Ref<ChatMessageListScrollApi>;
129
154
  }
130
155
  type ChatMessageListProps = Prettify<ChatMessageListBaseProps>;
131
156
  interface ChatMessageBaseProps extends BaseComponent {
@@ -146,6 +171,17 @@ interface ChatMessageBaseProps extends BaseComponent {
146
171
  * Use for custom markdown rendering, LaTeX, etc.
147
172
  */
148
173
  renderContent?: (content: string) => React.ReactNode;
174
+ /**
175
+ * Maximum width of the message bubble.
176
+ *
177
+ * Overrides the panel-level `messageMaxWidth` and the library default
178
+ * of `85%`. Numbers are interpreted as pixels; strings are used
179
+ * verbatim (`"500px"`, `"60ch"`, `"70%"`).
180
+ *
181
+ * Equivalent to setting `--etui-chat-message-max-width` inline on the
182
+ * message root.
183
+ */
184
+ maxWidth?: number | string;
149
185
  }
150
186
  type ChatMessageProps = Prettify<ChatMessageBaseProps>;
151
187
  interface ChatBubbleBaseProps extends BaseComponent {
@@ -366,6 +402,15 @@ interface UseChatInputOptions {
366
402
  * @default 6
367
403
  */
368
404
  maxLines?: number;
405
+ /**
406
+ * Number of currently queued attachments.
407
+ *
408
+ * Used only to allow attachments-only submit when the textarea is empty.
409
+ * When greater than 0, pressing the submit key will fire `onSubmit('')`
410
+ * even if the input value is empty or whitespace-only.
411
+ * @default 0
412
+ */
413
+ attachmentsCount?: number;
369
414
  }
370
415
  interface UseChatInputReturn {
371
416
  /** Current input value */
@@ -398,12 +443,48 @@ interface UseChatScrollOptions {
398
443
  interface UseChatScrollReturn {
399
444
  /** Ref to attach to the scrollable container element */
400
445
  scrollContainerRef: React.RefObject<HTMLDivElement | null>;
446
+ /**
447
+ * Ref for the element whose height changes trigger auto-scroll.
448
+ *
449
+ * Attach this to the inner content element (the one that grows when
450
+ * messages stream in). The hook observes its resize events so the list
451
+ * stays pinned to the bottom during streaming, even when the
452
+ * `messages` array length does not change.
453
+ */
454
+ scrollContentRef: React.RefObject<HTMLDivElement | null>;
401
455
  /** Whether the user is currently scrolled to the bottom */
402
456
  isAtBottom: boolean;
403
457
  /** Whether there are new messages below the current scroll position */
404
458
  hasNewMessages: boolean;
405
459
  /** Programmatically scroll to the bottom */
406
460
  scrollToBottom: (behavior?: ScrollBehavior) => void;
461
+ /**
462
+ * Scroll the container to an arbitrary position.
463
+ * Thin wrapper over `Element.scrollTo`.
464
+ */
465
+ scrollTo: (options: ScrollToOptions) => void;
466
+ /**
467
+ * Scroll a specific element into view inside the container.
468
+ * Thin wrapper over `Element.scrollIntoView`.
469
+ */
470
+ scrollToElement: (el: HTMLElement, options?: ScrollIntoViewOptions) => void;
471
+ }
472
+ /**
473
+ * Imperative scroll API exposed by `ChatMessageList` via `scrollApiRef`.
474
+ *
475
+ * Use this when you need to drive scroll position from outside — e.g.,
476
+ * "scroll to message X" triggered by a search panel, or a "jump to top"
477
+ * action button.
478
+ */
479
+ interface ChatMessageListScrollApi {
480
+ /** Scroll to the bottom of the message list. */
481
+ scrollToBottom: (behavior?: ScrollBehavior) => void;
482
+ /** Scroll the container to an arbitrary position. */
483
+ scrollTo: (options: ScrollToOptions) => void;
484
+ /** Scroll a specific element into view inside the container. */
485
+ scrollToElement: (el: HTMLElement, options?: ScrollIntoViewOptions) => void;
486
+ /** Whether the user is currently scrolled to the bottom. */
487
+ isAtBottom: () => boolean;
407
488
  }
408
489
 
409
- export type { ChatActionBarProps, ChatAttachmentChipProps, ChatAttachmentData, ChatBubbleProps, ChatCodeBlockProps, ChatContextChipProps, ChatEmptyStateProps, ChatInputProps, ChatInputToolbarProps, ChatMessageData, ChatMessageListProps, ChatMessageProps, ChatMessageRole, ChatMessageStatus, ChatPanelDensity, ChatPanelProps, ChatToolCallData, ChatToolCallProps, ChatToolCallStatus, ChatTypingIndicatorProps, UseChatInputOptions, UseChatInputReturn, UseChatMessagesOptions, UseChatMessagesReturn, UseChatScrollOptions, UseChatScrollReturn };
490
+ export type { ChatActionBarProps, ChatAttachmentChipProps, ChatAttachmentData, ChatBubbleProps, ChatCodeBlockProps, ChatContextChipProps, ChatEmptyStateProps, ChatInputProps, ChatInputToolbarProps, ChatMessageData, ChatMessageListProps, ChatMessageListScrollApi, ChatMessageProps, ChatMessageRole, ChatMessageStatus, ChatPanelDensity, ChatPanelProps, ChatToolCallData, ChatToolCallProps, ChatToolCallStatus, ChatTypingIndicatorProps, UseChatInputOptions, UseChatInputReturn, UseChatMessagesOptions, UseChatMessagesReturn, UseChatScrollOptions, UseChatScrollReturn };