entangle-ui 0.6.3 → 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 (108) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/esm/assets/src/components/editor/ChatPanel/{ChatPanel.css.ts.vanilla-DPIGnZ4A.css → ChatPanel.css.ts.vanilla-BI5569ZO.css} +81 -1
  3. package/dist/esm/assets/src/components/feedback/EmptyState/EmptyState.css.ts.vanilla-B_TWsTOW.css +58 -0
  4. package/dist/esm/assets/src/components/feedback/Spinner/Spinner.css.ts.vanilla-DEUewqdK.css +80 -0
  5. package/dist/esm/assets/src/components/layout/Divider/Divider.css.ts.vanilla-CPvd_RW9.css +72 -0
  6. package/dist/esm/assets/src/components/layout/ListItem/ListItem.css.ts.vanilla-BwAZrX2f.css +68 -0
  7. package/dist/esm/assets/src/components/layout/PageHeader/PageHeader.css.ts.vanilla-DdbyyWAN.css +70 -0
  8. package/dist/esm/assets/src/components/layout/SplitPane/{SplitPane.css.ts.vanilla-BFxdvwyI.css → SplitPane.css.ts.vanilla-BGFZ7zDa.css} +5 -0
  9. package/dist/esm/assets/src/components/primitives/Badge/Badge.css.ts.vanilla-DxCUcxYW.css +95 -0
  10. package/dist/esm/assets/src/components/primitives/Code/Code.css.ts.vanilla-mayBqLDM.css +19 -0
  11. package/dist/esm/assets/src/components/primitives/TextArea/TextArea.css.ts.vanilla-DTOMjGkp.css +85 -0
  12. package/dist/esm/assets/src/theme/{darkTheme.css.ts.vanilla-DCe89yCJ.css → darkTheme.css.ts.vanilla-ab1WD4dr.css} +3 -0
  13. package/dist/esm/assets/src/theme/globalScrollbars.css.ts.vanilla-BAJwnUEJ.css +21 -0
  14. package/dist/esm/assets/src/utils/animations.css.ts.vanilla-DOVlpljP.css +58 -0
  15. package/dist/esm/components/editor/ChatPanel/ChatInput.js +18 -7
  16. package/dist/esm/components/editor/ChatPanel/ChatInput.js.map +1 -1
  17. package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js +268 -0
  18. package/dist/esm/components/editor/ChatPanel/ChatMarkdownRenderer.js.map +1 -0
  19. package/dist/esm/components/editor/ChatPanel/ChatMessage.js +15 -3
  20. package/dist/esm/components/editor/ChatPanel/ChatMessage.js.map +1 -1
  21. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js +19 -5
  22. package/dist/esm/components/editor/ChatPanel/ChatMessageList.js.map +1 -1
  23. package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js +14 -2
  24. package/dist/esm/components/editor/ChatPanel/ChatPanel.css.js.map +1 -1
  25. package/dist/esm/components/editor/ChatPanel/ChatPanel.js +15 -3
  26. package/dist/esm/components/editor/ChatPanel/ChatPanel.js.map +1 -1
  27. package/dist/esm/components/editor/ChatPanel/useChatInput.js +3 -3
  28. package/dist/esm/components/editor/ChatPanel/useChatInput.js.map +1 -1
  29. package/dist/esm/components/editor/ChatPanel/useChatScroll.js +59 -2
  30. package/dist/esm/components/editor/ChatPanel/useChatScroll.js.map +1 -1
  31. package/dist/esm/components/feedback/EmptyState/EmptyState.css.js +13 -0
  32. package/dist/esm/components/feedback/EmptyState/EmptyState.css.js.map +1 -0
  33. package/dist/esm/components/feedback/EmptyState/EmptyState.js +43 -0
  34. package/dist/esm/components/feedback/EmptyState/EmptyState.js.map +1 -0
  35. package/dist/esm/components/feedback/Spinner/Spinner.css.js +16 -0
  36. package/dist/esm/components/feedback/Spinner/Spinner.css.js.map +1 -0
  37. package/dist/esm/components/feedback/Spinner/Spinner.js +50 -0
  38. package/dist/esm/components/feedback/Spinner/Spinner.js.map +1 -0
  39. package/dist/esm/components/layout/Divider/Divider.css.js +9 -0
  40. package/dist/esm/components/layout/Divider/Divider.css.js.map +1 -0
  41. package/dist/esm/components/layout/Divider/Divider.js +51 -0
  42. package/dist/esm/components/layout/Divider/Divider.js.map +1 -0
  43. package/dist/esm/components/layout/ListItem/ListItem.css.js +10 -0
  44. package/dist/esm/components/layout/ListItem/ListItem.css.js.map +1 -0
  45. package/dist/esm/components/layout/ListItem/ListItem.js +45 -0
  46. package/dist/esm/components/layout/ListItem/ListItem.js.map +1 -0
  47. package/dist/esm/components/layout/PageHeader/PageHeader.css.js +13 -0
  48. package/dist/esm/components/layout/PageHeader/PageHeader.css.js.map +1 -0
  49. package/dist/esm/components/layout/PageHeader/PageHeader.js +29 -0
  50. package/dist/esm/components/layout/PageHeader/PageHeader.js.map +1 -0
  51. package/dist/esm/components/layout/SplitPane/SplitPane.css.js +1 -1
  52. package/dist/esm/components/navigation/Tabs/TabPanel.js +6 -3
  53. package/dist/esm/components/navigation/Tabs/TabPanel.js.map +1 -1
  54. package/dist/esm/components/navigation/Tabs/Tabs.js +3 -1
  55. package/dist/esm/components/navigation/Tabs/Tabs.js.map +1 -1
  56. package/dist/esm/components/primitives/Badge/Badge.css.js +12 -0
  57. package/dist/esm/components/primitives/Badge/Badge.css.js.map +1 -0
  58. package/dist/esm/components/primitives/Badge/Badge.js +67 -0
  59. package/dist/esm/components/primitives/Badge/Badge.js.map +1 -0
  60. package/dist/esm/components/primitives/Code/Code.css.js +7 -0
  61. package/dist/esm/components/primitives/Code/Code.css.js.map +1 -0
  62. package/dist/esm/components/primitives/Code/Code.js +24 -0
  63. package/dist/esm/components/primitives/Code/Code.js.map +1 -0
  64. package/dist/esm/components/primitives/TextArea/TextArea.css.js +10 -0
  65. package/dist/esm/components/primitives/TextArea/TextArea.css.js.map +1 -0
  66. package/dist/esm/components/primitives/TextArea/TextArea.js +97 -0
  67. package/dist/esm/components/primitives/TextArea/TextArea.js.map +1 -0
  68. package/dist/esm/index.js +11 -0
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/theme/ThemeProvider.js +17 -3
  71. package/dist/esm/theme/ThemeProvider.js.map +1 -1
  72. package/dist/esm/theme/contract.css.js +1 -1
  73. package/dist/esm/theme/darkTheme.css.js +2 -2
  74. package/dist/esm/theme/globalScrollbars.css.js +6 -0
  75. package/dist/esm/theme/globalScrollbars.css.js.map +1 -0
  76. package/dist/esm/utils/animations.css.js +13 -0
  77. package/dist/esm/utils/animations.css.js.map +1 -0
  78. package/dist/types/components/editor/ChatPanel/ChatMarkdownRenderer.d.ts +323 -0
  79. package/dist/types/components/editor/ChatPanel/ChatMarkdownRenderer.types.d.ts +46 -0
  80. package/dist/types/components/editor/ChatPanel/ChatMessage.d.ts +1 -0
  81. package/dist/types/components/editor/ChatPanel/ChatMessageList.d.ts +2 -1
  82. package/dist/types/components/editor/ChatPanel/ChatPanel.d.ts +1 -0
  83. package/dist/types/components/editor/ChatPanel/ChatPanel.types.d.ts +82 -1
  84. package/dist/types/components/feedback/EmptyState/EmptyState.d.ts +313 -0
  85. package/dist/types/components/feedback/EmptyState/EmptyState.types.d.ts +31 -0
  86. package/dist/types/components/feedback/Spinner/Spinner.d.ts +306 -0
  87. package/dist/types/components/feedback/Spinner/Spinner.types.d.ts +41 -0
  88. package/dist/types/components/layout/Divider/Divider.d.ts +307 -0
  89. package/dist/types/components/layout/Divider/Divider.types.d.ts +50 -0
  90. package/dist/types/components/layout/ListItem/ListItem.d.ts +312 -0
  91. package/dist/types/components/layout/ListItem/ListItem.types.d.ts +35 -0
  92. package/dist/types/components/layout/PageHeader/PageHeader.d.ts +311 -0
  93. package/dist/types/components/layout/PageHeader/PageHeader.types.d.ts +30 -0
  94. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +10 -0
  95. package/dist/types/components/primitives/Badge/Badge.d.ts +310 -0
  96. package/dist/types/components/primitives/Badge/Badge.types.d.ts +67 -0
  97. package/dist/types/components/primitives/Button/Button.d.ts +1 -1
  98. package/dist/types/components/primitives/Code/Code.d.ts +301 -0
  99. package/dist/types/components/primitives/Code/Code.types.d.ts +17 -0
  100. package/dist/types/components/primitives/IconButton/IconButton.d.ts +1 -1
  101. package/dist/types/components/primitives/TextArea/TextArea.d.ts +26 -0
  102. package/dist/types/components/primitives/TextArea/TextArea.types.d.ts +76 -0
  103. package/dist/types/index.d.ts +20 -1
  104. package/dist/types/theme/ThemeProvider.d.ts +14 -2
  105. package/dist/types/theme/contract.css.d.ts +3 -0
  106. package/dist/types/theme/darkTheme.css.d.ts +3 -0
  107. package/dist/types/utils/animations.css.d.ts +18 -0
  108. package/package.json +1 -1
@@ -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 };