@liveblocks/react-ui 2.25.0-aiprivatebeta7 → 2.25.0-aiprivatebeta9

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