@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.
- package/dist/_private/index.cjs +14 -10
- package/dist/_private/index.cjs.map +1 -1
- package/dist/_private/index.d.cts +200 -105
- package/dist/_private/index.d.ts +200 -105
- package/dist/_private/index.js +10 -5
- package/dist/_private/index.js.map +1 -1
- package/dist/components/AiChat.cjs +85 -120
- package/dist/components/AiChat.cjs.map +1 -1
- package/dist/components/AiChat.js +87 -122
- package/dist/components/AiChat.js.map +1 -1
- package/dist/components/AiTool.cjs +164 -0
- package/dist/components/AiTool.cjs.map +1 -0
- package/dist/components/AiTool.js +162 -0
- package/dist/components/AiTool.js.map +1 -0
- package/dist/components/Comment.cjs +5 -3
- package/dist/components/Comment.cjs.map +1 -1
- package/dist/components/Comment.js +6 -4
- package/dist/components/Comment.js.map +1 -1
- package/dist/components/InboxNotificationList.cjs +11 -3
- package/dist/components/InboxNotificationList.cjs.map +1 -1
- package/dist/components/InboxNotificationList.js +12 -4
- package/dist/components/InboxNotificationList.js.map +1 -1
- package/dist/components/Thread.cjs +3 -3
- package/dist/components/Thread.cjs.map +1 -1
- package/dist/components/Thread.js +3 -3
- package/dist/components/Thread.js.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.cjs +53 -229
- package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.js +55 -231
- package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
- package/dist/components/internal/AiChatComposer.cjs +29 -17
- package/dist/components/internal/AiChatComposer.cjs.map +1 -1
- package/dist/components/internal/AiChatComposer.js +29 -17
- package/dist/components/internal/AiChatComposer.js.map +1 -1
- package/dist/components/internal/AiChatUserMessage.cjs +17 -10
- package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatUserMessage.js +17 -10
- package/dist/components/internal/AiChatUserMessage.js.map +1 -1
- package/dist/components/internal/Button.cjs.map +1 -1
- package/dist/components/internal/Button.js.map +1 -1
- package/dist/components/internal/CodeBlock.cjs +72 -0
- package/dist/components/internal/CodeBlock.cjs.map +1 -0
- package/dist/components/internal/CodeBlock.js +70 -0
- package/dist/components/internal/CodeBlock.js.map +1 -0
- package/dist/components/internal/Emoji.cjs +12 -4
- package/dist/components/internal/Emoji.cjs.map +1 -1
- package/dist/components/internal/Emoji.js +12 -4
- package/dist/components/internal/Emoji.js.map +1 -1
- package/dist/components/internal/Prose.cjs +37 -0
- package/dist/components/internal/Prose.cjs.map +1 -0
- package/dist/components/internal/Prose.js +35 -0
- package/dist/components/internal/Prose.js.map +1 -0
- package/dist/icon.cjs +2 -0
- package/dist/icon.cjs.map +1 -1
- package/dist/icon.js +1 -0
- package/dist/icon.js.map +1 -1
- package/dist/icons/{Resolve.cjs → CheckCircle.cjs} +3 -3
- package/dist/icons/CheckCircle.cjs.map +1 -0
- package/dist/icons/{Resolve.js → CheckCircle.js} +3 -3
- package/dist/icons/CheckCircle.js.map +1 -0
- package/dist/icons/{Resolved.cjs → CheckCircleFill.cjs} +3 -3
- package/dist/icons/CheckCircleFill.cjs.map +1 -0
- package/dist/icons/{Resolved.js → CheckCircleFill.js} +3 -3
- package/dist/icons/CheckCircleFill.js.map +1 -0
- package/dist/icons/index.cjs +4 -4
- package/dist/icons/index.js +2 -2
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +68 -14
- package/dist/index.d.ts +68 -14
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/overrides.cjs +2 -8
- package/dist/overrides.cjs.map +1 -1
- package/dist/overrides.js +2 -8
- package/dist/overrides.js.map +1 -1
- package/dist/primitives/AiChatComposer/index.cjs +1 -2
- package/dist/primitives/AiChatComposer/index.cjs.map +1 -1
- package/dist/primitives/AiChatComposer/index.js +1 -2
- package/dist/primitives/AiChatComposer/index.js.map +1 -1
- package/dist/primitives/AiMessage/contexts.cjs +18 -0
- package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
- package/dist/primitives/AiMessage/contexts.js +15 -0
- package/dist/primitives/AiMessage/contexts.js.map +1 -0
- package/dist/primitives/AiMessage/index.cjs +133 -0
- package/dist/primitives/AiMessage/index.cjs.map +1 -0
- package/dist/primitives/AiMessage/index.js +131 -0
- package/dist/primitives/AiMessage/index.js.map +1 -0
- package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
- package/dist/primitives/Collapsible/index.cjs.map +1 -0
- package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
- package/dist/primitives/Collapsible/index.js.map +1 -0
- package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +150 -83
- package/dist/primitives/Markdown.cjs.map +1 -0
- package/dist/primitives/{internal/Markdown.js → Markdown.js} +151 -83
- package/dist/primitives/Markdown.js.map +1 -0
- package/dist/primitives/index.cjs +4 -6
- package/dist/primitives/index.cjs.map +1 -1
- package/dist/primitives/index.d.cts +2 -79
- package/dist/primitives/index.d.ts +2 -79
- package/dist/primitives/index.js +4 -6
- package/dist/primitives/index.js.map +1 -1
- package/dist/utils/ErrorBoundary.cjs +48 -0
- package/dist/utils/ErrorBoundary.cjs.map +1 -0
- package/dist/utils/ErrorBoundary.js +45 -0
- package/dist/utils/ErrorBoundary.js.map +1 -0
- package/dist/utils/use-visible.cjs +63 -45
- package/dist/utils/use-visible.cjs.map +1 -1
- package/dist/utils/use-visible.js +64 -46
- package/dist/utils/use-visible.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -5
- package/src/styles/constants.css +1 -1
- package/src/styles/dark/index.css +7 -3
- package/src/styles/index.css +584 -238
- package/src/styles/utils.css +1 -1
- package/styles/dark/attributes.css +1 -1
- package/styles/dark/attributes.css.map +1 -1
- package/styles/dark/media-query.css +1 -1
- package/styles/dark/media-query.css.map +1 -1
- package/styles.css +1 -1
- package/styles.css.map +1 -1
- package/dist/icons/Resolve.cjs.map +0 -1
- package/dist/icons/Resolve.js.map +0 -1
- package/dist/icons/Resolved.cjs.map +0 -1
- package/dist/icons/Resolved.js.map +0 -1
- package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
- package/dist/primitives/internal/Collapsible/index.js.map +0 -1
- package/dist/primitives/internal/Emoji.cjs +0 -32
- package/dist/primitives/internal/Emoji.cjs.map +0 -1
- package/dist/primitives/internal/Emoji.js +0 -30
- package/dist/primitives/internal/Emoji.js.map +0 -1
- package/dist/primitives/internal/Markdown.cjs.map +0 -1
- package/dist/primitives/internal/Markdown.js.map +0 -1
package/dist/_private/index.d.ts
CHANGED
|
@@ -1,108 +1,12 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { ElementType, ComponentPropsWithoutRef,
|
|
3
|
-
import
|
|
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
|
|
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
|
-
|
|
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 };
|
package/dist/_private/index.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
32
|
-
|
|
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]) =>
|
|
60
|
+
([key, value]) => ai.registerChatTool(chatId, key, value)
|
|
51
61
|
);
|
|
52
62
|
return () => {
|
|
53
63
|
Object.entries(tools).map(
|
|
54
|
-
([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
|
|
76
|
+
behavior
|
|
123
77
|
});
|
|
124
78
|
};
|
|
125
79
|
}
|
|
126
|
-
const
|
|
80
|
+
const scrollToBottom = scrollToBottomCallbackRef.current;
|
|
127
81
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", {
|
|
128
82
|
ref: containerRef,
|
|
129
83
|
...props,
|
|
130
|
-
className: classNames.classNames(
|
|
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(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
onDistanceToBottomChange
|
|
168
|
+
function AutoScrollHandler({
|
|
169
|
+
lastSentMessageId,
|
|
170
|
+
scrollToBottom
|
|
194
171
|
}) {
|
|
195
|
-
const $ = overrides.useOverrides(overrides$1);
|
|
196
172
|
_private.useLayoutEffect(() => {
|
|
197
|
-
|
|
198
|
-
}, [
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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;
|