@liveblocks/react-ui 2.25.0-aiprivatebeta8 → 3.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 (181) hide show
  1. package/_private/package.json +2 -2
  2. package/dist/_private/index.cjs +14 -12
  3. package/dist/_private/index.cjs.map +1 -1
  4. package/dist/_private/index.d.cts +146 -113
  5. package/dist/_private/index.d.ts +146 -113
  6. package/dist/_private/index.js +10 -5
  7. package/dist/_private/index.js.map +1 -1
  8. package/dist/components/AiChat.cjs +85 -121
  9. package/dist/components/AiChat.cjs.map +1 -1
  10. package/dist/components/AiChat.js +87 -123
  11. package/dist/components/AiChat.js.map +1 -1
  12. package/dist/components/AiTool.cjs +188 -0
  13. package/dist/components/AiTool.cjs.map +1 -0
  14. package/dist/components/AiTool.js +186 -0
  15. package/dist/components/AiTool.js.map +1 -0
  16. package/dist/components/Comment.cjs +259 -238
  17. package/dist/components/Comment.cjs.map +1 -1
  18. package/dist/components/Comment.js +261 -240
  19. package/dist/components/Comment.js.map +1 -1
  20. package/dist/components/Composer.cjs +42 -30
  21. package/dist/components/Composer.cjs.map +1 -1
  22. package/dist/components/Composer.js +44 -32
  23. package/dist/components/Composer.js.map +1 -1
  24. package/dist/components/InboxNotificationList.cjs +11 -3
  25. package/dist/components/InboxNotificationList.cjs.map +1 -1
  26. package/dist/components/InboxNotificationList.js +12 -4
  27. package/dist/components/InboxNotificationList.js.map +1 -1
  28. package/dist/components/Thread.cjs +7 -1
  29. package/dist/components/Thread.cjs.map +1 -1
  30. package/dist/components/Thread.js +8 -2
  31. package/dist/components/Thread.js.map +1 -1
  32. package/dist/components/internal/AiChatAssistantMessage.cjs +75 -199
  33. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  34. package/dist/components/internal/AiChatAssistantMessage.js +77 -201
  35. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  36. package/dist/components/internal/AiChatComposer.cjs +1 -1
  37. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  38. package/dist/components/internal/AiChatComposer.js +1 -1
  39. package/dist/components/internal/AiChatComposer.js.map +1 -1
  40. package/dist/components/internal/AiChatUserMessage.cjs +17 -10
  41. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  42. package/dist/components/internal/AiChatUserMessage.js +17 -10
  43. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  44. package/dist/components/internal/Button.cjs.map +1 -1
  45. package/dist/components/internal/Button.js.map +1 -1
  46. package/dist/components/internal/CodeBlock.cjs +75 -0
  47. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  48. package/dist/components/internal/CodeBlock.js +73 -0
  49. package/dist/components/internal/CodeBlock.js.map +1 -0
  50. package/dist/components/internal/Dropdown.cjs +1 -1
  51. package/dist/components/internal/Dropdown.cjs.map +1 -1
  52. package/dist/components/internal/Dropdown.js +2 -2
  53. package/dist/components/internal/Dropdown.js.map +1 -1
  54. package/dist/components/internal/Emoji.cjs +12 -4
  55. package/dist/components/internal/Emoji.cjs.map +1 -1
  56. package/dist/components/internal/Emoji.js +12 -4
  57. package/dist/components/internal/Emoji.js.map +1 -1
  58. package/dist/components/internal/EmojiPicker.cjs +1 -1
  59. package/dist/components/internal/EmojiPicker.cjs.map +1 -1
  60. package/dist/components/internal/EmojiPicker.js +2 -2
  61. package/dist/components/internal/EmojiPicker.js.map +1 -1
  62. package/dist/components/internal/InboxNotificationThread.cjs +5 -2
  63. package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
  64. package/dist/components/internal/InboxNotificationThread.js +6 -3
  65. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  66. package/dist/components/internal/Prose.cjs +37 -0
  67. package/dist/components/internal/Prose.cjs.map +1 -0
  68. package/dist/components/internal/Prose.js +35 -0
  69. package/dist/components/internal/Prose.js.map +1 -0
  70. package/dist/components/internal/Tooltip.cjs +1 -1
  71. package/dist/components/internal/Tooltip.cjs.map +1 -1
  72. package/dist/components/internal/Tooltip.js +2 -2
  73. package/dist/components/internal/Tooltip.js.map +1 -1
  74. package/dist/config.cjs +9 -9
  75. package/dist/config.cjs.map +1 -1
  76. package/dist/config.js +8 -8
  77. package/dist/config.js.map +1 -1
  78. package/dist/icons/CrossCircleFill.cjs +25 -0
  79. package/dist/icons/CrossCircleFill.cjs.map +1 -0
  80. package/dist/icons/CrossCircleFill.js +23 -0
  81. package/dist/icons/CrossCircleFill.js.map +1 -0
  82. package/dist/icons/MinusCircle.cjs +23 -0
  83. package/dist/icons/MinusCircle.cjs.map +1 -0
  84. package/dist/icons/MinusCircle.js +21 -0
  85. package/dist/icons/MinusCircle.js.map +1 -0
  86. package/dist/icons/index.cjs +4 -0
  87. package/dist/icons/index.cjs.map +1 -1
  88. package/dist/icons/index.js +2 -0
  89. package/dist/icons/index.js.map +1 -1
  90. package/dist/index.cjs +3 -3
  91. package/dist/index.cjs.map +1 -1
  92. package/dist/index.d.cts +270 -22
  93. package/dist/index.d.ts +270 -22
  94. package/dist/index.js +2 -2
  95. package/dist/index.js.map +1 -1
  96. package/dist/overrides.cjs +6 -4
  97. package/dist/overrides.cjs.map +1 -1
  98. package/dist/overrides.js +6 -4
  99. package/dist/overrides.js.map +1 -1
  100. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  101. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  102. package/dist/primitives/AiMessage/contexts.js +15 -0
  103. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  104. package/dist/primitives/AiMessage/index.cjs +77 -0
  105. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  106. package/dist/primitives/AiMessage/index.js +75 -0
  107. package/dist/primitives/AiMessage/index.js.map +1 -0
  108. package/dist/primitives/AiMessage/tool-invocation.cjs +70 -0
  109. package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -0
  110. package/dist/primitives/AiMessage/tool-invocation.js +68 -0
  111. package/dist/primitives/AiMessage/tool-invocation.js.map +1 -0
  112. package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
  113. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  114. package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
  115. package/dist/primitives/Collapsible/index.js.map +1 -0
  116. package/dist/primitives/Comment/index.cjs +5 -4
  117. package/dist/primitives/Comment/index.cjs.map +1 -1
  118. package/dist/primitives/Comment/index.js +5 -4
  119. package/dist/primitives/Comment/index.js.map +1 -1
  120. package/dist/primitives/Composer/index.cjs +49 -41
  121. package/dist/primitives/Composer/index.cjs.map +1 -1
  122. package/dist/primitives/Composer/index.js +50 -42
  123. package/dist/primitives/Composer/index.js.map +1 -1
  124. package/dist/primitives/Composer/slate/plugins/mentions.cjs +4 -4
  125. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
  126. package/dist/primitives/Composer/slate/plugins/mentions.js +4 -4
  127. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
  128. package/dist/primitives/Composer/utils.cjs +3 -6
  129. package/dist/primitives/Composer/utils.cjs.map +1 -1
  130. package/dist/primitives/Composer/utils.js +3 -6
  131. package/dist/primitives/Composer/utils.js.map +1 -1
  132. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +105 -65
  133. package/dist/primitives/Markdown.cjs.map +1 -0
  134. package/dist/primitives/{internal/Markdown.js → Markdown.js} +106 -65
  135. package/dist/primitives/Markdown.js.map +1 -0
  136. package/dist/primitives/index.cjs +4 -6
  137. package/dist/primitives/index.cjs.map +1 -1
  138. package/dist/primitives/index.d.cts +20 -93
  139. package/dist/primitives/index.d.ts +20 -93
  140. package/dist/primitives/index.js +4 -6
  141. package/dist/primitives/index.js.map +1 -1
  142. package/dist/utils/ErrorBoundary.cjs +48 -0
  143. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  144. package/dist/utils/ErrorBoundary.js +45 -0
  145. package/dist/utils/ErrorBoundary.js.map +1 -0
  146. package/dist/utils/use-controllable-state.cjs +25 -2
  147. package/dist/utils/use-controllable-state.cjs.map +1 -1
  148. package/dist/utils/use-controllable-state.js +25 -3
  149. package/dist/utils/use-controllable-state.js.map +1 -1
  150. package/dist/utils/use-visible.cjs +65 -45
  151. package/dist/utils/use-visible.cjs.map +1 -1
  152. package/dist/utils/use-visible.js +66 -46
  153. package/dist/utils/use-visible.js.map +1 -1
  154. package/dist/version.cjs +1 -1
  155. package/dist/version.cjs.map +1 -1
  156. package/dist/version.js +1 -1
  157. package/dist/version.js.map +1 -1
  158. package/package.json +16 -5
  159. package/primitives/package.json +2 -2
  160. package/src/styles/constants.css +1 -1
  161. package/src/styles/dark/index.css +7 -3
  162. package/src/styles/index.css +572 -252
  163. package/src/styles/utils.css +1 -1
  164. package/styles/dark/attributes.css +1 -1
  165. package/styles/dark/attributes.css.map +1 -1
  166. package/styles/dark/media-query.css +1 -1
  167. package/styles/dark/media-query.css.map +1 -1
  168. package/styles.css +1 -1
  169. package/styles.css.map +1 -1
  170. package/dist/components/AiToolDebugger.cjs +0 -74
  171. package/dist/components/AiToolDebugger.cjs.map +0 -1
  172. package/dist/components/AiToolDebugger.js +0 -72
  173. package/dist/components/AiToolDebugger.js.map +0 -1
  174. package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
  175. package/dist/primitives/internal/Collapsible/index.js.map +0 -1
  176. package/dist/primitives/internal/Emoji.cjs +0 -32
  177. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  178. package/dist/primitives/internal/Emoji.js +0 -30
  179. package/dist/primitives/internal/Emoji.js.map +0 -1
  180. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  181. package/dist/primitives/internal/Markdown.js.map +0 -1
@@ -1,15 +1,18 @@
1
1
  import * as react from 'react';
2
- import { ComponentType, ComponentPropsWithoutRef, ElementType, ReactNode, ComponentProps, FormEvent, Ref, RefCallback } from 'react';
3
- import { UiAssistantMessage, CopilotId, UiUserMessage } from '@liveblocks/core';
2
+ import { ComponentProps, ReactNode, ElementType, ComponentPropsWithoutRef, Ref, RefCallback, FormEvent, ComponentType } from 'react';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
5
  export { TooltipProvider } from '@radix-ui/react-tooltip';
6
- import * as react_jsx_runtime from 'react/jsx-runtime';
6
+ import { AiTextPart, AiReasoningPart, AiChatMessage } from '@liveblocks/core';
7
7
 
8
- interface GlobalComponents {
9
- Anchor: ComponentType<ComponentPropsWithoutRef<"a">> | "a";
8
+ interface ButtonProps extends ComponentProps<"button"> {
9
+ variant?: "default" | "toolbar" | "outline" | "primary" | "secondary" | "destructive";
10
+ size?: "default" | "large";
11
+ disableable?: boolean;
12
+ icon?: ReactNode;
10
13
  }
11
- type Components = GlobalComponents;
12
- declare function useComponents(components?: Partial<Components>): Components;
14
+ declare const Button: react.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
15
+ declare const SelectButton: react.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
13
16
 
14
17
  type SlotProp = {
15
18
  /**
@@ -19,103 +22,6 @@ type SlotProp = {
19
22
  };
20
23
  type ComponentPropsWithSlot<TElement extends ElementType<any>> = ComponentPropsWithoutRef<TElement> & SlotProp;
21
24
 
22
- interface GlobalOverrides {
23
- USER_SELF: string;
24
- USER_UNKNOWN: string;
25
- LIST_REMAINING: (count: number) => string;
26
- LIST_REMAINING_USERS: (count: number) => string;
27
- LIST_REMAINING_COMMENTS: (count: number) => string;
28
- EMOJI_PICKER_SEARCH_PLACEHOLDER: string;
29
- EMOJI_PICKER_EMPTY: ReactNode;
30
- EMOJI_PICKER_ERROR: (error: Error) => ReactNode;
31
- EMOJI_PICKER_CHANGE_SKIN_TONE: string;
32
- ATTACHMENT_TOO_LARGE: (maxSize?: string) => string;
33
- ATTACHMENT_ERROR: (error: Error) => string;
34
- }
35
- interface AiChatComposerOverrides {
36
- AI_CHAT_COMPOSER_PLACEHOLDER: string;
37
- AI_CHAT_COMPOSER_SEND: string;
38
- AI_CHAT_COMPOSER_ABORT: string;
39
- }
40
- interface AiChatMessageOverrides {
41
- AI_CHAT_MESSAGE_DELETED: string;
42
- AI_CHAT_MESSAGE_THINKING: string;
43
- }
44
-
45
- interface AiChatAssistantMessageProps extends ComponentProps<"div"> {
46
- /**
47
- * The message to display.
48
- */
49
- message: UiAssistantMessage;
50
- /**
51
- * Override the component's strings.
52
- */
53
- overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;
54
- /**
55
- * Override the component's components.
56
- */
57
- components?: Partial<GlobalComponents>;
58
- }
59
- declare const AiChatAssistantMessage: react.MemoExoticComponent<react.ForwardRefExoticComponent<Omit<AiChatAssistantMessageProps, "ref"> & react.RefAttributes<HTMLDivElement>>>;
60
-
61
- interface AiChatComposerProps extends ComponentProps<"form"> {
62
- /**
63
- * The composer's initial value.
64
- */
65
- defaultValue?: string;
66
- /**
67
- * The event handler called when a chat message is submitted.
68
- */
69
- onComposerSubmit?: (message: {
70
- /**
71
- * The submitted message text.
72
- */
73
- text: string;
74
- }, event: FormEvent<HTMLFormElement>) => void;
75
- /**
76
- * Whether the composer is disabled.
77
- */
78
- disabled?: boolean;
79
- /**
80
- * Whether to focus the editor on mount.
81
- */
82
- autoFocus?: boolean;
83
- /**
84
- * Override the component's strings.
85
- */
86
- overrides?: Partial<GlobalOverrides & AiChatComposerOverrides>;
87
- /**
88
- * The id of the chat the composer belongs to.
89
- */
90
- chatId: string;
91
- /**
92
- * The id of the copilot to use to send the message.
93
- */
94
- copilotId?: CopilotId;
95
- }
96
- declare const AiChatComposer: react.ForwardRefExoticComponent<Omit<AiChatComposerProps, "ref"> & react.RefAttributes<HTMLFormElement>>;
97
-
98
- interface AiChatUserMessageProps extends ComponentProps<"div"> {
99
- /**
100
- * The message to display.
101
- */
102
- message: UiUserMessage;
103
- /**
104
- * Override the component's strings.
105
- */
106
- overrides?: Partial<GlobalOverrides>;
107
- }
108
- declare const AiChatUserMessage: react.MemoExoticComponent<react.ForwardRefExoticComponent<Omit<AiChatUserMessageProps, "ref"> & react.RefAttributes<HTMLDivElement>>>;
109
-
110
- interface ButtonProps extends ComponentProps<"button"> {
111
- variant?: "default" | "toolbar" | "outline" | "primary" | "secondary";
112
- size?: "default" | "large";
113
- disableable?: boolean;
114
- icon?: ReactNode;
115
- }
116
- declare const Button: react.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
117
- declare const SelectButton: react.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
118
-
119
25
  interface ListProps extends ComponentPropsWithSlot<"span"> {
120
26
  values: ReactNode[];
121
27
  formatRemaining?: (amount: number) => string;
@@ -124,6 +30,15 @@ interface ListProps extends ComponentPropsWithSlot<"span"> {
124
30
  }
125
31
  declare const List: react.ForwardRefExoticComponent<ListProps & react.RefAttributes<HTMLSpanElement>>;
126
32
 
33
+ interface ProseProps extends ComponentProps<"div"> {
34
+ content: string;
35
+ }
36
+ /**
37
+ * This component renders Markdown content with `lb-prose`
38
+ * styles and custom components (code blocks, etc)
39
+ */
40
+ declare function Prose({ content, className, ...props }: ProseProps): react_jsx_runtime.JSX.Element;
41
+
127
42
  interface TooltipProps extends Pick<TooltipPrimitive.TooltipTriggerProps, "children">, Omit<TooltipPrimitive.TooltipContentProps, "content"> {
128
43
  content: ReactNode;
129
44
  multiline?: boolean;
@@ -186,6 +101,8 @@ declare function CopyIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.E
186
101
 
187
102
  declare function CrossIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
188
103
 
104
+ declare function CrossCircleFillIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
105
+
189
106
  declare function DeleteIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
190
107
 
191
108
  declare function EditIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
@@ -212,6 +129,8 @@ declare function ListUnorderedIcon(props: ComponentProps<"svg">): react_jsx_runt
212
129
 
213
130
  declare function MentionIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
214
131
 
132
+ declare function MinusCircleIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
133
+
215
134
  declare function QuestionMarkIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
216
135
 
217
136
  declare function RedoIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
@@ -246,6 +165,18 @@ declare function UndoIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.E
246
165
 
247
166
  declare function WarningIcon(props: ComponentProps<"svg">): react_jsx_runtime.JSX.Element;
248
167
 
168
+ declare function capitalize(string: string): string;
169
+
170
+ /**
171
+ * "Freezes" a given value, so that it will return the same value/instance on
172
+ * each subsequent render. This can be used to freeze "initial" values for
173
+ * custom hooks, much like how `useState(initialState)` or
174
+ * `useRef(initialValue)` works.
175
+ */
176
+ declare function useInitial<T>(value: T | (() => T)): T;
177
+
178
+ declare function useRefs<T>(...refs: Ref<T>[]): RefCallback<T>;
179
+
249
180
  interface AiChatComposerFormProps extends ComponentPropsWithSlot<"form"> {
250
181
  /**
251
182
  * The event handler called when a chat message is submitted.
@@ -261,7 +192,7 @@ interface AiChatComposerFormProps extends ComponentPropsWithSlot<"form"> {
261
192
  */
262
193
  disabled?: boolean;
263
194
  }
264
- interface AiChatComposerEditorProps extends Omit<ComponentPropsWithoutRef<"div">, "defaultValue"> {
195
+ interface AiChatComposerEditorProps extends Omit<ComponentPropsWithoutRef<"div">, "defaultValue" | "children"> {
265
196
  /**
266
197
  * The editor's initial value.
267
198
  */
@@ -306,16 +237,118 @@ declare const AiChatComposerEditor: react.ForwardRefExoticComponent<AiChatCompos
306
237
  */
307
238
  declare const AiChatComposerSubmit: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & react.RefAttributes<HTMLButtonElement>>;
308
239
 
309
- declare function capitalize(string: string): string;
240
+ declare const index$2_AiChatComposerEditor: typeof AiChatComposerEditor;
241
+ declare const index$2_AiChatComposerForm: typeof AiChatComposerForm;
242
+ declare const index$2_AiChatComposerSubmit: typeof AiChatComposerSubmit;
243
+ declare namespace index$2 {
244
+ export {
245
+ index$2_AiChatComposerEditor as AiChatComposerEditor,
246
+ index$2_AiChatComposerForm as AiChatComposerForm,
247
+ index$2_AiChatComposerSubmit as AiChatComposerSubmit,
248
+ AiChatComposerEditor as Editor,
249
+ AiChatComposerForm as Form,
250
+ AiChatComposerSubmit as Submit,
251
+ };
252
+ }
253
+
254
+ type AiMessageContentTextPartProps = {
255
+ part: AiTextPart;
256
+ };
257
+ type AiMessageContentReasoningPartProps = {
258
+ part: AiReasoningPart;
259
+ };
260
+ interface AiMessageContentComponents {
261
+ /**
262
+ * The component used to display text parts.
263
+ */
264
+ TextPart: ComponentType<AiMessageContentTextPartProps>;
265
+ /**
266
+ * The component used to display reasoning parts.
267
+ */
268
+ ReasoningPart: ComponentType<AiMessageContentReasoningPartProps>;
269
+ }
270
+ interface AiMessageContentProps extends ComponentPropsWithSlot<"div"> {
271
+ /**
272
+ * The message contents to display.
273
+ */
274
+ message: AiChatMessage;
275
+ /**
276
+ * Optional overrides for the default components to render each part within
277
+ * the message content.
278
+ */
279
+ components?: Partial<AiMessageContentComponents>;
280
+ }
310
281
 
311
282
  /**
312
- * "Freezes" a given value, so that it will return the same value/instance on
313
- * each subsequent render. This can be used to freeze "initial" values for
314
- * custom hooks, much like how `useState(initialState)` or
315
- * `useRef(initialValue)` works.
283
+ * --------------------------------------------------------------------------
284
+ * @private The API for this component is not yet stable.
285
+ * --------------------------------------------------------------------------
286
+ *
287
+ * Primitive to help display an user or assistant message’s content, which is
288
+ * an array of parts.
289
+ *
290
+ * @example
291
+ * <AiMessage.Content message={message} components={{ TextPart }} />
316
292
  */
317
- declare function useInitial<T>(value: T | (() => T)): T;
293
+ declare const AiMessageContent: react.ForwardRefExoticComponent<AiMessageContentProps & react.RefAttributes<HTMLDivElement>>;
318
294
 
319
- declare function useRefs<T>(...refs: Ref<T>[]): RefCallback<T>;
295
+ declare namespace index$1 {
296
+ export {
297
+ AiMessageContent as Content,
298
+ };
299
+ }
300
+
301
+ interface RootProps extends ComponentPropsWithSlot<"div"> {
302
+ defaultOpen?: boolean;
303
+ open?: boolean;
304
+ onOpenChange?: (open: boolean) => void;
305
+ disabled?: boolean;
306
+ }
307
+
308
+ declare const CollapsibleRoot: react.ForwardRefExoticComponent<RootProps & react.RefAttributes<HTMLDivElement>>;
309
+ declare const CollapsibleTrigger: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & SlotProp & react.RefAttributes<HTMLButtonElement>>;
310
+ declare const CollapsibleContent: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & SlotProp & react.RefAttributes<HTMLDivElement>>;
311
+
312
+ declare namespace index {
313
+ export {
314
+ CollapsibleContent as Content,
315
+ CollapsibleRoot as Root,
316
+ CollapsibleTrigger as Trigger,
317
+ };
318
+ }
319
+
320
+ type MarkdownComponents = {
321
+ CodeBlock: ComponentType<MarkdownComponentsCodeBlockProps>;
322
+ Link: ComponentType<MarkdownComponentsLinkProps>;
323
+ Heading: ComponentType<MarkdownComponentsHeadingProps>;
324
+ Image: ComponentType<MarkdownComponentsImageProps>;
325
+ Blockquote: ComponentType<MarkdownComponentsBlockquoteProps>;
326
+ };
327
+ interface MarkdownComponentsBlockquoteProps {
328
+ children: ReactNode;
329
+ }
330
+ interface MarkdownComponentsImageProps {
331
+ src: string;
332
+ alt: string;
333
+ title?: string;
334
+ }
335
+ interface MarkdownComponentsHeadingProps {
336
+ level: 1 | 2 | 3 | 4 | 5 | 6;
337
+ children: ReactNode;
338
+ }
339
+ interface MarkdownComponentsLinkProps {
340
+ href: string;
341
+ title?: string;
342
+ children: ReactNode;
343
+ }
344
+ interface MarkdownComponentsCodeBlockProps {
345
+ code: string;
346
+ language?: string;
347
+ }
348
+ interface MarkdownProps extends ComponentPropsWithSlot<"div"> {
349
+ content: string;
350
+ components?: Partial<MarkdownComponents>;
351
+ }
352
+ declare const Markdown: react.ForwardRefExoticComponent<MarkdownProps & react.RefAttributes<HTMLDivElement>>;
320
353
 
321
- export { AiChatAssistantMessage, AiChatAssistantMessageProps, AiChatComposer, AiChatComposerEditor, AiChatComposerEditorProps, AiChatComposerForm, AiChatComposerFormProps, AiChatComposerProps, AiChatComposerSubmit, AiChatComposerSubmitProps, AiChatUserMessage, AiChatUserMessageProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckCircleFillIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, CommentIcon, CopyIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, GlobalComponents, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, MentionIcon, QuestionMarkIcon, RedoIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TranslateIcon, UnderlineIcon, UndoIcon, User, WarningIcon, capitalize, useComponents, useInitial, useRefs };
354
+ export { index$2 as AiChatComposer, AiChatComposerEditorProps, AiChatComposerFormProps, AiChatComposerSubmitProps, index$1 as AiMessage, AiMessageContentComponents, AiMessageContentProps, AiMessageContentReasoningPartProps, AiMessageContentTextPartProps, ArrowCornerDownRightIcon, ArrowCornerUpRightIcon, ArrowDownIcon, ArrowUpIcon, AttachmentIcon, BellCrossedIcon, BellIcon, BlockquoteIcon, BoldIcon, Button, CheckCircleFillIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CodeIcon, index as Collapsible, CommentIcon, CopyIcon, CrossCircleFillIcon, CrossIcon, DeleteIcon, EditIcon, EllipsisIcon, EmojiIcon, EmojiPlusIcon, H1Icon, H2Icon, H3Icon, ItalicIcon, LengthenIcon, List, ListOrderedIcon, ListUnorderedIcon, Markdown, MarkdownComponents, MarkdownComponentsBlockquoteProps, MarkdownComponentsCodeBlockProps, MarkdownComponentsHeadingProps, MarkdownComponentsImageProps, MarkdownComponentsLinkProps, MarkdownProps, MentionIcon, MinusCircleIcon, Prose, QuestionMarkIcon, RedoIcon, RestoreIcon, RetryIcon, SearchIcon, SelectButton, SendIcon, ShortcutTooltip, ShortenIcon, SparklesIcon, SparklesTextIcon, SpinnerIcon, StopIcon, StrikethroughIcon, TextIcon, Tooltip, TranslateIcon, UnderlineIcon, UndoIcon, User, WarningIcon, capitalize, useInitial, useRefs };
@@ -1,16 +1,19 @@
1
- export { useComponents } from '../components.js';
2
- export { AiChatAssistantMessage } from '../components/internal/AiChatAssistantMessage.js';
3
- export { AiChatComposer } from '../components/internal/AiChatComposer.js';
4
- export { AiChatUserMessage } from '../components/internal/AiChatUserMessage.js';
5
1
  export { Button, SelectButton } from '../components/internal/Button.js';
6
2
  export { List } from '../components/internal/List.js';
3
+ export { Prose } from '../components/internal/Prose.js';
7
4
  export { ShortcutTooltip, Tooltip } from '../components/internal/Tooltip.js';
8
5
  export { User } from '../components/internal/User.js';
9
6
  import '../icons/index.js';
10
- export { AiChatComposerEditor, AiChatComposerForm, AiChatComposerSubmit } from '../primitives/AiChatComposer/index.js';
11
7
  export { capitalize } from '../utils/capitalize.js';
12
8
  export { useInitial } from '../utils/use-initial.js';
13
9
  export { useRefs } from '../utils/use-refs.js';
10
+ import * as index from '../primitives/AiChatComposer/index.js';
11
+ export { index as AiChatComposer };
12
+ import * as index$1 from '../primitives/AiMessage/index.js';
13
+ export { index$1 as AiMessage };
14
+ import * as index$2 from '../primitives/Collapsible/index.js';
15
+ export { index$2 as Collapsible };
16
+ export { Markdown } from '../primitives/Markdown.js';
14
17
  export { TooltipProvider } from '@radix-ui/react-tooltip';
15
18
  export { ArrowCornerDownRightIcon } from '../icons/ArrowCornerDownRight.js';
16
19
  export { ArrowCornerUpRightIcon } from '../icons/ArrowCornerUpRight.js';
@@ -32,6 +35,7 @@ export { CodeIcon } from '../icons/Code.js';
32
35
  export { CommentIcon } from '../icons/Comment.js';
33
36
  export { CopyIcon } from '../icons/Copy.js';
34
37
  export { CrossIcon } from '../icons/Cross.js';
38
+ export { CrossCircleFillIcon } from '../icons/CrossCircleFill.js';
35
39
  export { DeleteIcon } from '../icons/Delete.js';
36
40
  export { EditIcon } from '../icons/Edit.js';
37
41
  export { EllipsisIcon } from '../icons/Ellipsis.js';
@@ -45,6 +49,7 @@ export { LengthenIcon } from '../icons/Lengthen.js';
45
49
  export { ListOrderedIcon } from '../icons/ListOrdered.js';
46
50
  export { ListUnorderedIcon } from '../icons/ListUnordered.js';
47
51
  export { MentionIcon } from '../icons/Mention.js';
52
+ export { MinusCircleIcon } from '../icons/MinusCircle.js';
48
53
  export { QuestionMarkIcon } from '../icons/QuestionMark.js';
49
54
  export { RedoIcon } from '../icons/Redo.js';
50
55
  export { RestoreIcon } from '../icons/Restore.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var core = require('@liveblocks/core');
5
4
  var react$1 = require('@liveblocks/react');
6
5
  var _private = require('@liveblocks/react/_private');
7
6
  var react = require('react');
@@ -9,11 +8,19 @@ var ArrowDown = require('../icons/ArrowDown.cjs');
9
8
  var Spinner = require('../icons/Spinner.cjs');
10
9
  var overrides = require('../overrides.cjs');
11
10
  var classNames = require('../utils/class-names.cjs');
11
+ var useVisible = require('../utils/use-visible.cjs');
12
12
  var AiChatAssistantMessage = require('./internal/AiChatAssistantMessage.cjs');
13
13
  var AiChatComposer = require('./internal/AiChatComposer.cjs');
14
14
  var AiChatUserMessage = require('./internal/AiChatUserMessage.cjs');
15
15
 
16
- const MIN_DISTANCE_TO_BOTTOM = 50;
16
+ const MIN_DISTANCE_BOTTOM_SCROLL_INDICATOR = 50;
17
+ const defaultComponents = {
18
+ Empty: () => null,
19
+ Loading: () => /* @__PURE__ */ jsxRuntime.jsx("div", {
20
+ className: "lb-loading lb-ai-chat-loading",
21
+ children: /* @__PURE__ */ jsxRuntime.jsx(Spinner.SpinnerIcon, {})
22
+ })
23
+ };
17
24
  const AiChat = react.forwardRef(
18
25
  ({
19
26
  chatId,
@@ -22,123 +29,96 @@ const AiChat = react.forwardRef(
22
29
  overrides: overrides$1,
23
30
  knowledge,
24
31
  tools = {},
32
+ layout = "inset",
25
33
  components,
26
34
  className,
27
35
  ...props
28
36
  }, forwardedRef) => {
29
37
  const { messages, isLoading, error } = react$1.useAiChatMessages(chatId);
30
38
  const $ = overrides.useOverrides(overrides$1);
39
+ const Empty = components?.Empty ?? defaultComponents.Empty;
40
+ const Loading = components?.Loading ?? defaultComponents.Loading;
31
41
  const containerRef = react.useRef(null);
32
- const [distanceToBottom, setDistanceToBottom] = react.useState(
33
- null
34
- );
35
- const client = react$1.useClient();
36
- const ai = client[core.kInternal].ai;
37
- const [lastSendMessageId, setLastSendMessageId] = react.useState(null);
42
+ const containerBottomRef = react.useRef(null);
43
+ const isScrollIndicatorEnabled = !isLoading && !error;
44
+ const isScrollAtBottom = useVisible.useVisible(containerBottomRef, {
45
+ enabled: isScrollIndicatorEnabled,
46
+ root: containerRef,
47
+ rootMargin: MIN_DISTANCE_BOTTOM_SCROLL_INDICATOR,
48
+ initialValue: null
49
+ });
50
+ const isScrollIndicatorVisible = isScrollIndicatorEnabled && isScrollAtBottom !== null ? !isScrollAtBottom : false;
51
+ const [lastSentMessageId, setLastSentMessageId] = react.useState(null);
38
52
  react.useImperativeHandle(
39
53
  forwardedRef,
40
54
  () => containerRef.current,
41
55
  []
42
56
  );
43
- react.useEffect(() => {
44
- Object.entries(tools).map(
45
- ([key, value]) => ai.registerChatTool(chatId, key, value)
46
- );
47
- return () => {
48
- Object.entries(tools).map(
49
- ([key]) => ai.unregisterChatTool(chatId, key)
50
- );
51
- };
52
- }, [ai, chatId, tools]);
53
- react.useEffect(() => {
54
- const container = containerRef.current;
55
- if (container === null)
56
- return;
57
- function handleScrollChange() {
58
- const container2 = containerRef.current;
59
- if (container2 === null)
60
- return;
61
- setDistanceToBottom(
62
- container2.scrollHeight - container2.clientHeight - container2.scrollTop
63
- );
64
- }
65
- container.addEventListener("scroll", handleScrollChange);
66
- return () => {
67
- container.removeEventListener("scroll", handleScrollChange);
68
- };
69
- }, []);
70
- react.useEffect(() => {
71
- const container = containerRef.current;
72
- if (container === null)
73
- return;
74
- setDistanceToBottom(
75
- container.scrollHeight - container.clientHeight - container.scrollTop
76
- );
77
- }, [messages]);
78
- react.useEffect(() => {
79
- const container = containerRef.current;
80
- if (container === null)
81
- return;
82
- container.scrollTo({
83
- top: container.scrollHeight,
84
- behavior: "smooth"
85
- });
86
- }, [lastSendMessageId]);
87
- react.useEffect(() => {
88
- const container = containerRef.current;
89
- if (container === null)
90
- return;
91
- const observer = new ResizeObserver(() => {
92
- const container2 = containerRef.current;
93
- if (container2 === null)
94
- return;
95
- setDistanceToBottom(
96
- container2.scrollHeight - container2.clientHeight - container2.scrollTop
97
- );
98
- });
99
- observer.observe(container);
100
- return () => {
101
- observer.disconnect();
102
- };
103
- }, []);
104
57
  const scrollToBottomCallbackRef = react.useRef(void 0);
105
58
  if (scrollToBottomCallbackRef.current === void 0) {
106
- scrollToBottomCallbackRef.current = function() {
59
+ scrollToBottomCallbackRef.current = function(behavior) {
107
60
  const container = containerRef.current;
108
61
  if (container === null)
109
62
  return;
110
63
  container.scrollTo({
111
64
  top: container.scrollHeight,
112
- behavior: "instant"
65
+ behavior
113
66
  });
114
67
  };
115
68
  }
116
- const isScrollIndicatorVisible = distanceToBottom !== null && distanceToBottom > MIN_DISTANCE_TO_BOTTOM;
69
+ const scrollToBottom = scrollToBottomCallbackRef.current;
117
70
  return /* @__PURE__ */ jsxRuntime.jsxs("div", {
118
71
  ref: containerRef,
119
72
  ...props,
120
- className: classNames.classNames("lb-root lb-ai-chat", className),
73
+ className: classNames.classNames(
74
+ "lb-root lb-ai-chat",
75
+ layout === "compact" ? "lb-ai-chat:layout-compact" : "lb-ai-chat:layout-inset",
76
+ className
77
+ ),
121
78
  children: [
122
79
  knowledge ? knowledge.map((source, index) => /* @__PURE__ */ jsxRuntime.jsx(react$1.RegisterAiKnowledge, {
123
80
  description: source.description,
124
81
  value: source.value
125
82
  }, index)) : null,
83
+ Object.entries(tools).map(([name, tool]) => /* @__PURE__ */ jsxRuntime.jsx(react$1.RegisterAiTool, {
84
+ chatId,
85
+ name,
86
+ tool
87
+ }, name)),
126
88
  /* @__PURE__ */ jsxRuntime.jsx("div", {
127
89
  className: "lb-ai-chat-content",
128
- children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", {
129
- className: "lb-loading lb-ai-chat-loading",
130
- children: /* @__PURE__ */ jsxRuntime.jsx(Spinner.SpinnerIcon, {})
131
- }) : error !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", {
90
+ children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Loading, {}) : error !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", {
132
91
  className: "lb-error lb-ai-chat-error",
133
92
  children: $.AI_CHAT_MESSAGES_ERROR(error)
134
- }) : /* @__PURE__ */ jsxRuntime.jsx("div", {
135
- className: "lb-ai-chat-messages",
136
- children: /* @__PURE__ */ jsxRuntime.jsx(Messages, {
137
- messages,
138
- overrides: $,
139
- components,
140
- onDistanceToBottomChange: scrollToBottomCallbackRef.current
141
- })
93
+ }) : messages.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(Empty, {
94
+ chatId,
95
+ copilotId
96
+ }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
97
+ children: [
98
+ /* @__PURE__ */ jsxRuntime.jsx(AutoScrollHandler, {
99
+ lastSentMessageId,
100
+ scrollToBottom
101
+ }),
102
+ /* @__PURE__ */ jsxRuntime.jsx("div", {
103
+ className: "lb-ai-chat-messages",
104
+ children: messages.map((message) => {
105
+ if (message.role === "user") {
106
+ return /* @__PURE__ */ jsxRuntime.jsx(AiChatUserMessage.AiChatUserMessage, {
107
+ message,
108
+ overrides: overrides$1
109
+ }, message.id);
110
+ } else if (message.role === "assistant") {
111
+ return /* @__PURE__ */ jsxRuntime.jsx(AiChatAssistantMessage.AiChatAssistantMessage, {
112
+ message,
113
+ overrides: overrides$1,
114
+ components
115
+ }, message.id);
116
+ } else {
117
+ return null;
118
+ }
119
+ })
120
+ })
121
+ ]
142
122
  })
143
123
  }),
144
124
  /* @__PURE__ */ jsxRuntime.jsxs("div", {
@@ -147,22 +127,13 @@ const AiChat = react.forwardRef(
147
127
  /* @__PURE__ */ jsxRuntime.jsx("div", {
148
128
  className: "lb-ai-chat-footer-actions",
149
129
  children: /* @__PURE__ */ jsxRuntime.jsx("div", {
150
- className: "lb-elevation lb-ai-chat-scroll-indicator",
130
+ className: "lb-root lb-elevation lb-elevation-moderate lb-ai-chat-scroll-indicator",
151
131
  "data-visible": isScrollIndicatorVisible ? "" : void 0,
152
132
  children: /* @__PURE__ */ jsxRuntime.jsx("button", {
153
133
  className: "lb-ai-chat-scroll-indicator-button",
154
134
  tabIndex: isScrollIndicatorVisible ? 0 : -1,
155
135
  "aria-hidden": !isScrollIndicatorVisible,
156
- disabled: !isScrollIndicatorVisible,
157
- onClick: () => {
158
- const container = containerRef.current;
159
- if (container === null)
160
- return;
161
- container.scrollTo({
162
- top: container.scrollHeight,
163
- behavior: "smooth"
164
- });
165
- },
136
+ onClick: () => scrollToBottom("smooth"),
166
137
  children: /* @__PURE__ */ jsxRuntime.jsx("span", {
167
138
  className: "lb-icon-container",
168
139
  children: /* @__PURE__ */ jsxRuntime.jsx(ArrowDown.ArrowDownIcon, {})
@@ -173,41 +144,34 @@ const AiChat = react.forwardRef(
173
144
  /* @__PURE__ */ jsxRuntime.jsx(AiChatComposer.AiChatComposer, {
174
145
  chatId,
175
146
  copilotId,
176
- overrides: $,
147
+ overrides: overrides$1,
177
148
  autoFocus,
178
- onUserMessageCreate: ({ id }) => setLastSendMessageId(id)
149
+ onUserMessageCreate: ({ id }) => setLastSentMessageId(id),
150
+ className: layout === "inset" ? "lb-elevation lb-elevation-moderate" : void 0
179
151
  }, chatId)
180
152
  ]
153
+ }),
154
+ /* @__PURE__ */ jsxRuntime.jsx("div", {
155
+ ref: containerBottomRef,
156
+ style: { position: "sticky", height: 0 },
157
+ "aria-hidden": true,
158
+ "data-scroll-at-bottom": isScrollAtBottom ? "" : void 0
181
159
  })
182
160
  ]
183
161
  });
184
162
  }
185
163
  );
186
- function Messages({
187
- messages,
188
- overrides,
189
- components,
190
- onDistanceToBottomChange
164
+ function AutoScrollHandler({
165
+ lastSentMessageId,
166
+ scrollToBottom
191
167
  }) {
192
168
  _private.useLayoutEffect(() => {
193
- onDistanceToBottomChange();
194
- }, [onDistanceToBottomChange]);
195
- return messages.map((message) => {
196
- if (message.role === "user") {
197
- return /* @__PURE__ */ jsxRuntime.jsx(AiChatUserMessage.AiChatUserMessage, {
198
- message,
199
- overrides
200
- }, message.id);
201
- } else if (message.role === "assistant") {
202
- return /* @__PURE__ */ jsxRuntime.jsx(AiChatAssistantMessage.AiChatAssistantMessage, {
203
- message,
204
- overrides,
205
- components
206
- }, message.id);
207
- } else {
208
- return null;
209
- }
210
- });
169
+ scrollToBottom("instant");
170
+ }, [scrollToBottom]);
171
+ react.useEffect(() => {
172
+ scrollToBottom("smooth");
173
+ }, [lastSentMessageId, scrollToBottom]);
174
+ return null;
211
175
  }
212
176
 
213
177
  exports.AiChat = AiChat;