@liveblocks/react-ui 2.25.0-aiprivatebeta10 → 2.25.0-aiprivatebeta12
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/components/AiChat.cjs +11 -17
- package/dist/components/AiChat.cjs.map +1 -1
- package/dist/components/AiChat.js +12 -18
- package/dist/components/AiChat.js.map +1 -1
- package/dist/components/AiTool.cjs +36 -23
- package/dist/components/AiTool.cjs.map +1 -1
- package/dist/components/AiTool.js +37 -24
- package/dist/components/AiTool.js.map +1 -1
- package/dist/components/Composer.cjs +3 -3
- package/dist/components/Composer.cjs.map +1 -1
- package/dist/components/Composer.js +3 -3
- package/dist/components/Composer.js.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.cjs +8 -4
- package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.js +9 -5
- package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
- package/dist/components/internal/AiChatComposer.cjs.map +1 -1
- package/dist/components/internal/AiChatComposer.js.map +1 -1
- package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatUserMessage.js.map +1 -1
- package/dist/components/internal/CodeBlock.cjs +6 -3
- package/dist/components/internal/CodeBlock.cjs.map +1 -1
- package/dist/components/internal/CodeBlock.js +6 -3
- package/dist/components/internal/CodeBlock.js.map +1 -1
- package/dist/index.d.cts +20 -2
- package/dist/index.d.ts +20 -2
- package/dist/overrides.cjs +5 -1
- package/dist/overrides.cjs.map +1 -1
- package/dist/overrides.js +5 -1
- package/dist/overrides.js.map +1 -1
- package/dist/primitives/AiMessage/index.cjs +24 -19
- package/dist/primitives/AiMessage/index.cjs.map +1 -1
- package/dist/primitives/AiMessage/index.js +25 -20
- package/dist/primitives/AiMessage/index.js.map +1 -1
- package/dist/primitives/Collapsible/index.cjs +3 -3
- package/dist/primitives/Collapsible/index.cjs.map +1 -1
- package/dist/primitives/Collapsible/index.js +3 -3
- package/dist/primitives/Collapsible/index.js.map +1 -1
- package/dist/utils/use-controllable-state.cjs +25 -2
- package/dist/utils/use-controllable-state.cjs.map +1 -1
- package/dist/utils/use-controllable-state.js +25 -3
- package/dist/utils/use-controllable-state.js.map +1 -1
- package/dist/utils/use-visible.cjs +3 -1
- package/dist/utils/use-visible.cjs.map +1 -1
- package/dist/utils/use-visible.js +3 -1
- package/dist/utils/use-visible.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/src/styles/index.css +1 -1
- package/styles.css +1 -1
- package/styles.css.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiChatComposer.cjs","sources":["../../../src/components/internal/AiChatComposer.tsx"],"sourcesContent":["import type { CopilotId, MessageId, UiChatMessage } from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\nimport {\n type ComponentProps,\n type FormEvent,\n forwardRef,\n useCallback,\n} from \"react\";\n\nimport { SendIcon } from \"../../icons/Send\";\nimport { StopIcon } from \"../../icons/Stop\";\nimport {\n type AiChatComposerOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../../overrides\";\nimport * as ComposerPrimitive from \"../../primitives/AiChatComposer\";\nimport { classNames } from \"../../utils/class-names\";\nimport { Button } from \"./Button\";\nimport { ShortcutTooltip, TooltipProvider } from \"./Tooltip\";\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatComposer\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatComposerProps extends ComponentProps<\"form\"> {\n /**\n * The composer's initial value.\n */\n defaultValue?: string;\n /**\n * The event handler called when a chat message is submitted.\n */\n onComposerSubmit?: (\n message: {\n /**\n * The submitted message text.\n */\n text: string;\n },\n event: FormEvent<HTMLFormElement>\n ) => void;\n\n /**\n * @internal\n * The event handler called when a user chat message is created optimistically.\n */\n onUserMessageCreate?: (message: {\n /**\n * The created user message id.\n */\n id: MessageId;\n }) => void;\n /**\n * Whether the composer is disabled.\n */\n disabled?: boolean;\n /**\n * Whether to focus the editor on mount.\n */\n autoFocus?: boolean;\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatComposerOverrides>;\n /**\n * The id of the chat the composer belongs to.\n */\n chatId: string;\n /**\n * The id of the copilot to use to send the message.\n */\n copilotId?: CopilotId;\n /**\n * @internal\n */\n branchId?: MessageId;\n /**\n * @internal\n */\n stream?: boolean;\n}\n\nexport const AiChatComposer = forwardRef<HTMLFormElement, AiChatComposerProps>(\n (\n {\n defaultValue,\n onComposerSubmit,\n disabled,\n autoFocus,\n overrides,\n className,\n chatId,\n branchId,\n copilotId,\n stream = true,\n onUserMessageCreate,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n const client = useClient();\n\n const getLastMessageId = useCallback((messages: UiChatMessage[]) => {\n const lastMessage = messages[messages.length - 1];\n if (lastMessage === undefined) return null;\n return lastMessage.id;\n }, []);\n\n const getAbortableMessageId = useCallback((messages: UiChatMessage[]) => {\n return messages.find(\n (m) =>\n m.role === \"assistant\" &&\n (m.status === \"generating\" || m.status === \"awaiting-tool\")\n )?.id;\n }, []);\n\n const messagesΣ = client[kInternal].ai.signals.getChatMessagesForBranchΣ(\n chatId,\n branchId\n );\n\n const abortableMessageId = useSignal(messagesΣ, getAbortableMessageId);\n const lastMessageId = useSignal(messagesΣ, getLastMessageId);\n\n const handleComposerSubmit = useCallback(\n (message: { text: string }, event: FormEvent<HTMLFormElement>) => {\n if (abortableMessageId !== undefined) {\n event.preventDefault();\n return;\n }\n\n onComposerSubmit?.(message, event);\n if (event.isDefaultPrevented()) return;\n\n const content = [{ type: \"text\" as const, text: message.text }];\n const newMessageId = client[kInternal].ai[\n kInternal\n ].context.messagesStore.createOptimistically(\n chatId,\n \"user\",\n lastMessageId,\n content\n );\n onUserMessageCreate?.({ id: newMessageId });\n\n const targetMessageId = client[kInternal].ai[\n kInternal\n ].context.messagesStore.createOptimistically(\n chatId,\n \"assistant\",\n newMessageId\n );\n\n client[kInternal].ai.askUserMessageInChat(\n chatId,\n { id: newMessageId, parentMessageId: lastMessageId, content },\n targetMessageId,\n {\n stream,\n copilotId,\n }\n );\n },\n [\n onComposerSubmit,\n onUserMessageCreate,\n client,\n chatId,\n lastMessageId,\n abortableMessageId,\n stream,\n copilotId,\n ]\n );\n\n return (\n <TooltipProvider>\n <ComposerPrimitive.Form\n className={classNames(\n \"lb-root lb-ai-chat-composer lb-ai-chat-composer-form\",\n className\n )}\n dir={$.dir}\n {...props}\n disabled={disabled}\n ref={forwardedRef}\n onComposerSubmit={handleComposerSubmit}\n >\n <div className=\"lb-ai-chat-composer-editor-container\">\n <ComposerPrimitive.Editor\n autoFocus={autoFocus}\n className=\"lb-ai-chat-composer-editor\"\n placeholder={$.AI_CHAT_COMPOSER_PLACEHOLDER}\n defaultValue={defaultValue}\n />\n\n <div className=\"lb-ai-chat-composer-footer\">\n <div className=\"lb-ai-chat-composer-editor-actions\">\n {/* No actions for now but it makes sense to keep the DOM structure */}\n </div>\n\n <div className=\"lb-ai-chat-composer-actions\">\n {abortableMessageId === undefined ? (\n <ShortcutTooltip\n content={$.AI_CHAT_COMPOSER_SEND}\n shortcut=\"Enter\"\n >\n <ComposerPrimitive.Submit asChild>\n <Button\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => event.stopPropagation()}\n className=\"lb-ai-chat-composer-action\"\n variant=\"primary\"\n aria-label={$.AI_CHAT_COMPOSER_SEND}\n icon={<SendIcon />}\n />\n </ComposerPrimitive.Submit>\n </ShortcutTooltip>\n ) : (\n <ShortcutTooltip content={$.AI_CHAT_COMPOSER_ABORT}>\n <Button\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => {\n event.stopPropagation();\n client[kInternal].ai.abort(abortableMessageId);\n }}\n className=\"lb-ai-chat-composer-action\"\n variant=\"secondary\"\n aria-label={$.AI_CHAT_COMPOSER_ABORT}\n icon={<StopIcon />}\n />\n </ShortcutTooltip>\n )}\n </div>\n </div>\n </div>\n </ComposerPrimitive.Form>\n </TooltipProvider>\n );\n }\n);\n"],"names":["forwardRef","overrides","useOverrides","useClient","useCallback","kInternal","useSignal","jsx","TooltipProvider","ComposerPrimitive.Form","classNames","jsxs","ComposerPrimitive.Editor","ShortcutTooltip","ComposerPrimitive.Submit","Button","SendIcon","StopIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiChatComposer.cjs","sources":["../../../src/components/internal/AiChatComposer.tsx"],"sourcesContent":["import type {\n AiChatMessage,\n CopilotId,\n MessageId,\n WithNavigation,\n} from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\nimport {\n type ComponentProps,\n type FormEvent,\n forwardRef,\n useCallback,\n} from \"react\";\n\nimport { SendIcon } from \"../../icons/Send\";\nimport { StopIcon } from \"../../icons/Stop\";\nimport {\n type AiChatComposerOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../../overrides\";\nimport * as ComposerPrimitive from \"../../primitives/AiChatComposer\";\nimport { classNames } from \"../../utils/class-names\";\nimport { Button } from \"./Button\";\nimport { ShortcutTooltip, TooltipProvider } from \"./Tooltip\";\n\ntype UiChatMessage = WithNavigation<AiChatMessage>;\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatComposer\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatComposerProps extends ComponentProps<\"form\"> {\n /**\n * The composer's initial value.\n */\n defaultValue?: string;\n /**\n * The event handler called when a chat message is submitted.\n */\n onComposerSubmit?: (\n message: {\n /**\n * The submitted message text.\n */\n text: string;\n },\n event: FormEvent<HTMLFormElement>\n ) => void;\n\n /**\n * @internal\n * The event handler called when a user chat message is created optimistically.\n */\n onUserMessageCreate?: (message: {\n /**\n * The created user message id.\n */\n id: MessageId;\n }) => void;\n /**\n * Whether the composer is disabled.\n */\n disabled?: boolean;\n /**\n * Whether to focus the editor on mount.\n */\n autoFocus?: boolean;\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatComposerOverrides>;\n /**\n * The id of the chat the composer belongs to.\n */\n chatId: string;\n /**\n * The id of the copilot to use to send the message.\n */\n copilotId?: CopilotId;\n /**\n * @internal\n */\n branchId?: MessageId;\n /**\n * @internal\n */\n stream?: boolean;\n}\n\nexport const AiChatComposer = forwardRef<HTMLFormElement, AiChatComposerProps>(\n (\n {\n defaultValue,\n onComposerSubmit,\n disabled,\n autoFocus,\n overrides,\n className,\n chatId,\n branchId,\n copilotId,\n stream = true,\n onUserMessageCreate,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n const client = useClient();\n\n const getLastMessageId = useCallback((messages: UiChatMessage[]) => {\n const lastMessage = messages[messages.length - 1];\n if (lastMessage === undefined) return null;\n return lastMessage.id;\n }, []);\n\n const getAbortableMessageId = useCallback((messages: UiChatMessage[]) => {\n return messages.find(\n (m) =>\n m.role === \"assistant\" &&\n (m.status === \"generating\" || m.status === \"awaiting-tool\")\n )?.id;\n }, []);\n\n const messagesΣ = client[kInternal].ai.signals.getChatMessagesForBranchΣ(\n chatId,\n branchId\n );\n\n const abortableMessageId = useSignal(messagesΣ, getAbortableMessageId);\n const lastMessageId = useSignal(messagesΣ, getLastMessageId);\n\n const handleComposerSubmit = useCallback(\n (message: { text: string }, event: FormEvent<HTMLFormElement>) => {\n if (abortableMessageId !== undefined) {\n event.preventDefault();\n return;\n }\n\n onComposerSubmit?.(message, event);\n if (event.isDefaultPrevented()) return;\n\n const content = [{ type: \"text\" as const, text: message.text }];\n const newMessageId = client[kInternal].ai[\n kInternal\n ].context.messagesStore.createOptimistically(\n chatId,\n \"user\",\n lastMessageId,\n content\n );\n onUserMessageCreate?.({ id: newMessageId });\n\n const targetMessageId = client[kInternal].ai[\n kInternal\n ].context.messagesStore.createOptimistically(\n chatId,\n \"assistant\",\n newMessageId\n );\n\n client[kInternal].ai.askUserMessageInChat(\n chatId,\n { id: newMessageId, parentMessageId: lastMessageId, content },\n targetMessageId,\n {\n stream,\n copilotId,\n }\n );\n },\n [\n onComposerSubmit,\n onUserMessageCreate,\n client,\n chatId,\n lastMessageId,\n abortableMessageId,\n stream,\n copilotId,\n ]\n );\n\n return (\n <TooltipProvider>\n <ComposerPrimitive.Form\n className={classNames(\n \"lb-root lb-ai-chat-composer lb-ai-chat-composer-form\",\n className\n )}\n dir={$.dir}\n {...props}\n disabled={disabled}\n ref={forwardedRef}\n onComposerSubmit={handleComposerSubmit}\n >\n <div className=\"lb-ai-chat-composer-editor-container\">\n <ComposerPrimitive.Editor\n autoFocus={autoFocus}\n className=\"lb-ai-chat-composer-editor\"\n placeholder={$.AI_CHAT_COMPOSER_PLACEHOLDER}\n defaultValue={defaultValue}\n />\n\n <div className=\"lb-ai-chat-composer-footer\">\n <div className=\"lb-ai-chat-composer-editor-actions\">\n {/* No actions for now but it makes sense to keep the DOM structure */}\n </div>\n\n <div className=\"lb-ai-chat-composer-actions\">\n {abortableMessageId === undefined ? (\n <ShortcutTooltip\n content={$.AI_CHAT_COMPOSER_SEND}\n shortcut=\"Enter\"\n >\n <ComposerPrimitive.Submit asChild>\n <Button\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => event.stopPropagation()}\n className=\"lb-ai-chat-composer-action\"\n variant=\"primary\"\n aria-label={$.AI_CHAT_COMPOSER_SEND}\n icon={<SendIcon />}\n />\n </ComposerPrimitive.Submit>\n </ShortcutTooltip>\n ) : (\n <ShortcutTooltip content={$.AI_CHAT_COMPOSER_ABORT}>\n <Button\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => {\n event.stopPropagation();\n client[kInternal].ai.abort(abortableMessageId);\n }}\n className=\"lb-ai-chat-composer-action\"\n variant=\"secondary\"\n aria-label={$.AI_CHAT_COMPOSER_ABORT}\n icon={<StopIcon />}\n />\n </ShortcutTooltip>\n )}\n </div>\n </div>\n </div>\n </ComposerPrimitive.Form>\n </TooltipProvider>\n );\n }\n);\n"],"names":["forwardRef","overrides","useOverrides","useClient","useCallback","kInternal","useSignal","jsx","TooltipProvider","ComposerPrimitive.Form","classNames","jsxs","ComposerPrimitive.Editor","ShortcutTooltip","ComposerPrimitive.Submit","Button","SendIcon","StopIcon"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiChatComposer.js","sources":["../../../src/components/internal/AiChatComposer.tsx"],"sourcesContent":["import type { CopilotId, MessageId, UiChatMessage } from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\nimport {\n type ComponentProps,\n type FormEvent,\n forwardRef,\n useCallback,\n} from \"react\";\n\nimport { SendIcon } from \"../../icons/Send\";\nimport { StopIcon } from \"../../icons/Stop\";\nimport {\n type AiChatComposerOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../../overrides\";\nimport * as ComposerPrimitive from \"../../primitives/AiChatComposer\";\nimport { classNames } from \"../../utils/class-names\";\nimport { Button } from \"./Button\";\nimport { ShortcutTooltip, TooltipProvider } from \"./Tooltip\";\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatComposer\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatComposerProps extends ComponentProps<\"form\"> {\n /**\n * The composer's initial value.\n */\n defaultValue?: string;\n /**\n * The event handler called when a chat message is submitted.\n */\n onComposerSubmit?: (\n message: {\n /**\n * The submitted message text.\n */\n text: string;\n },\n event: FormEvent<HTMLFormElement>\n ) => void;\n\n /**\n * @internal\n * The event handler called when a user chat message is created optimistically.\n */\n onUserMessageCreate?: (message: {\n /**\n * The created user message id.\n */\n id: MessageId;\n }) => void;\n /**\n * Whether the composer is disabled.\n */\n disabled?: boolean;\n /**\n * Whether to focus the editor on mount.\n */\n autoFocus?: boolean;\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatComposerOverrides>;\n /**\n * The id of the chat the composer belongs to.\n */\n chatId: string;\n /**\n * The id of the copilot to use to send the message.\n */\n copilotId?: CopilotId;\n /**\n * @internal\n */\n branchId?: MessageId;\n /**\n * @internal\n */\n stream?: boolean;\n}\n\nexport const AiChatComposer = forwardRef<HTMLFormElement, AiChatComposerProps>(\n (\n {\n defaultValue,\n onComposerSubmit,\n disabled,\n autoFocus,\n overrides,\n className,\n chatId,\n branchId,\n copilotId,\n stream = true,\n onUserMessageCreate,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n const client = useClient();\n\n const getLastMessageId = useCallback((messages: UiChatMessage[]) => {\n const lastMessage = messages[messages.length - 1];\n if (lastMessage === undefined) return null;\n return lastMessage.id;\n }, []);\n\n const getAbortableMessageId = useCallback((messages: UiChatMessage[]) => {\n return messages.find(\n (m) =>\n m.role === \"assistant\" &&\n (m.status === \"generating\" || m.status === \"awaiting-tool\")\n )?.id;\n }, []);\n\n const messagesΣ = client[kInternal].ai.signals.getChatMessagesForBranchΣ(\n chatId,\n branchId\n );\n\n const abortableMessageId = useSignal(messagesΣ, getAbortableMessageId);\n const lastMessageId = useSignal(messagesΣ, getLastMessageId);\n\n const handleComposerSubmit = useCallback(\n (message: { text: string }, event: FormEvent<HTMLFormElement>) => {\n if (abortableMessageId !== undefined) {\n event.preventDefault();\n return;\n }\n\n onComposerSubmit?.(message, event);\n if (event.isDefaultPrevented()) return;\n\n const content = [{ type: \"text\" as const, text: message.text }];\n const newMessageId = client[kInternal].ai[\n kInternal\n ].context.messagesStore.createOptimistically(\n chatId,\n \"user\",\n lastMessageId,\n content\n );\n onUserMessageCreate?.({ id: newMessageId });\n\n const targetMessageId = client[kInternal].ai[\n kInternal\n ].context.messagesStore.createOptimistically(\n chatId,\n \"assistant\",\n newMessageId\n );\n\n client[kInternal].ai.askUserMessageInChat(\n chatId,\n { id: newMessageId, parentMessageId: lastMessageId, content },\n targetMessageId,\n {\n stream,\n copilotId,\n }\n );\n },\n [\n onComposerSubmit,\n onUserMessageCreate,\n client,\n chatId,\n lastMessageId,\n abortableMessageId,\n stream,\n copilotId,\n ]\n );\n\n return (\n <TooltipProvider>\n <ComposerPrimitive.Form\n className={classNames(\n \"lb-root lb-ai-chat-composer lb-ai-chat-composer-form\",\n className\n )}\n dir={$.dir}\n {...props}\n disabled={disabled}\n ref={forwardedRef}\n onComposerSubmit={handleComposerSubmit}\n >\n <div className=\"lb-ai-chat-composer-editor-container\">\n <ComposerPrimitive.Editor\n autoFocus={autoFocus}\n className=\"lb-ai-chat-composer-editor\"\n placeholder={$.AI_CHAT_COMPOSER_PLACEHOLDER}\n defaultValue={defaultValue}\n />\n\n <div className=\"lb-ai-chat-composer-footer\">\n <div className=\"lb-ai-chat-composer-editor-actions\">\n {/* No actions for now but it makes sense to keep the DOM structure */}\n </div>\n\n <div className=\"lb-ai-chat-composer-actions\">\n {abortableMessageId === undefined ? (\n <ShortcutTooltip\n content={$.AI_CHAT_COMPOSER_SEND}\n shortcut=\"Enter\"\n >\n <ComposerPrimitive.Submit asChild>\n <Button\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => event.stopPropagation()}\n className=\"lb-ai-chat-composer-action\"\n variant=\"primary\"\n aria-label={$.AI_CHAT_COMPOSER_SEND}\n icon={<SendIcon />}\n />\n </ComposerPrimitive.Submit>\n </ShortcutTooltip>\n ) : (\n <ShortcutTooltip content={$.AI_CHAT_COMPOSER_ABORT}>\n <Button\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => {\n event.stopPropagation();\n client[kInternal].ai.abort(abortableMessageId);\n }}\n className=\"lb-ai-chat-composer-action\"\n variant=\"secondary\"\n aria-label={$.AI_CHAT_COMPOSER_ABORT}\n icon={<StopIcon />}\n />\n </ShortcutTooltip>\n )}\n </div>\n </div>\n </div>\n </ComposerPrimitive.Form>\n </TooltipProvider>\n );\n }\n);\n"],"names":["ComposerPrimitive.Form","ComposerPrimitive.Editor","ComposerPrimitive.Submit"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiChatComposer.js","sources":["../../../src/components/internal/AiChatComposer.tsx"],"sourcesContent":["import type {\n AiChatMessage,\n CopilotId,\n MessageId,\n WithNavigation,\n} from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\nimport {\n type ComponentProps,\n type FormEvent,\n forwardRef,\n useCallback,\n} from \"react\";\n\nimport { SendIcon } from \"../../icons/Send\";\nimport { StopIcon } from \"../../icons/Stop\";\nimport {\n type AiChatComposerOverrides,\n type GlobalOverrides,\n useOverrides,\n} from \"../../overrides\";\nimport * as ComposerPrimitive from \"../../primitives/AiChatComposer\";\nimport { classNames } from \"../../utils/class-names\";\nimport { Button } from \"./Button\";\nimport { ShortcutTooltip, TooltipProvider } from \"./Tooltip\";\n\ntype UiChatMessage = WithNavigation<AiChatMessage>;\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatComposer\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatComposerProps extends ComponentProps<\"form\"> {\n /**\n * The composer's initial value.\n */\n defaultValue?: string;\n /**\n * The event handler called when a chat message is submitted.\n */\n onComposerSubmit?: (\n message: {\n /**\n * The submitted message text.\n */\n text: string;\n },\n event: FormEvent<HTMLFormElement>\n ) => void;\n\n /**\n * @internal\n * The event handler called when a user chat message is created optimistically.\n */\n onUserMessageCreate?: (message: {\n /**\n * The created user message id.\n */\n id: MessageId;\n }) => void;\n /**\n * Whether the composer is disabled.\n */\n disabled?: boolean;\n /**\n * Whether to focus the editor on mount.\n */\n autoFocus?: boolean;\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatComposerOverrides>;\n /**\n * The id of the chat the composer belongs to.\n */\n chatId: string;\n /**\n * The id of the copilot to use to send the message.\n */\n copilotId?: CopilotId;\n /**\n * @internal\n */\n branchId?: MessageId;\n /**\n * @internal\n */\n stream?: boolean;\n}\n\nexport const AiChatComposer = forwardRef<HTMLFormElement, AiChatComposerProps>(\n (\n {\n defaultValue,\n onComposerSubmit,\n disabled,\n autoFocus,\n overrides,\n className,\n chatId,\n branchId,\n copilotId,\n stream = true,\n onUserMessageCreate,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n const client = useClient();\n\n const getLastMessageId = useCallback((messages: UiChatMessage[]) => {\n const lastMessage = messages[messages.length - 1];\n if (lastMessage === undefined) return null;\n return lastMessage.id;\n }, []);\n\n const getAbortableMessageId = useCallback((messages: UiChatMessage[]) => {\n return messages.find(\n (m) =>\n m.role === \"assistant\" &&\n (m.status === \"generating\" || m.status === \"awaiting-tool\")\n )?.id;\n }, []);\n\n const messagesΣ = client[kInternal].ai.signals.getChatMessagesForBranchΣ(\n chatId,\n branchId\n );\n\n const abortableMessageId = useSignal(messagesΣ, getAbortableMessageId);\n const lastMessageId = useSignal(messagesΣ, getLastMessageId);\n\n const handleComposerSubmit = useCallback(\n (message: { text: string }, event: FormEvent<HTMLFormElement>) => {\n if (abortableMessageId !== undefined) {\n event.preventDefault();\n return;\n }\n\n onComposerSubmit?.(message, event);\n if (event.isDefaultPrevented()) return;\n\n const content = [{ type: \"text\" as const, text: message.text }];\n const newMessageId = client[kInternal].ai[\n kInternal\n ].context.messagesStore.createOptimistically(\n chatId,\n \"user\",\n lastMessageId,\n content\n );\n onUserMessageCreate?.({ id: newMessageId });\n\n const targetMessageId = client[kInternal].ai[\n kInternal\n ].context.messagesStore.createOptimistically(\n chatId,\n \"assistant\",\n newMessageId\n );\n\n client[kInternal].ai.askUserMessageInChat(\n chatId,\n { id: newMessageId, parentMessageId: lastMessageId, content },\n targetMessageId,\n {\n stream,\n copilotId,\n }\n );\n },\n [\n onComposerSubmit,\n onUserMessageCreate,\n client,\n chatId,\n lastMessageId,\n abortableMessageId,\n stream,\n copilotId,\n ]\n );\n\n return (\n <TooltipProvider>\n <ComposerPrimitive.Form\n className={classNames(\n \"lb-root lb-ai-chat-composer lb-ai-chat-composer-form\",\n className\n )}\n dir={$.dir}\n {...props}\n disabled={disabled}\n ref={forwardedRef}\n onComposerSubmit={handleComposerSubmit}\n >\n <div className=\"lb-ai-chat-composer-editor-container\">\n <ComposerPrimitive.Editor\n autoFocus={autoFocus}\n className=\"lb-ai-chat-composer-editor\"\n placeholder={$.AI_CHAT_COMPOSER_PLACEHOLDER}\n defaultValue={defaultValue}\n />\n\n <div className=\"lb-ai-chat-composer-footer\">\n <div className=\"lb-ai-chat-composer-editor-actions\">\n {/* No actions for now but it makes sense to keep the DOM structure */}\n </div>\n\n <div className=\"lb-ai-chat-composer-actions\">\n {abortableMessageId === undefined ? (\n <ShortcutTooltip\n content={$.AI_CHAT_COMPOSER_SEND}\n shortcut=\"Enter\"\n >\n <ComposerPrimitive.Submit asChild>\n <Button\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => event.stopPropagation()}\n className=\"lb-ai-chat-composer-action\"\n variant=\"primary\"\n aria-label={$.AI_CHAT_COMPOSER_SEND}\n icon={<SendIcon />}\n />\n </ComposerPrimitive.Submit>\n </ShortcutTooltip>\n ) : (\n <ShortcutTooltip content={$.AI_CHAT_COMPOSER_ABORT}>\n <Button\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => {\n event.stopPropagation();\n client[kInternal].ai.abort(abortableMessageId);\n }}\n className=\"lb-ai-chat-composer-action\"\n variant=\"secondary\"\n aria-label={$.AI_CHAT_COMPOSER_ABORT}\n icon={<StopIcon />}\n />\n </ShortcutTooltip>\n )}\n </div>\n </div>\n </div>\n </ComposerPrimitive.Form>\n </TooltipProvider>\n );\n }\n);\n"],"names":["ComposerPrimitive.Form","ComposerPrimitive.Editor","ComposerPrimitive.Submit"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiChatUserMessage.cjs","sources":["../../../src/components/internal/AiChatUserMessage.tsx"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"AiChatUserMessage.cjs","sources":["../../../src/components/internal/AiChatUserMessage.tsx"],"sourcesContent":["import type {\n AiTextPart,\n AiUserMessage,\n WithNavigation,\n} from \"@liveblocks/core\";\nimport type { ComponentProps } from \"react\";\nimport { forwardRef, memo } from \"react\";\n\nimport { AiMessage } from \"../../_private\";\nimport { type GlobalOverrides, useOverrides } from \"../../overrides\";\nimport { classNames } from \"../../utils/class-names\";\n\ntype UiUserMessage = WithNavigation<AiUserMessage>;\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatUserMessage\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatUserMessageProps extends ComponentProps<\"div\"> {\n /**\n * The message to display.\n */\n message: UiUserMessage;\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides>;\n}\n\ntype PlainTextPartProps = {\n part: AiTextPart;\n};\n\nfunction PlainTextPart({ part }: PlainTextPartProps) {\n return <p>{part.text}</p>;\n}\n\nexport const AiChatUserMessage = memo(\n forwardRef<HTMLDivElement, AiChatUserMessageProps>(\n ({ message, className, overrides }, forwardedRef) => {\n const $ = useOverrides(overrides);\n return (\n <div\n ref={forwardedRef}\n className={classNames(\n \"lb-ai-chat-message lb-ai-chat-user-message\",\n className\n )}\n >\n {message.deletedAt !== undefined ? (\n <div className=\"lb-ai-chat-message-deleted\">\n {$.AI_CHAT_MESSAGE_DELETED}\n </div>\n ) : (\n <div className=\"lb-ai-chat-message-content\">\n <AiMessage.Content\n message={message}\n components={{\n TextPart: PlainTextPart,\n }}\n className=\"lb-prose lb-ai-chat-message-text\"\n />\n </div>\n )}\n </div>\n );\n }\n )\n);\n"],"names":["jsx","memo","forwardRef","overrides","useOverrides","classNames","AiMessage.Content"],"mappings":";;;;;;;;;AAgCA,SAAS,aAAA,CAAc,EAAE,IAAA,EAA4B,EAAA;AACnD,EAAA,uBAAQA,cAAA,CAAA,GAAA,EAAA;AAAA,IAAG,QAAK,EAAA,IAAA,CAAA,IAAA;AAAA,GAAK,CAAA,CAAA;AACvB,CAAA;AAEO,MAAM,iBAAoB,GAAAC,UAAA;AAAA,EAC/BC,gBAAA;AAAA,IACE,CAAC,EAAE,OAAA,EAAS,SAAW,aAAAC,WAAA,IAAa,YAAiB,KAAA;AACnD,MAAM,MAAA,CAAA,GAAIC,uBAAaD,WAAS,CAAA,CAAA;AAChC,MAAA,uBACGH,cAAA,CAAA,KAAA,EAAA;AAAA,QACC,GAAK,EAAA,YAAA;AAAA,QACL,SAAW,EAAAK,qBAAA;AAAA,UACT,4CAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA,OAAA,CAAQ,SAAc,KAAA,KAAA,CAAA,mBACpBL,cAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACZ,QAAE,EAAA,CAAA,CAAA,uBAAA;AAAA,SACL,oBAECA,cAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACb,QAAA,kBAAAA,cAAA,CAACM,aAAA,EAAA;AAAA,YACC,OAAA;AAAA,YACA,UAAY,EAAA;AAAA,cACV,QAAU,EAAA,aAAA;AAAA,aACZ;AAAA,YACA,SAAU,EAAA,kCAAA;AAAA,WACZ,CAAA;AAAA,SACF,CAAA;AAAA,OAEJ,CAAA,CAAA;AAAA,KAEJ;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiChatUserMessage.js","sources":["../../../src/components/internal/AiChatUserMessage.tsx"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"AiChatUserMessage.js","sources":["../../../src/components/internal/AiChatUserMessage.tsx"],"sourcesContent":["import type {\n AiTextPart,\n AiUserMessage,\n WithNavigation,\n} from \"@liveblocks/core\";\nimport type { ComponentProps } from \"react\";\nimport { forwardRef, memo } from \"react\";\n\nimport { AiMessage } from \"../../_private\";\nimport { type GlobalOverrides, useOverrides } from \"../../overrides\";\nimport { classNames } from \"../../utils/class-names\";\n\ntype UiUserMessage = WithNavigation<AiUserMessage>;\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatUserMessage\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatUserMessageProps extends ComponentProps<\"div\"> {\n /**\n * The message to display.\n */\n message: UiUserMessage;\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides>;\n}\n\ntype PlainTextPartProps = {\n part: AiTextPart;\n};\n\nfunction PlainTextPart({ part }: PlainTextPartProps) {\n return <p>{part.text}</p>;\n}\n\nexport const AiChatUserMessage = memo(\n forwardRef<HTMLDivElement, AiChatUserMessageProps>(\n ({ message, className, overrides }, forwardedRef) => {\n const $ = useOverrides(overrides);\n return (\n <div\n ref={forwardedRef}\n className={classNames(\n \"lb-ai-chat-message lb-ai-chat-user-message\",\n className\n )}\n >\n {message.deletedAt !== undefined ? (\n <div className=\"lb-ai-chat-message-deleted\">\n {$.AI_CHAT_MESSAGE_DELETED}\n </div>\n ) : (\n <div className=\"lb-ai-chat-message-content\">\n <AiMessage.Content\n message={message}\n components={{\n TextPart: PlainTextPart,\n }}\n className=\"lb-prose lb-ai-chat-message-text\"\n />\n </div>\n )}\n </div>\n );\n }\n )\n);\n"],"names":["AiMessage.Content"],"mappings":";;;;;;;AAgCA,SAAS,aAAA,CAAc,EAAE,IAAA,EAA4B,EAAA;AACnD,EAAA,uBAAQ,GAAA,CAAA,GAAA,EAAA;AAAA,IAAG,QAAK,EAAA,IAAA,CAAA,IAAA;AAAA,GAAK,CAAA,CAAA;AACvB,CAAA;AAEO,MAAM,iBAAoB,GAAA,IAAA;AAAA,EAC/B,UAAA;AAAA,IACE,CAAC,EAAE,OAAA,EAAS,SAAW,EAAA,SAAA,IAAa,YAAiB,KAAA;AACnD,MAAM,MAAA,CAAA,GAAI,aAAa,SAAS,CAAA,CAAA;AAChC,MAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,QACC,GAAK,EAAA,YAAA;AAAA,QACL,SAAW,EAAA,UAAA;AAAA,UACT,4CAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA,OAAA,CAAQ,SAAc,KAAA,KAAA,CAAA,mBACpB,GAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACZ,QAAE,EAAA,CAAA,CAAA,uBAAA;AAAA,SACL,oBAEC,GAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACb,QAAA,kBAAA,GAAA,CAACA,gBAAA,EAAA;AAAA,YACC,OAAA;AAAA,YACA,UAAY,EAAA;AAAA,cACV,QAAU,EAAA,aAAA;AAAA,aACZ;AAAA,YACA,SAAU,EAAA,kCAAA;AAAA,WACZ,CAAA;AAAA,SACF,CAAA;AAAA,OAEJ,CAAA,CAAA;AAAA,KAEJ;AAAA,GACF;AACF;;;;"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
require('../../icons/index.cjs');
|
|
6
|
+
var overrides = require('../../overrides.cjs');
|
|
6
7
|
var Button = require('./Button.cjs');
|
|
7
8
|
var Tooltip = require('./Tooltip.cjs');
|
|
8
9
|
var TooltipPrimitive = require('@radix-ui/react-tooltip');
|
|
@@ -10,7 +11,8 @@ var Check = require('../../icons/Check.cjs');
|
|
|
10
11
|
var Copy = require('../../icons/Copy.cjs');
|
|
11
12
|
|
|
12
13
|
const COPY_DELAY = 1500;
|
|
13
|
-
function CodeBlock({ title, code }) {
|
|
14
|
+
function CodeBlock({ title, code, overrides: overrides$1 }) {
|
|
15
|
+
const $ = overrides.useOverrides(overrides$1);
|
|
14
16
|
const [isCopied, setCopied] = react.useState(false);
|
|
15
17
|
const timeoutRef = react.useRef(null);
|
|
16
18
|
react.useEffect(() => {
|
|
@@ -47,11 +49,12 @@ function CodeBlock({ title, code }) {
|
|
|
47
49
|
/* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
48
50
|
className: "lb-code-block-header-actions",
|
|
49
51
|
children: /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, {
|
|
50
|
-
content: isCopied ? null :
|
|
52
|
+
content: isCopied ? null : $.COPY_TO_CLIPBOARD,
|
|
51
53
|
children: /* @__PURE__ */ jsxRuntime.jsx(Button.Button, {
|
|
52
54
|
className: "lb-code-block-header-action",
|
|
53
55
|
icon: isCopied ? /* @__PURE__ */ jsxRuntime.jsx(Check.CheckIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(Copy.CopyIcon, {}),
|
|
54
|
-
onClick: handleCopy
|
|
56
|
+
onClick: handleCopy,
|
|
57
|
+
"aria-label": $.COPY_TO_CLIPBOARD
|
|
55
58
|
})
|
|
56
59
|
})
|
|
57
60
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeBlock.cjs","sources":["../../../src/components/internal/CodeBlock.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { CheckIcon, CopyIcon } from \"../../icons\";\nimport { Button } from \"./Button\";\nimport { Tooltip, TooltipProvider } from \"./Tooltip\";\n\nconst COPY_DELAY = 1500;\n\ninterface CodeBlockProps extends Omit<ComponentProps<\"div\">, \"title\"> {\n title: string;\n code: string;\n}\n\nexport function CodeBlock({ title, code }: CodeBlockProps) {\n const [isCopied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (isCopied) {\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, COPY_DELAY);\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isCopied]);\n\n const handleCopy = useCallback(() => {\n try {\n navigator.clipboard.writeText(code);\n setCopied(true);\n } catch (error) {\n console.error(error);\n }\n }, [code]);\n\n return (\n <TooltipProvider>\n <div className=\"lb-code-block\">\n <div className=\"lb-code-block-header\">\n <span className=\"lb-code-block-title\">{title}</span>\n <div className=\"lb-code-block-header-actions\">\n <Tooltip content={isCopied ? null :
|
|
1
|
+
{"version":3,"file":"CodeBlock.cjs","sources":["../../../src/components/internal/CodeBlock.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { CheckIcon, CopyIcon } from \"../../icons\";\nimport type { GlobalOverrides } from \"../../overrides\";\nimport { useOverrides } from \"../../overrides\";\nimport { Button } from \"./Button\";\nimport { Tooltip, TooltipProvider } from \"./Tooltip\";\n\nconst COPY_DELAY = 1500;\n\ninterface CodeBlockProps extends Omit<ComponentProps<\"div\">, \"title\"> {\n title: string;\n code: string;\n overrides?: Partial<GlobalOverrides>;\n}\n\nexport function CodeBlock({ title, code, overrides }: CodeBlockProps) {\n const $ = useOverrides(overrides);\n const [isCopied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (isCopied) {\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, COPY_DELAY);\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isCopied]);\n\n const handleCopy = useCallback(() => {\n try {\n navigator.clipboard.writeText(code);\n setCopied(true);\n } catch (error) {\n console.error(error);\n }\n }, [code]);\n\n return (\n <TooltipProvider>\n <div className=\"lb-code-block\">\n <div className=\"lb-code-block-header\">\n <span className=\"lb-code-block-title\">{title}</span>\n <div className=\"lb-code-block-header-actions\">\n <Tooltip content={isCopied ? null : $.COPY_TO_CLIPBOARD}>\n <Button\n className=\"lb-code-block-header-action\"\n icon={isCopied ? <CheckIcon /> : <CopyIcon />}\n onClick={handleCopy}\n aria-label={$.COPY_TO_CLIPBOARD}\n />\n </Tooltip>\n </div>\n </div>\n <pre className=\"lb-code-block-content\">\n <code>{code}</code>\n </pre>\n </div>\n </TooltipProvider>\n );\n}\n"],"names":["overrides","useOverrides","useState","useRef","useEffect","useCallback","jsx","TooltipProvider","jsxs","Tooltip","Button","CheckIcon","CopyIcon"],"mappings":";;;;;;;;;;;;AASA,MAAM,UAAa,GAAA,IAAA,CAAA;AAQZ,SAAS,SAAU,CAAA,EAAE,KAAO,EAAA,IAAA,aAAMA,aAA6B,EAAA;AACpE,EAAM,MAAA,CAAA,GAAIC,uBAAaD,WAAS,CAAA,CAAA;AAChC,EAAA,MAAM,CAAC,QAAA,EAAU,SAAS,CAAA,GAAIE,eAAS,KAAK,CAAA,CAAA;AAC5C,EAAM,MAAA,UAAA,GAAaC,aAA6C,IAAI,CAAA,CAAA;AAEpE,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAW,UAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AACpC,QAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,SACd,UAAU,CAAA,CAAA;AAAA,KACf;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,WAAW,OAAS,EAAA;AACtB,QAAA,YAAA,CAAa,WAAW,OAAO,CAAA,CAAA;AAAA,OACjC;AAAA,KACF,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAM,MAAA,UAAA,GAAaC,kBAAY,MAAM;AACnC,IAAI,IAAA;AACF,MAAU,SAAA,CAAA,SAAA,CAAU,UAAU,IAAI,CAAA,CAAA;AAClC,MAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AAAA,aACP,KAAP,EAAA;AACA,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AAAA,KACrB;AAAA,GACF,EAAG,CAAC,IAAI,CAAC,CAAA,CAAA;AAET,EAAA,uBACGC,cAAA,CAAAC,gCAAA,EAAA;AAAA,IACC,QAAC,kBAAAC,eAAA,CAAA,KAAA,EAAA;AAAA,MAAI,SAAU,EAAA,eAAA;AAAA,MACb,QAAA,EAAA;AAAA,wBAACA,eAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,sBAAA;AAAA,UACb,QAAA,EAAA;AAAA,4BAACF,cAAA,CAAA,MAAA,EAAA;AAAA,cAAK,SAAU,EAAA,qBAAA;AAAA,cAAuB,QAAA,EAAA,KAAA;AAAA,aAAM,CAAA;AAAA,4BAC5CA,cAAA,CAAA,KAAA,EAAA;AAAA,cAAI,SAAU,EAAA,8BAAA;AAAA,cACb,QAAC,kBAAAA,cAAA,CAAAG,eAAA,EAAA;AAAA,gBAAQ,OAAA,EAAS,QAAW,GAAA,IAAA,GAAO,CAAE,CAAA,iBAAA;AAAA,gBACpC,QAAC,kBAAAH,cAAA,CAAAI,aAAA,EAAA;AAAA,kBACC,SAAU,EAAA,6BAAA;AAAA,kBACV,MAAM,QAAW,mBAAAJ,cAAA,CAACK,eAAU,EAAA,EAAA,CAAA,kCAAMC,aAAS,EAAA,EAAA,CAAA;AAAA,kBAC3C,OAAS,EAAA,UAAA;AAAA,kBACT,cAAY,CAAE,CAAA,iBAAA;AAAA,iBAChB,CAAA;AAAA,eACF,CAAA;AAAA,aACF,CAAA;AAAA,WAAA;AAAA,SACF,CAAA;AAAA,wBACCN,cAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,uBAAA;AAAA,UACb,QAAC,kBAAAA,cAAA,CAAA,MAAA,EAAA;AAAA,YAAM,QAAA,EAAA,IAAA;AAAA,WAAK,CAAA;AAAA,SACd,CAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
3
3
|
import '../../icons/index.js';
|
|
4
|
+
import { useOverrides } from '../../overrides.js';
|
|
4
5
|
import { Button } from './Button.js';
|
|
5
6
|
import { Tooltip } from './Tooltip.js';
|
|
6
7
|
import { TooltipProvider } from '@radix-ui/react-tooltip';
|
|
@@ -8,7 +9,8 @@ import { CheckIcon } from '../../icons/Check.js';
|
|
|
8
9
|
import { CopyIcon } from '../../icons/Copy.js';
|
|
9
10
|
|
|
10
11
|
const COPY_DELAY = 1500;
|
|
11
|
-
function CodeBlock({ title, code }) {
|
|
12
|
+
function CodeBlock({ title, code, overrides }) {
|
|
13
|
+
const $ = useOverrides(overrides);
|
|
12
14
|
const [isCopied, setCopied] = useState(false);
|
|
13
15
|
const timeoutRef = useRef(null);
|
|
14
16
|
useEffect(() => {
|
|
@@ -45,11 +47,12 @@ function CodeBlock({ title, code }) {
|
|
|
45
47
|
/* @__PURE__ */ jsx("div", {
|
|
46
48
|
className: "lb-code-block-header-actions",
|
|
47
49
|
children: /* @__PURE__ */ jsx(Tooltip, {
|
|
48
|
-
content: isCopied ? null :
|
|
50
|
+
content: isCopied ? null : $.COPY_TO_CLIPBOARD,
|
|
49
51
|
children: /* @__PURE__ */ jsx(Button, {
|
|
50
52
|
className: "lb-code-block-header-action",
|
|
51
53
|
icon: isCopied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {}),
|
|
52
|
-
onClick: handleCopy
|
|
54
|
+
onClick: handleCopy,
|
|
55
|
+
"aria-label": $.COPY_TO_CLIPBOARD
|
|
53
56
|
})
|
|
54
57
|
})
|
|
55
58
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeBlock.js","sources":["../../../src/components/internal/CodeBlock.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { CheckIcon, CopyIcon } from \"../../icons\";\nimport { Button } from \"./Button\";\nimport { Tooltip, TooltipProvider } from \"./Tooltip\";\n\nconst COPY_DELAY = 1500;\n\ninterface CodeBlockProps extends Omit<ComponentProps<\"div\">, \"title\"> {\n title: string;\n code: string;\n}\n\nexport function CodeBlock({ title, code }: CodeBlockProps) {\n const [isCopied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (isCopied) {\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, COPY_DELAY);\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isCopied]);\n\n const handleCopy = useCallback(() => {\n try {\n navigator.clipboard.writeText(code);\n setCopied(true);\n } catch (error) {\n console.error(error);\n }\n }, [code]);\n\n return (\n <TooltipProvider>\n <div className=\"lb-code-block\">\n <div className=\"lb-code-block-header\">\n <span className=\"lb-code-block-title\">{title}</span>\n <div className=\"lb-code-block-header-actions\">\n <Tooltip content={isCopied ? null :
|
|
1
|
+
{"version":3,"file":"CodeBlock.js","sources":["../../../src/components/internal/CodeBlock.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { CheckIcon, CopyIcon } from \"../../icons\";\nimport type { GlobalOverrides } from \"../../overrides\";\nimport { useOverrides } from \"../../overrides\";\nimport { Button } from \"./Button\";\nimport { Tooltip, TooltipProvider } from \"./Tooltip\";\n\nconst COPY_DELAY = 1500;\n\ninterface CodeBlockProps extends Omit<ComponentProps<\"div\">, \"title\"> {\n title: string;\n code: string;\n overrides?: Partial<GlobalOverrides>;\n}\n\nexport function CodeBlock({ title, code, overrides }: CodeBlockProps) {\n const $ = useOverrides(overrides);\n const [isCopied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (isCopied) {\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, COPY_DELAY);\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isCopied]);\n\n const handleCopy = useCallback(() => {\n try {\n navigator.clipboard.writeText(code);\n setCopied(true);\n } catch (error) {\n console.error(error);\n }\n }, [code]);\n\n return (\n <TooltipProvider>\n <div className=\"lb-code-block\">\n <div className=\"lb-code-block-header\">\n <span className=\"lb-code-block-title\">{title}</span>\n <div className=\"lb-code-block-header-actions\">\n <Tooltip content={isCopied ? null : $.COPY_TO_CLIPBOARD}>\n <Button\n className=\"lb-code-block-header-action\"\n icon={isCopied ? <CheckIcon /> : <CopyIcon />}\n onClick={handleCopy}\n aria-label={$.COPY_TO_CLIPBOARD}\n />\n </Tooltip>\n </div>\n </div>\n <pre className=\"lb-code-block-content\">\n <code>{code}</code>\n </pre>\n </div>\n </TooltipProvider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AASA,MAAM,UAAa,GAAA,IAAA,CAAA;AAQZ,SAAS,SAAU,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,WAA6B,EAAA;AACpE,EAAM,MAAA,CAAA,GAAI,aAAa,SAAS,CAAA,CAAA;AAChC,EAAA,MAAM,CAAC,QAAA,EAAU,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAC5C,EAAM,MAAA,UAAA,GAAa,OAA6C,IAAI,CAAA,CAAA;AAEpE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAW,UAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AACpC,QAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,SACd,UAAU,CAAA,CAAA;AAAA,KACf;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,WAAW,OAAS,EAAA;AACtB,QAAA,YAAA,CAAa,WAAW,OAAO,CAAA,CAAA;AAAA,OACjC;AAAA,KACF,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAM,MAAA,UAAA,GAAa,YAAY,MAAM;AACnC,IAAI,IAAA;AACF,MAAU,SAAA,CAAA,SAAA,CAAU,UAAU,IAAI,CAAA,CAAA;AAClC,MAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AAAA,aACP,KAAP,EAAA;AACA,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AAAA,KACrB;AAAA,GACF,EAAG,CAAC,IAAI,CAAC,CAAA,CAAA;AAET,EAAA,uBACG,GAAA,CAAA,eAAA,EAAA;AAAA,IACC,QAAC,kBAAA,IAAA,CAAA,KAAA,EAAA;AAAA,MAAI,SAAU,EAAA,eAAA;AAAA,MACb,QAAA,EAAA;AAAA,wBAAC,IAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,sBAAA;AAAA,UACb,QAAA,EAAA;AAAA,4BAAC,GAAA,CAAA,MAAA,EAAA;AAAA,cAAK,SAAU,EAAA,qBAAA;AAAA,cAAuB,QAAA,EAAA,KAAA;AAAA,aAAM,CAAA;AAAA,4BAC5C,GAAA,CAAA,KAAA,EAAA;AAAA,cAAI,SAAU,EAAA,8BAAA;AAAA,cACb,QAAC,kBAAA,GAAA,CAAA,OAAA,EAAA;AAAA,gBAAQ,OAAA,EAAS,QAAW,GAAA,IAAA,GAAO,CAAE,CAAA,iBAAA;AAAA,gBACpC,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA;AAAA,kBACC,SAAU,EAAA,6BAAA;AAAA,kBACV,MAAM,QAAW,mBAAA,GAAA,CAAC,SAAU,EAAA,EAAA,CAAA,uBAAM,QAAS,EAAA,EAAA,CAAA;AAAA,kBAC3C,OAAS,EAAA,UAAA;AAAA,kBACT,cAAY,CAAE,CAAA,iBAAA;AAAA,iBAChB,CAAA;AAAA,eACF,CAAA;AAAA,aACF,CAAA;AAAA,WAAA;AAAA,SACF,CAAA;AAAA,wBACC,GAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,uBAAA;AAAA,UACb,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA;AAAA,YAAM,QAAA,EAAA,IAAA;AAAA,WAAK,CAAA;AAAA,SACd,CAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA,CAAA;AAEJ;;;;"}
|
package/dist/index.d.cts
CHANGED
|
@@ -54,6 +54,7 @@ interface GlobalOverrides {
|
|
|
54
54
|
EMOJI_PICKER_CHANGE_SKIN_TONE: string;
|
|
55
55
|
ATTACHMENT_TOO_LARGE: (maxSize?: string) => string;
|
|
56
56
|
ATTACHMENT_ERROR: (error: Error) => string;
|
|
57
|
+
COPY_TO_CLIPBOARD: string;
|
|
57
58
|
}
|
|
58
59
|
interface CommentOverrides {
|
|
59
60
|
COMMENT_EDITED: ReactNode;
|
|
@@ -78,6 +79,10 @@ interface ComposerOverrides {
|
|
|
78
79
|
COMPOSER_SEND: string;
|
|
79
80
|
COMPOSER_TOGGLE_MARK: (mark: ComposerBodyMark) => string;
|
|
80
81
|
}
|
|
82
|
+
interface AiToolConfirmationOverrides {
|
|
83
|
+
AI_TOOL_CONFIRMATION_CONFIRM: string;
|
|
84
|
+
AI_TOOL_CONFIRMATION_CANCEL: string;
|
|
85
|
+
}
|
|
81
86
|
interface AiChatComposerOverrides {
|
|
82
87
|
AI_CHAT_COMPOSER_PLACEHOLDER: string;
|
|
83
88
|
AI_CHAT_COMPOSER_SEND: string;
|
|
@@ -86,6 +91,7 @@ interface AiChatComposerOverrides {
|
|
|
86
91
|
interface AiChatMessageOverrides {
|
|
87
92
|
AI_CHAT_MESSAGE_DELETED: string;
|
|
88
93
|
AI_CHAT_MESSAGE_THINKING: string;
|
|
94
|
+
AI_CHAT_MESSAGE_REASONING: (isStreaming: boolean) => string;
|
|
89
95
|
}
|
|
90
96
|
interface AiChatOverrides {
|
|
91
97
|
AI_CHAT_MESSAGES_ERROR: (error: Error) => ReactNode;
|
|
@@ -114,7 +120,7 @@ interface HistoryVersionPreviewOverrides {
|
|
|
114
120
|
HISTORY_VERSION_PREVIEW_EMPTY: ReactNode;
|
|
115
121
|
HISTORY_VERSION_PREVIEW_ERROR: (error: Error) => ReactNode;
|
|
116
122
|
}
|
|
117
|
-
type Overrides = LocalizationOverrides & GlobalOverrides & ComposerOverrides & CommentOverrides & ThreadOverrides & InboxNotificationOverrides & HistoryVersionPreviewOverrides & AiChatComposerOverrides & AiChatMessageOverrides & AiChatOverrides;
|
|
123
|
+
type Overrides = LocalizationOverrides & GlobalOverrides & ComposerOverrides & CommentOverrides & ThreadOverrides & InboxNotificationOverrides & HistoryVersionPreviewOverrides & AiChatComposerOverrides & AiChatMessageOverrides & AiChatOverrides & AiToolConfirmationOverrides;
|
|
118
124
|
declare function useOverrides(overrides?: Partial<Overrides>): Overrides;
|
|
119
125
|
|
|
120
126
|
type AiChatComponentsEmptyProps = {
|
|
@@ -192,6 +198,17 @@ interface AiToolProps extends Omit<ComponentProps<"div">, "title" | "children">
|
|
|
192
198
|
* The content shown in the tool.
|
|
193
199
|
*/
|
|
194
200
|
children?: ReactNode;
|
|
201
|
+
/**
|
|
202
|
+
* Whether the content is currently collapsed.
|
|
203
|
+
* It is not a traditional controlled value, as in if you set it to `true` it would only stay expanded.
|
|
204
|
+
* Instead, it is "semi-controlled", meaning that setting it to `true` will expand it, but it
|
|
205
|
+
* can still be collapsed/expanded by clicking on it.
|
|
206
|
+
*/
|
|
207
|
+
collapsed?: boolean;
|
|
208
|
+
/**
|
|
209
|
+
* The event handler called when the content is collapsed or expanded by clicking on it.
|
|
210
|
+
*/
|
|
211
|
+
onCollapsedChange?: (collapsed: boolean) => void;
|
|
195
212
|
}
|
|
196
213
|
type AiToolIconProps = ComponentProps<"div">;
|
|
197
214
|
type AiToolInspectorProps = ComponentProps<"div">;
|
|
@@ -206,10 +223,11 @@ interface AiToolConfirmationProps<A extends JsonObject, R extends ToolResultData
|
|
|
206
223
|
confirm: AiToolExecuteCallback<A, R>;
|
|
207
224
|
cancel: AiToolExecuteCallback<A, R>;
|
|
208
225
|
variant?: "default" | "destructive";
|
|
226
|
+
overrides?: Partial<GlobalOverrides & AiToolConfirmationOverrides>;
|
|
209
227
|
}
|
|
210
228
|
declare function AiToolIcon({ className, ...props }: AiToolIconProps): react_jsx_runtime.JSX.Element;
|
|
211
229
|
declare function AiToolInspector({ className, ...props }: AiToolInspectorProps): react_jsx_runtime.JSX.Element;
|
|
212
|
-
declare function AiToolConfirmation<TPack extends AiToolTypePack, A extends JsonObject = TPack["A"], R extends ToolResultData = TPack["R"]>({ children, variant, confirm, cancel, className, ...props }: AiToolConfirmationProps<A, R>): react_jsx_runtime.JSX.Element | null;
|
|
230
|
+
declare function AiToolConfirmation<TPack extends AiToolTypePack, A extends JsonObject = TPack["A"], R extends ToolResultData = TPack["R"]>({ children, variant, confirm, cancel, overrides, className, ...props }: AiToolConfirmationProps<A, R>): react_jsx_runtime.JSX.Element | null;
|
|
213
231
|
declare const AiTool: react.ForwardRefExoticComponent<Omit<AiToolProps, "ref"> & react.RefAttributes<HTMLDivElement>> & {
|
|
214
232
|
Icon: typeof AiToolIcon;
|
|
215
233
|
Inspector: typeof AiToolInspector;
|
package/dist/index.d.ts
CHANGED
|
@@ -54,6 +54,7 @@ interface GlobalOverrides {
|
|
|
54
54
|
EMOJI_PICKER_CHANGE_SKIN_TONE: string;
|
|
55
55
|
ATTACHMENT_TOO_LARGE: (maxSize?: string) => string;
|
|
56
56
|
ATTACHMENT_ERROR: (error: Error) => string;
|
|
57
|
+
COPY_TO_CLIPBOARD: string;
|
|
57
58
|
}
|
|
58
59
|
interface CommentOverrides {
|
|
59
60
|
COMMENT_EDITED: ReactNode;
|
|
@@ -78,6 +79,10 @@ interface ComposerOverrides {
|
|
|
78
79
|
COMPOSER_SEND: string;
|
|
79
80
|
COMPOSER_TOGGLE_MARK: (mark: ComposerBodyMark) => string;
|
|
80
81
|
}
|
|
82
|
+
interface AiToolConfirmationOverrides {
|
|
83
|
+
AI_TOOL_CONFIRMATION_CONFIRM: string;
|
|
84
|
+
AI_TOOL_CONFIRMATION_CANCEL: string;
|
|
85
|
+
}
|
|
81
86
|
interface AiChatComposerOverrides {
|
|
82
87
|
AI_CHAT_COMPOSER_PLACEHOLDER: string;
|
|
83
88
|
AI_CHAT_COMPOSER_SEND: string;
|
|
@@ -86,6 +91,7 @@ interface AiChatComposerOverrides {
|
|
|
86
91
|
interface AiChatMessageOverrides {
|
|
87
92
|
AI_CHAT_MESSAGE_DELETED: string;
|
|
88
93
|
AI_CHAT_MESSAGE_THINKING: string;
|
|
94
|
+
AI_CHAT_MESSAGE_REASONING: (isStreaming: boolean) => string;
|
|
89
95
|
}
|
|
90
96
|
interface AiChatOverrides {
|
|
91
97
|
AI_CHAT_MESSAGES_ERROR: (error: Error) => ReactNode;
|
|
@@ -114,7 +120,7 @@ interface HistoryVersionPreviewOverrides {
|
|
|
114
120
|
HISTORY_VERSION_PREVIEW_EMPTY: ReactNode;
|
|
115
121
|
HISTORY_VERSION_PREVIEW_ERROR: (error: Error) => ReactNode;
|
|
116
122
|
}
|
|
117
|
-
type Overrides = LocalizationOverrides & GlobalOverrides & ComposerOverrides & CommentOverrides & ThreadOverrides & InboxNotificationOverrides & HistoryVersionPreviewOverrides & AiChatComposerOverrides & AiChatMessageOverrides & AiChatOverrides;
|
|
123
|
+
type Overrides = LocalizationOverrides & GlobalOverrides & ComposerOverrides & CommentOverrides & ThreadOverrides & InboxNotificationOverrides & HistoryVersionPreviewOverrides & AiChatComposerOverrides & AiChatMessageOverrides & AiChatOverrides & AiToolConfirmationOverrides;
|
|
118
124
|
declare function useOverrides(overrides?: Partial<Overrides>): Overrides;
|
|
119
125
|
|
|
120
126
|
type AiChatComponentsEmptyProps = {
|
|
@@ -192,6 +198,17 @@ interface AiToolProps extends Omit<ComponentProps<"div">, "title" | "children">
|
|
|
192
198
|
* The content shown in the tool.
|
|
193
199
|
*/
|
|
194
200
|
children?: ReactNode;
|
|
201
|
+
/**
|
|
202
|
+
* Whether the content is currently collapsed.
|
|
203
|
+
* It is not a traditional controlled value, as in if you set it to `true` it would only stay expanded.
|
|
204
|
+
* Instead, it is "semi-controlled", meaning that setting it to `true` will expand it, but it
|
|
205
|
+
* can still be collapsed/expanded by clicking on it.
|
|
206
|
+
*/
|
|
207
|
+
collapsed?: boolean;
|
|
208
|
+
/**
|
|
209
|
+
* The event handler called when the content is collapsed or expanded by clicking on it.
|
|
210
|
+
*/
|
|
211
|
+
onCollapsedChange?: (collapsed: boolean) => void;
|
|
195
212
|
}
|
|
196
213
|
type AiToolIconProps = ComponentProps<"div">;
|
|
197
214
|
type AiToolInspectorProps = ComponentProps<"div">;
|
|
@@ -206,10 +223,11 @@ interface AiToolConfirmationProps<A extends JsonObject, R extends ToolResultData
|
|
|
206
223
|
confirm: AiToolExecuteCallback<A, R>;
|
|
207
224
|
cancel: AiToolExecuteCallback<A, R>;
|
|
208
225
|
variant?: "default" | "destructive";
|
|
226
|
+
overrides?: Partial<GlobalOverrides & AiToolConfirmationOverrides>;
|
|
209
227
|
}
|
|
210
228
|
declare function AiToolIcon({ className, ...props }: AiToolIconProps): react_jsx_runtime.JSX.Element;
|
|
211
229
|
declare function AiToolInspector({ className, ...props }: AiToolInspectorProps): react_jsx_runtime.JSX.Element;
|
|
212
|
-
declare function AiToolConfirmation<TPack extends AiToolTypePack, A extends JsonObject = TPack["A"], R extends ToolResultData = TPack["R"]>({ children, variant, confirm, cancel, className, ...props }: AiToolConfirmationProps<A, R>): react_jsx_runtime.JSX.Element | null;
|
|
230
|
+
declare function AiToolConfirmation<TPack extends AiToolTypePack, A extends JsonObject = TPack["A"], R extends ToolResultData = TPack["R"]>({ children, variant, confirm, cancel, overrides, className, ...props }: AiToolConfirmationProps<A, R>): react_jsx_runtime.JSX.Element | null;
|
|
213
231
|
declare const AiTool: react.ForwardRefExoticComponent<Omit<AiToolProps, "ref"> & react.RefAttributes<HTMLDivElement>> & {
|
|
214
232
|
Icon: typeof AiToolIcon;
|
|
215
233
|
Inspector: typeof AiToolInspector;
|
package/dist/overrides.cjs
CHANGED
|
@@ -13,6 +13,7 @@ const defaultOverrides = {
|
|
|
13
13
|
dir: "ltr",
|
|
14
14
|
USER_SELF: "you",
|
|
15
15
|
USER_UNKNOWN: "Anonymous",
|
|
16
|
+
COPY_TO_CLIPBOARD: "Copy",
|
|
16
17
|
LIST_REMAINING: (count) => `${count} more`,
|
|
17
18
|
LIST_REMAINING_USERS: (count) => `${count} ${pluralize.pluralize(count, "other")}`,
|
|
18
19
|
LIST_REMAINING_COMMENTS: (count) => `${count} more ${pluralize.pluralize(count, "comment")}`,
|
|
@@ -125,7 +126,10 @@ const defaultOverrides = {
|
|
|
125
126
|
AI_CHAT_COMPOSER_ABORT: "Abort response",
|
|
126
127
|
AI_CHAT_MESSAGE_DELETED: "This message has been deleted.",
|
|
127
128
|
AI_CHAT_MESSAGE_THINKING: "Thinking\u2026",
|
|
128
|
-
|
|
129
|
+
AI_CHAT_MESSAGE_REASONING: (isStreaming) => isStreaming ? "Reasoning\u2026" : "Reasoning",
|
|
130
|
+
AI_CHAT_MESSAGES_ERROR: () => "There was an error while getting the messages.",
|
|
131
|
+
AI_TOOL_CONFIRMATION_CONFIRM: "Confirm",
|
|
132
|
+
AI_TOOL_CONFIRMATION_CANCEL: "Cancel"
|
|
129
133
|
};
|
|
130
134
|
const OverridesContext = react.createContext(void 0);
|
|
131
135
|
function useOverrides(overrides) {
|
package/dist/overrides.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overrides.cjs","sources":["../src/overrides.tsx"],"sourcesContent":["\"use client\";\n\nimport { assertNever } from \"@liveblocks/core\";\nimport type { PropsWithChildren, ReactNode } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nimport { Emoji } from \"./components/internal/Emoji\";\nimport type { ComposerBodyMark, Direction } from \"./types\";\nimport { pluralize } from \"./utils/pluralize\";\n\nexport interface LocalizationOverrides {\n locale: string;\n dir: Direction;\n}\n\nexport interface GlobalOverrides {\n USER_SELF: string;\n USER_UNKNOWN: string;\n LIST_REMAINING: (count: number) => string;\n LIST_REMAINING_USERS: (count: number) => string;\n LIST_REMAINING_COMMENTS: (count: number) => string;\n EMOJI_PICKER_SEARCH_PLACEHOLDER: string;\n EMOJI_PICKER_EMPTY: ReactNode;\n EMOJI_PICKER_ERROR: (error: Error) => ReactNode;\n EMOJI_PICKER_CHANGE_SKIN_TONE: string;\n ATTACHMENT_TOO_LARGE: (maxSize?: string) => string;\n ATTACHMENT_ERROR: (error: Error) => string;\n}\n\nexport interface CommentOverrides {\n COMMENT_EDITED: ReactNode;\n COMMENT_DELETED: ReactNode;\n COMMENT_MORE: string;\n COMMENT_EDIT: string;\n COMMENT_EDIT_COMPOSER_PLACEHOLDER: string;\n COMMENT_EDIT_COMPOSER_CANCEL: string;\n COMMENT_EDIT_COMPOSER_SAVE: string;\n COMMENT_DELETE: string;\n COMMENT_DELETE_ATTACHMENT: string;\n COMMENT_ADD_REACTION: string;\n COMMENT_REACTION_LIST: (\n list: ReactNode,\n emoji: string,\n count: number\n ) => ReactNode;\n COMMENT_REACTION_DESCRIPTION: (emoji: string, count: number) => string;\n}\n\nexport interface ComposerOverrides {\n COMPOSER_INSERT_MENTION: string;\n COMPOSER_INSERT_EMOJI: string;\n COMPOSER_ATTACH_FILES: string;\n COMPOSER_REMOVE_ATTACHMENT: string;\n COMPOSER_PLACEHOLDER: string;\n COMPOSER_SEND: string;\n COMPOSER_TOGGLE_MARK: (mark: ComposerBodyMark) => string;\n}\n\nexport interface AiChatComposerOverrides {\n AI_CHAT_COMPOSER_PLACEHOLDER: string;\n AI_CHAT_COMPOSER_SEND: string;\n AI_CHAT_COMPOSER_ABORT: string;\n}\n\nexport interface AiChatMessageOverrides {\n AI_CHAT_MESSAGE_DELETED: string;\n AI_CHAT_MESSAGE_THINKING: string;\n}\n\nexport interface AiChatOverrides {\n AI_CHAT_MESSAGES_ERROR: (error: Error) => ReactNode;\n}\n\nexport interface ThreadOverrides {\n THREAD_RESOLVE: string;\n THREAD_UNRESOLVE: string;\n THREAD_SUBSCRIBE: string;\n THREAD_UNSUBSCRIBE: string;\n THREAD_NEW_INDICATOR: string;\n THREAD_NEW_INDICATOR_DESCRIPTION: string;\n THREAD_COMPOSER_PLACEHOLDER: string;\n THREAD_COMPOSER_SEND: string;\n}\n\nexport interface InboxNotificationOverrides {\n INBOX_NOTIFICATION_MORE: string;\n INBOX_NOTIFICATION_MARK_AS_READ: string;\n INBOX_NOTIFICATION_DELETE: string;\n INBOX_NOTIFICATION_THREAD_COMMENTS_LIST: (\n list: ReactNode,\n room: ReactNode | undefined,\n count: number\n ) => ReactNode;\n INBOX_NOTIFICATION_THREAD_MENTION: (\n user: ReactNode,\n room: ReactNode | undefined\n ) => ReactNode;\n INBOX_NOTIFICATION_TEXT_MENTION: (\n user: ReactNode,\n room: ReactNode | undefined\n ) => ReactNode;\n}\n\nexport interface HistoryVersionPreviewOverrides {\n HISTORY_VERSION_PREVIEW_AUTHORS_LIST: (list: ReactNode) => ReactNode;\n HISTORY_VERSION_PREVIEW_RESTORE: string;\n HISTORY_VERSION_PREVIEW_EMPTY: ReactNode;\n HISTORY_VERSION_PREVIEW_ERROR: (error: Error) => ReactNode;\n}\n\nexport type Overrides = LocalizationOverrides &\n GlobalOverrides &\n ComposerOverrides &\n CommentOverrides &\n ThreadOverrides &\n InboxNotificationOverrides &\n HistoryVersionPreviewOverrides &\n AiChatComposerOverrides &\n AiChatMessageOverrides &\n AiChatOverrides;\n\ntype OverridesProviderProps = PropsWithChildren<{\n overrides?: Partial<Overrides>;\n}>;\n\nexport const defaultOverrides: Overrides = {\n locale: \"en\",\n dir: \"ltr\",\n USER_SELF: \"you\",\n USER_UNKNOWN: \"Anonymous\",\n LIST_REMAINING: (count) => `${count} more`,\n LIST_REMAINING_USERS: (count) => `${count} ${pluralize(count, \"other\")}`,\n LIST_REMAINING_COMMENTS: (count) =>\n `${count} more ${pluralize(count, \"comment\")}`,\n EMOJI_PICKER_SEARCH_PLACEHOLDER: \"Search…\",\n EMOJI_PICKER_EMPTY: \"No emoji found.\",\n EMOJI_PICKER_ERROR: () =>\n \"There was an error while getting the list of emoji.\",\n EMOJI_PICKER_CHANGE_SKIN_TONE: \"Change skin tone\",\n ATTACHMENT_TOO_LARGE: (maxSize) =>\n maxSize ? `The file is larger than ${maxSize}` : \"The file is too large\",\n ATTACHMENT_ERROR: () => \"The file couldn’t be uploaded.\",\n COMPOSER_INSERT_MENTION: \"Mention someone\",\n COMPOSER_INSERT_EMOJI: \"Add emoji\",\n COMPOSER_ATTACH_FILES: \"Attach files\",\n COMPOSER_REMOVE_ATTACHMENT: \"Remove attachment\",\n COMPOSER_PLACEHOLDER: \"Write a comment…\",\n COMPOSER_SEND: \"Send\",\n COMPOSER_TOGGLE_MARK: (format) => {\n switch (format) {\n case \"bold\":\n return \"Bold\";\n case \"italic\":\n return \"Italic\";\n case \"strikethrough\":\n return \"Strikethrough\";\n case \"code\":\n return \"Inline code\";\n default:\n return assertNever(format, \"Unexpected mark\");\n }\n },\n COMMENT_EDITED: \"(edited)\",\n COMMENT_DELETED: \"This comment has been deleted.\",\n COMMENT_MORE: \"More\",\n COMMENT_EDIT: \"Edit comment\",\n COMMENT_EDIT_COMPOSER_PLACEHOLDER: \"Edit comment…\",\n COMMENT_EDIT_COMPOSER_CANCEL: \"Cancel\",\n COMMENT_EDIT_COMPOSER_SAVE: \"Save\",\n COMMENT_DELETE: \"Delete comment\",\n COMMENT_DELETE_ATTACHMENT: \"Delete attachment\",\n COMMENT_ADD_REACTION: \"Add reaction\",\n COMMENT_REACTION_LIST: (list, emoji) => (\n <>\n {list} reacted with <Emoji emoji={emoji} />\n </>\n ),\n COMMENT_REACTION_DESCRIPTION: (emoji, count) =>\n `${count} ${pluralize(count, \"reaction\")}, react with ${emoji}`,\n THREAD_RESOLVE: \"Resolve thread\",\n THREAD_UNRESOLVE: \"Re-open thread\",\n THREAD_SUBSCRIBE: \"Subscribe to thread\",\n THREAD_UNSUBSCRIBE: \"Unsubscribe from thread\",\n THREAD_NEW_INDICATOR: \"New\",\n THREAD_NEW_INDICATOR_DESCRIPTION: \"New comments\",\n THREAD_COMPOSER_PLACEHOLDER: \"Reply to thread…\",\n THREAD_COMPOSER_SEND: \"Reply\",\n INBOX_NOTIFICATION_MORE: \"More\",\n INBOX_NOTIFICATION_MARK_AS_READ: \"Mark as read\",\n INBOX_NOTIFICATION_DELETE: \"Delete notification\",\n INBOX_NOTIFICATION_THREAD_COMMENTS_LIST: (\n list: ReactNode,\n room: ReactNode\n ) => (\n <>\n {list} commented\n {room ? <> in {room}</> : <> in a thread</>}\n </>\n ),\n INBOX_NOTIFICATION_THREAD_MENTION: (user: ReactNode, room: ReactNode) => (\n <>\n {user} mentioned you{room ? <> in {room}</> : null}\n </>\n ),\n INBOX_NOTIFICATION_TEXT_MENTION: (user: ReactNode, room: ReactNode) => (\n <>\n {user} mentioned you{room ? <> in {room}</> : null}\n </>\n ),\n HISTORY_VERSION_PREVIEW_AUTHORS_LIST: (list: ReactNode) => (\n <>Edits from {list}</>\n ),\n HISTORY_VERSION_PREVIEW_RESTORE: \"Restore\",\n HISTORY_VERSION_PREVIEW_EMPTY: \"No content.\",\n HISTORY_VERSION_PREVIEW_ERROR: () =>\n \"There was an error while getting this version.\",\n AI_CHAT_COMPOSER_PLACEHOLDER: \"Ask anything…\",\n AI_CHAT_COMPOSER_SEND: \"Send\",\n AI_CHAT_COMPOSER_ABORT: \"Abort response\",\n AI_CHAT_MESSAGE_DELETED: \"This message has been deleted.\",\n AI_CHAT_MESSAGE_THINKING: \"Thinking…\",\n AI_CHAT_MESSAGES_ERROR: () =>\n \"There was an error while getting the messages.\",\n};\n\nexport const OverridesContext = createContext<Overrides | undefined>(undefined);\n\nexport function useOverrides(overrides?: Partial<Overrides>): Overrides {\n const contextOverrides = useContext(OverridesContext);\n\n return useMemo(\n () => ({\n ...defaultOverrides,\n ...contextOverrides,\n ...overrides,\n }),\n [contextOverrides, overrides]\n );\n}\n\nexport function OverridesProvider({\n children,\n overrides: providerOverrides,\n}: OverridesProviderProps) {\n const contextOverrides = useContext(OverridesContext);\n const overrides = useMemo(\n () => ({\n ...defaultOverrides,\n ...contextOverrides,\n ...providerOverrides,\n }),\n [contextOverrides, providerOverrides]\n );\n\n return (\n <OverridesContext.Provider value={overrides}>\n {children}\n </OverridesContext.Provider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"overrides.cjs","sources":["../src/overrides.tsx"],"sourcesContent":["\"use client\";\n\nimport { assertNever } from \"@liveblocks/core\";\nimport type { PropsWithChildren, ReactNode } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nimport { Emoji } from \"./components/internal/Emoji\";\nimport type { ComposerBodyMark, Direction } from \"./types\";\nimport { pluralize } from \"./utils/pluralize\";\n\nexport interface LocalizationOverrides {\n locale: string;\n dir: Direction;\n}\n\nexport interface GlobalOverrides {\n USER_SELF: string;\n USER_UNKNOWN: string;\n LIST_REMAINING: (count: number) => string;\n LIST_REMAINING_USERS: (count: number) => string;\n LIST_REMAINING_COMMENTS: (count: number) => string;\n EMOJI_PICKER_SEARCH_PLACEHOLDER: string;\n EMOJI_PICKER_EMPTY: ReactNode;\n EMOJI_PICKER_ERROR: (error: Error) => ReactNode;\n EMOJI_PICKER_CHANGE_SKIN_TONE: string;\n ATTACHMENT_TOO_LARGE: (maxSize?: string) => string;\n ATTACHMENT_ERROR: (error: Error) => string;\n COPY_TO_CLIPBOARD: string;\n}\n\nexport interface CommentOverrides {\n COMMENT_EDITED: ReactNode;\n COMMENT_DELETED: ReactNode;\n COMMENT_MORE: string;\n COMMENT_EDIT: string;\n COMMENT_EDIT_COMPOSER_PLACEHOLDER: string;\n COMMENT_EDIT_COMPOSER_CANCEL: string;\n COMMENT_EDIT_COMPOSER_SAVE: string;\n COMMENT_DELETE: string;\n COMMENT_DELETE_ATTACHMENT: string;\n COMMENT_ADD_REACTION: string;\n COMMENT_REACTION_LIST: (\n list: ReactNode,\n emoji: string,\n count: number\n ) => ReactNode;\n COMMENT_REACTION_DESCRIPTION: (emoji: string, count: number) => string;\n}\n\nexport interface ComposerOverrides {\n COMPOSER_INSERT_MENTION: string;\n COMPOSER_INSERT_EMOJI: string;\n COMPOSER_ATTACH_FILES: string;\n COMPOSER_REMOVE_ATTACHMENT: string;\n COMPOSER_PLACEHOLDER: string;\n COMPOSER_SEND: string;\n COMPOSER_TOGGLE_MARK: (mark: ComposerBodyMark) => string;\n}\n\nexport interface AiToolConfirmationOverrides {\n AI_TOOL_CONFIRMATION_CONFIRM: string;\n AI_TOOL_CONFIRMATION_CANCEL: string;\n}\n\nexport interface AiChatComposerOverrides {\n AI_CHAT_COMPOSER_PLACEHOLDER: string;\n AI_CHAT_COMPOSER_SEND: string;\n AI_CHAT_COMPOSER_ABORT: string;\n}\n\nexport interface AiChatMessageOverrides {\n AI_CHAT_MESSAGE_DELETED: string;\n AI_CHAT_MESSAGE_THINKING: string;\n AI_CHAT_MESSAGE_REASONING: (isStreaming: boolean) => string;\n}\n\nexport interface AiChatOverrides {\n AI_CHAT_MESSAGES_ERROR: (error: Error) => ReactNode;\n}\n\nexport interface ThreadOverrides {\n THREAD_RESOLVE: string;\n THREAD_UNRESOLVE: string;\n THREAD_SUBSCRIBE: string;\n THREAD_UNSUBSCRIBE: string;\n THREAD_NEW_INDICATOR: string;\n THREAD_NEW_INDICATOR_DESCRIPTION: string;\n THREAD_COMPOSER_PLACEHOLDER: string;\n THREAD_COMPOSER_SEND: string;\n}\n\nexport interface InboxNotificationOverrides {\n INBOX_NOTIFICATION_MORE: string;\n INBOX_NOTIFICATION_MARK_AS_READ: string;\n INBOX_NOTIFICATION_DELETE: string;\n INBOX_NOTIFICATION_THREAD_COMMENTS_LIST: (\n list: ReactNode,\n room: ReactNode | undefined,\n count: number\n ) => ReactNode;\n INBOX_NOTIFICATION_THREAD_MENTION: (\n user: ReactNode,\n room: ReactNode | undefined\n ) => ReactNode;\n INBOX_NOTIFICATION_TEXT_MENTION: (\n user: ReactNode,\n room: ReactNode | undefined\n ) => ReactNode;\n}\n\nexport interface HistoryVersionPreviewOverrides {\n HISTORY_VERSION_PREVIEW_AUTHORS_LIST: (list: ReactNode) => ReactNode;\n HISTORY_VERSION_PREVIEW_RESTORE: string;\n HISTORY_VERSION_PREVIEW_EMPTY: ReactNode;\n HISTORY_VERSION_PREVIEW_ERROR: (error: Error) => ReactNode;\n}\n\nexport type Overrides = LocalizationOverrides &\n GlobalOverrides &\n ComposerOverrides &\n CommentOverrides &\n ThreadOverrides &\n InboxNotificationOverrides &\n HistoryVersionPreviewOverrides &\n AiChatComposerOverrides &\n AiChatMessageOverrides &\n AiChatOverrides &\n AiToolConfirmationOverrides;\n\ntype OverridesProviderProps = PropsWithChildren<{\n overrides?: Partial<Overrides>;\n}>;\n\nexport const defaultOverrides: Overrides = {\n locale: \"en\",\n dir: \"ltr\",\n USER_SELF: \"you\",\n USER_UNKNOWN: \"Anonymous\",\n COPY_TO_CLIPBOARD: \"Copy\",\n LIST_REMAINING: (count) => `${count} more`,\n LIST_REMAINING_USERS: (count) => `${count} ${pluralize(count, \"other\")}`,\n LIST_REMAINING_COMMENTS: (count) =>\n `${count} more ${pluralize(count, \"comment\")}`,\n EMOJI_PICKER_SEARCH_PLACEHOLDER: \"Search…\",\n EMOJI_PICKER_EMPTY: \"No emoji found.\",\n EMOJI_PICKER_ERROR: () =>\n \"There was an error while getting the list of emoji.\",\n EMOJI_PICKER_CHANGE_SKIN_TONE: \"Change skin tone\",\n ATTACHMENT_TOO_LARGE: (maxSize) =>\n maxSize ? `The file is larger than ${maxSize}` : \"The file is too large\",\n ATTACHMENT_ERROR: () => \"The file couldn’t be uploaded.\",\n COMPOSER_INSERT_MENTION: \"Mention someone\",\n COMPOSER_INSERT_EMOJI: \"Add emoji\",\n COMPOSER_ATTACH_FILES: \"Attach files\",\n COMPOSER_REMOVE_ATTACHMENT: \"Remove attachment\",\n COMPOSER_PLACEHOLDER: \"Write a comment…\",\n COMPOSER_SEND: \"Send\",\n COMPOSER_TOGGLE_MARK: (format) => {\n switch (format) {\n case \"bold\":\n return \"Bold\";\n case \"italic\":\n return \"Italic\";\n case \"strikethrough\":\n return \"Strikethrough\";\n case \"code\":\n return \"Inline code\";\n default:\n return assertNever(format, \"Unexpected mark\");\n }\n },\n COMMENT_EDITED: \"(edited)\",\n COMMENT_DELETED: \"This comment has been deleted.\",\n COMMENT_MORE: \"More\",\n COMMENT_EDIT: \"Edit comment\",\n COMMENT_EDIT_COMPOSER_PLACEHOLDER: \"Edit comment…\",\n COMMENT_EDIT_COMPOSER_CANCEL: \"Cancel\",\n COMMENT_EDIT_COMPOSER_SAVE: \"Save\",\n COMMENT_DELETE: \"Delete comment\",\n COMMENT_DELETE_ATTACHMENT: \"Delete attachment\",\n COMMENT_ADD_REACTION: \"Add reaction\",\n COMMENT_REACTION_LIST: (list, emoji) => (\n <>\n {list} reacted with <Emoji emoji={emoji} />\n </>\n ),\n COMMENT_REACTION_DESCRIPTION: (emoji, count) =>\n `${count} ${pluralize(count, \"reaction\")}, react with ${emoji}`,\n THREAD_RESOLVE: \"Resolve thread\",\n THREAD_UNRESOLVE: \"Re-open thread\",\n THREAD_SUBSCRIBE: \"Subscribe to thread\",\n THREAD_UNSUBSCRIBE: \"Unsubscribe from thread\",\n THREAD_NEW_INDICATOR: \"New\",\n THREAD_NEW_INDICATOR_DESCRIPTION: \"New comments\",\n THREAD_COMPOSER_PLACEHOLDER: \"Reply to thread…\",\n THREAD_COMPOSER_SEND: \"Reply\",\n INBOX_NOTIFICATION_MORE: \"More\",\n INBOX_NOTIFICATION_MARK_AS_READ: \"Mark as read\",\n INBOX_NOTIFICATION_DELETE: \"Delete notification\",\n INBOX_NOTIFICATION_THREAD_COMMENTS_LIST: (\n list: ReactNode,\n room: ReactNode\n ) => (\n <>\n {list} commented\n {room ? <> in {room}</> : <> in a thread</>}\n </>\n ),\n INBOX_NOTIFICATION_THREAD_MENTION: (user: ReactNode, room: ReactNode) => (\n <>\n {user} mentioned you{room ? <> in {room}</> : null}\n </>\n ),\n INBOX_NOTIFICATION_TEXT_MENTION: (user: ReactNode, room: ReactNode) => (\n <>\n {user} mentioned you{room ? <> in {room}</> : null}\n </>\n ),\n HISTORY_VERSION_PREVIEW_AUTHORS_LIST: (list: ReactNode) => (\n <>Edits from {list}</>\n ),\n HISTORY_VERSION_PREVIEW_RESTORE: \"Restore\",\n HISTORY_VERSION_PREVIEW_EMPTY: \"No content.\",\n HISTORY_VERSION_PREVIEW_ERROR: () =>\n \"There was an error while getting this version.\",\n AI_CHAT_COMPOSER_PLACEHOLDER: \"Ask anything…\",\n AI_CHAT_COMPOSER_SEND: \"Send\",\n AI_CHAT_COMPOSER_ABORT: \"Abort response\",\n AI_CHAT_MESSAGE_DELETED: \"This message has been deleted.\",\n AI_CHAT_MESSAGE_THINKING: \"Thinking…\",\n AI_CHAT_MESSAGE_REASONING: (isStreaming) =>\n isStreaming ? \"Reasoning…\" : \"Reasoning\",\n AI_CHAT_MESSAGES_ERROR: () =>\n \"There was an error while getting the messages.\",\n AI_TOOL_CONFIRMATION_CONFIRM: \"Confirm\",\n AI_TOOL_CONFIRMATION_CANCEL: \"Cancel\",\n};\n\nexport const OverridesContext = createContext<Overrides | undefined>(undefined);\n\nexport function useOverrides(overrides?: Partial<Overrides>): Overrides {\n const contextOverrides = useContext(OverridesContext);\n\n return useMemo(\n () => ({\n ...defaultOverrides,\n ...contextOverrides,\n ...overrides,\n }),\n [contextOverrides, overrides]\n );\n}\n\nexport function OverridesProvider({\n children,\n overrides: providerOverrides,\n}: OverridesProviderProps) {\n const contextOverrides = useContext(OverridesContext);\n const overrides = useMemo(\n () => ({\n ...defaultOverrides,\n ...contextOverrides,\n ...providerOverrides,\n }),\n [contextOverrides, providerOverrides]\n );\n\n return (\n <OverridesContext.Provider value={overrides}>\n {children}\n </OverridesContext.Provider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAqIO;AAAoC;AACjC;AACH;AACM;AACG;AACK;AACW;AACuC;AAExB;AACZ;AACb;AAElB;AAC6B;AAEoB;AAC3B;AACC;AACF;AACA;AACK;AACN;AACP;AAEb;AAAgB;AAEZ;AAAO;AAEP;AAAO;AAEP;AAAO;AAEP;AAAO;AAEP;AAA4C;AAChD;AACF;AACgB;AACC;AACH;AACA;AACqB;AACL;AACF;AACZ;AACW;AACL;AAEpB;AACG;AAAA;AAAK;AAAe;AAAM;AAAc;AAAA;AAC3C;AAGwD;AAC1C;AACE;AACA;AACE;AACE;AACY;AACL;AACP;AACG;AACQ;AACN;AAKzB;AACG;AAAA;AAAK;AACE;AAAE;AAAA;AAAK;AAAA;AAAW;AAAE;AAAY;AAAA;AAC1C;AAGA;AACG;AAAA;AAAK;AAAsB;AAAE;AAAA;AAAK;AAAA;AAAW;AAAA;AAChD;AAGA;AACG;AAAA;AAAK;AAAsB;AAAE;AAAA;AAAK;AAAA;AAAW;AAAA;AAChD;AAGA;AAAE;AAAA;AAAY;AAAA;AAAK;AAEY;AACF;AAE7B;AAC4B;AACP;AACC;AACC;AACC;AAEK;AAE7B;AAC4B;AAEhC;AAEa;AAEN;AACL;AAEA;AAAO;AACE;AACF;AACA;AACA;AACL;AAC4B;AAEhC;AAEO;AAA2B;AAChC;AAEF;AACE;AACA;AAAkB;AACT;AACF;AACA;AACA;AACL;AACoC;AAGtC;AACG;AAAiC;AAC/B;AAGP;;;;;"}
|
package/dist/overrides.js
CHANGED
|
@@ -11,6 +11,7 @@ const defaultOverrides = {
|
|
|
11
11
|
dir: "ltr",
|
|
12
12
|
USER_SELF: "you",
|
|
13
13
|
USER_UNKNOWN: "Anonymous",
|
|
14
|
+
COPY_TO_CLIPBOARD: "Copy",
|
|
14
15
|
LIST_REMAINING: (count) => `${count} more`,
|
|
15
16
|
LIST_REMAINING_USERS: (count) => `${count} ${pluralize(count, "other")}`,
|
|
16
17
|
LIST_REMAINING_COMMENTS: (count) => `${count} more ${pluralize(count, "comment")}`,
|
|
@@ -123,7 +124,10 @@ const defaultOverrides = {
|
|
|
123
124
|
AI_CHAT_COMPOSER_ABORT: "Abort response",
|
|
124
125
|
AI_CHAT_MESSAGE_DELETED: "This message has been deleted.",
|
|
125
126
|
AI_CHAT_MESSAGE_THINKING: "Thinking\u2026",
|
|
126
|
-
|
|
127
|
+
AI_CHAT_MESSAGE_REASONING: (isStreaming) => isStreaming ? "Reasoning\u2026" : "Reasoning",
|
|
128
|
+
AI_CHAT_MESSAGES_ERROR: () => "There was an error while getting the messages.",
|
|
129
|
+
AI_TOOL_CONFIRMATION_CONFIRM: "Confirm",
|
|
130
|
+
AI_TOOL_CONFIRMATION_CANCEL: "Cancel"
|
|
127
131
|
};
|
|
128
132
|
const OverridesContext = createContext(void 0);
|
|
129
133
|
function useOverrides(overrides) {
|
package/dist/overrides.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overrides.js","sources":["../src/overrides.tsx"],"sourcesContent":["\"use client\";\n\nimport { assertNever } from \"@liveblocks/core\";\nimport type { PropsWithChildren, ReactNode } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nimport { Emoji } from \"./components/internal/Emoji\";\nimport type { ComposerBodyMark, Direction } from \"./types\";\nimport { pluralize } from \"./utils/pluralize\";\n\nexport interface LocalizationOverrides {\n locale: string;\n dir: Direction;\n}\n\nexport interface GlobalOverrides {\n USER_SELF: string;\n USER_UNKNOWN: string;\n LIST_REMAINING: (count: number) => string;\n LIST_REMAINING_USERS: (count: number) => string;\n LIST_REMAINING_COMMENTS: (count: number) => string;\n EMOJI_PICKER_SEARCH_PLACEHOLDER: string;\n EMOJI_PICKER_EMPTY: ReactNode;\n EMOJI_PICKER_ERROR: (error: Error) => ReactNode;\n EMOJI_PICKER_CHANGE_SKIN_TONE: string;\n ATTACHMENT_TOO_LARGE: (maxSize?: string) => string;\n ATTACHMENT_ERROR: (error: Error) => string;\n}\n\nexport interface CommentOverrides {\n COMMENT_EDITED: ReactNode;\n COMMENT_DELETED: ReactNode;\n COMMENT_MORE: string;\n COMMENT_EDIT: string;\n COMMENT_EDIT_COMPOSER_PLACEHOLDER: string;\n COMMENT_EDIT_COMPOSER_CANCEL: string;\n COMMENT_EDIT_COMPOSER_SAVE: string;\n COMMENT_DELETE: string;\n COMMENT_DELETE_ATTACHMENT: string;\n COMMENT_ADD_REACTION: string;\n COMMENT_REACTION_LIST: (\n list: ReactNode,\n emoji: string,\n count: number\n ) => ReactNode;\n COMMENT_REACTION_DESCRIPTION: (emoji: string, count: number) => string;\n}\n\nexport interface ComposerOverrides {\n COMPOSER_INSERT_MENTION: string;\n COMPOSER_INSERT_EMOJI: string;\n COMPOSER_ATTACH_FILES: string;\n COMPOSER_REMOVE_ATTACHMENT: string;\n COMPOSER_PLACEHOLDER: string;\n COMPOSER_SEND: string;\n COMPOSER_TOGGLE_MARK: (mark: ComposerBodyMark) => string;\n}\n\nexport interface AiChatComposerOverrides {\n AI_CHAT_COMPOSER_PLACEHOLDER: string;\n AI_CHAT_COMPOSER_SEND: string;\n AI_CHAT_COMPOSER_ABORT: string;\n}\n\nexport interface AiChatMessageOverrides {\n AI_CHAT_MESSAGE_DELETED: string;\n AI_CHAT_MESSAGE_THINKING: string;\n}\n\nexport interface AiChatOverrides {\n AI_CHAT_MESSAGES_ERROR: (error: Error) => ReactNode;\n}\n\nexport interface ThreadOverrides {\n THREAD_RESOLVE: string;\n THREAD_UNRESOLVE: string;\n THREAD_SUBSCRIBE: string;\n THREAD_UNSUBSCRIBE: string;\n THREAD_NEW_INDICATOR: string;\n THREAD_NEW_INDICATOR_DESCRIPTION: string;\n THREAD_COMPOSER_PLACEHOLDER: string;\n THREAD_COMPOSER_SEND: string;\n}\n\nexport interface InboxNotificationOverrides {\n INBOX_NOTIFICATION_MORE: string;\n INBOX_NOTIFICATION_MARK_AS_READ: string;\n INBOX_NOTIFICATION_DELETE: string;\n INBOX_NOTIFICATION_THREAD_COMMENTS_LIST: (\n list: ReactNode,\n room: ReactNode | undefined,\n count: number\n ) => ReactNode;\n INBOX_NOTIFICATION_THREAD_MENTION: (\n user: ReactNode,\n room: ReactNode | undefined\n ) => ReactNode;\n INBOX_NOTIFICATION_TEXT_MENTION: (\n user: ReactNode,\n room: ReactNode | undefined\n ) => ReactNode;\n}\n\nexport interface HistoryVersionPreviewOverrides {\n HISTORY_VERSION_PREVIEW_AUTHORS_LIST: (list: ReactNode) => ReactNode;\n HISTORY_VERSION_PREVIEW_RESTORE: string;\n HISTORY_VERSION_PREVIEW_EMPTY: ReactNode;\n HISTORY_VERSION_PREVIEW_ERROR: (error: Error) => ReactNode;\n}\n\nexport type Overrides = LocalizationOverrides &\n GlobalOverrides &\n ComposerOverrides &\n CommentOverrides &\n ThreadOverrides &\n InboxNotificationOverrides &\n HistoryVersionPreviewOverrides &\n AiChatComposerOverrides &\n AiChatMessageOverrides &\n AiChatOverrides;\n\ntype OverridesProviderProps = PropsWithChildren<{\n overrides?: Partial<Overrides>;\n}>;\n\nexport const defaultOverrides: Overrides = {\n locale: \"en\",\n dir: \"ltr\",\n USER_SELF: \"you\",\n USER_UNKNOWN: \"Anonymous\",\n LIST_REMAINING: (count) => `${count} more`,\n LIST_REMAINING_USERS: (count) => `${count} ${pluralize(count, \"other\")}`,\n LIST_REMAINING_COMMENTS: (count) =>\n `${count} more ${pluralize(count, \"comment\")}`,\n EMOJI_PICKER_SEARCH_PLACEHOLDER: \"Search…\",\n EMOJI_PICKER_EMPTY: \"No emoji found.\",\n EMOJI_PICKER_ERROR: () =>\n \"There was an error while getting the list of emoji.\",\n EMOJI_PICKER_CHANGE_SKIN_TONE: \"Change skin tone\",\n ATTACHMENT_TOO_LARGE: (maxSize) =>\n maxSize ? `The file is larger than ${maxSize}` : \"The file is too large\",\n ATTACHMENT_ERROR: () => \"The file couldn’t be uploaded.\",\n COMPOSER_INSERT_MENTION: \"Mention someone\",\n COMPOSER_INSERT_EMOJI: \"Add emoji\",\n COMPOSER_ATTACH_FILES: \"Attach files\",\n COMPOSER_REMOVE_ATTACHMENT: \"Remove attachment\",\n COMPOSER_PLACEHOLDER: \"Write a comment…\",\n COMPOSER_SEND: \"Send\",\n COMPOSER_TOGGLE_MARK: (format) => {\n switch (format) {\n case \"bold\":\n return \"Bold\";\n case \"italic\":\n return \"Italic\";\n case \"strikethrough\":\n return \"Strikethrough\";\n case \"code\":\n return \"Inline code\";\n default:\n return assertNever(format, \"Unexpected mark\");\n }\n },\n COMMENT_EDITED: \"(edited)\",\n COMMENT_DELETED: \"This comment has been deleted.\",\n COMMENT_MORE: \"More\",\n COMMENT_EDIT: \"Edit comment\",\n COMMENT_EDIT_COMPOSER_PLACEHOLDER: \"Edit comment…\",\n COMMENT_EDIT_COMPOSER_CANCEL: \"Cancel\",\n COMMENT_EDIT_COMPOSER_SAVE: \"Save\",\n COMMENT_DELETE: \"Delete comment\",\n COMMENT_DELETE_ATTACHMENT: \"Delete attachment\",\n COMMENT_ADD_REACTION: \"Add reaction\",\n COMMENT_REACTION_LIST: (list, emoji) => (\n <>\n {list} reacted with <Emoji emoji={emoji} />\n </>\n ),\n COMMENT_REACTION_DESCRIPTION: (emoji, count) =>\n `${count} ${pluralize(count, \"reaction\")}, react with ${emoji}`,\n THREAD_RESOLVE: \"Resolve thread\",\n THREAD_UNRESOLVE: \"Re-open thread\",\n THREAD_SUBSCRIBE: \"Subscribe to thread\",\n THREAD_UNSUBSCRIBE: \"Unsubscribe from thread\",\n THREAD_NEW_INDICATOR: \"New\",\n THREAD_NEW_INDICATOR_DESCRIPTION: \"New comments\",\n THREAD_COMPOSER_PLACEHOLDER: \"Reply to thread…\",\n THREAD_COMPOSER_SEND: \"Reply\",\n INBOX_NOTIFICATION_MORE: \"More\",\n INBOX_NOTIFICATION_MARK_AS_READ: \"Mark as read\",\n INBOX_NOTIFICATION_DELETE: \"Delete notification\",\n INBOX_NOTIFICATION_THREAD_COMMENTS_LIST: (\n list: ReactNode,\n room: ReactNode\n ) => (\n <>\n {list} commented\n {room ? <> in {room}</> : <> in a thread</>}\n </>\n ),\n INBOX_NOTIFICATION_THREAD_MENTION: (user: ReactNode, room: ReactNode) => (\n <>\n {user} mentioned you{room ? <> in {room}</> : null}\n </>\n ),\n INBOX_NOTIFICATION_TEXT_MENTION: (user: ReactNode, room: ReactNode) => (\n <>\n {user} mentioned you{room ? <> in {room}</> : null}\n </>\n ),\n HISTORY_VERSION_PREVIEW_AUTHORS_LIST: (list: ReactNode) => (\n <>Edits from {list}</>\n ),\n HISTORY_VERSION_PREVIEW_RESTORE: \"Restore\",\n HISTORY_VERSION_PREVIEW_EMPTY: \"No content.\",\n HISTORY_VERSION_PREVIEW_ERROR: () =>\n \"There was an error while getting this version.\",\n AI_CHAT_COMPOSER_PLACEHOLDER: \"Ask anything…\",\n AI_CHAT_COMPOSER_SEND: \"Send\",\n AI_CHAT_COMPOSER_ABORT: \"Abort response\",\n AI_CHAT_MESSAGE_DELETED: \"This message has been deleted.\",\n AI_CHAT_MESSAGE_THINKING: \"Thinking…\",\n AI_CHAT_MESSAGES_ERROR: () =>\n \"There was an error while getting the messages.\",\n};\n\nexport const OverridesContext = createContext<Overrides | undefined>(undefined);\n\nexport function useOverrides(overrides?: Partial<Overrides>): Overrides {\n const contextOverrides = useContext(OverridesContext);\n\n return useMemo(\n () => ({\n ...defaultOverrides,\n ...contextOverrides,\n ...overrides,\n }),\n [contextOverrides, overrides]\n );\n}\n\nexport function OverridesProvider({\n children,\n overrides: providerOverrides,\n}: OverridesProviderProps) {\n const contextOverrides = useContext(OverridesContext);\n const overrides = useMemo(\n () => ({\n ...defaultOverrides,\n ...contextOverrides,\n ...providerOverrides,\n }),\n [contextOverrides, providerOverrides]\n );\n\n return (\n <OverridesContext.Provider value={overrides}>\n {children}\n </OverridesContext.Provider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"overrides.js","sources":["../src/overrides.tsx"],"sourcesContent":["\"use client\";\n\nimport { assertNever } from \"@liveblocks/core\";\nimport type { PropsWithChildren, ReactNode } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nimport { Emoji } from \"./components/internal/Emoji\";\nimport type { ComposerBodyMark, Direction } from \"./types\";\nimport { pluralize } from \"./utils/pluralize\";\n\nexport interface LocalizationOverrides {\n locale: string;\n dir: Direction;\n}\n\nexport interface GlobalOverrides {\n USER_SELF: string;\n USER_UNKNOWN: string;\n LIST_REMAINING: (count: number) => string;\n LIST_REMAINING_USERS: (count: number) => string;\n LIST_REMAINING_COMMENTS: (count: number) => string;\n EMOJI_PICKER_SEARCH_PLACEHOLDER: string;\n EMOJI_PICKER_EMPTY: ReactNode;\n EMOJI_PICKER_ERROR: (error: Error) => ReactNode;\n EMOJI_PICKER_CHANGE_SKIN_TONE: string;\n ATTACHMENT_TOO_LARGE: (maxSize?: string) => string;\n ATTACHMENT_ERROR: (error: Error) => string;\n COPY_TO_CLIPBOARD: string;\n}\n\nexport interface CommentOverrides {\n COMMENT_EDITED: ReactNode;\n COMMENT_DELETED: ReactNode;\n COMMENT_MORE: string;\n COMMENT_EDIT: string;\n COMMENT_EDIT_COMPOSER_PLACEHOLDER: string;\n COMMENT_EDIT_COMPOSER_CANCEL: string;\n COMMENT_EDIT_COMPOSER_SAVE: string;\n COMMENT_DELETE: string;\n COMMENT_DELETE_ATTACHMENT: string;\n COMMENT_ADD_REACTION: string;\n COMMENT_REACTION_LIST: (\n list: ReactNode,\n emoji: string,\n count: number\n ) => ReactNode;\n COMMENT_REACTION_DESCRIPTION: (emoji: string, count: number) => string;\n}\n\nexport interface ComposerOverrides {\n COMPOSER_INSERT_MENTION: string;\n COMPOSER_INSERT_EMOJI: string;\n COMPOSER_ATTACH_FILES: string;\n COMPOSER_REMOVE_ATTACHMENT: string;\n COMPOSER_PLACEHOLDER: string;\n COMPOSER_SEND: string;\n COMPOSER_TOGGLE_MARK: (mark: ComposerBodyMark) => string;\n}\n\nexport interface AiToolConfirmationOverrides {\n AI_TOOL_CONFIRMATION_CONFIRM: string;\n AI_TOOL_CONFIRMATION_CANCEL: string;\n}\n\nexport interface AiChatComposerOverrides {\n AI_CHAT_COMPOSER_PLACEHOLDER: string;\n AI_CHAT_COMPOSER_SEND: string;\n AI_CHAT_COMPOSER_ABORT: string;\n}\n\nexport interface AiChatMessageOverrides {\n AI_CHAT_MESSAGE_DELETED: string;\n AI_CHAT_MESSAGE_THINKING: string;\n AI_CHAT_MESSAGE_REASONING: (isStreaming: boolean) => string;\n}\n\nexport interface AiChatOverrides {\n AI_CHAT_MESSAGES_ERROR: (error: Error) => ReactNode;\n}\n\nexport interface ThreadOverrides {\n THREAD_RESOLVE: string;\n THREAD_UNRESOLVE: string;\n THREAD_SUBSCRIBE: string;\n THREAD_UNSUBSCRIBE: string;\n THREAD_NEW_INDICATOR: string;\n THREAD_NEW_INDICATOR_DESCRIPTION: string;\n THREAD_COMPOSER_PLACEHOLDER: string;\n THREAD_COMPOSER_SEND: string;\n}\n\nexport interface InboxNotificationOverrides {\n INBOX_NOTIFICATION_MORE: string;\n INBOX_NOTIFICATION_MARK_AS_READ: string;\n INBOX_NOTIFICATION_DELETE: string;\n INBOX_NOTIFICATION_THREAD_COMMENTS_LIST: (\n list: ReactNode,\n room: ReactNode | undefined,\n count: number\n ) => ReactNode;\n INBOX_NOTIFICATION_THREAD_MENTION: (\n user: ReactNode,\n room: ReactNode | undefined\n ) => ReactNode;\n INBOX_NOTIFICATION_TEXT_MENTION: (\n user: ReactNode,\n room: ReactNode | undefined\n ) => ReactNode;\n}\n\nexport interface HistoryVersionPreviewOverrides {\n HISTORY_VERSION_PREVIEW_AUTHORS_LIST: (list: ReactNode) => ReactNode;\n HISTORY_VERSION_PREVIEW_RESTORE: string;\n HISTORY_VERSION_PREVIEW_EMPTY: ReactNode;\n HISTORY_VERSION_PREVIEW_ERROR: (error: Error) => ReactNode;\n}\n\nexport type Overrides = LocalizationOverrides &\n GlobalOverrides &\n ComposerOverrides &\n CommentOverrides &\n ThreadOverrides &\n InboxNotificationOverrides &\n HistoryVersionPreviewOverrides &\n AiChatComposerOverrides &\n AiChatMessageOverrides &\n AiChatOverrides &\n AiToolConfirmationOverrides;\n\ntype OverridesProviderProps = PropsWithChildren<{\n overrides?: Partial<Overrides>;\n}>;\n\nexport const defaultOverrides: Overrides = {\n locale: \"en\",\n dir: \"ltr\",\n USER_SELF: \"you\",\n USER_UNKNOWN: \"Anonymous\",\n COPY_TO_CLIPBOARD: \"Copy\",\n LIST_REMAINING: (count) => `${count} more`,\n LIST_REMAINING_USERS: (count) => `${count} ${pluralize(count, \"other\")}`,\n LIST_REMAINING_COMMENTS: (count) =>\n `${count} more ${pluralize(count, \"comment\")}`,\n EMOJI_PICKER_SEARCH_PLACEHOLDER: \"Search…\",\n EMOJI_PICKER_EMPTY: \"No emoji found.\",\n EMOJI_PICKER_ERROR: () =>\n \"There was an error while getting the list of emoji.\",\n EMOJI_PICKER_CHANGE_SKIN_TONE: \"Change skin tone\",\n ATTACHMENT_TOO_LARGE: (maxSize) =>\n maxSize ? `The file is larger than ${maxSize}` : \"The file is too large\",\n ATTACHMENT_ERROR: () => \"The file couldn’t be uploaded.\",\n COMPOSER_INSERT_MENTION: \"Mention someone\",\n COMPOSER_INSERT_EMOJI: \"Add emoji\",\n COMPOSER_ATTACH_FILES: \"Attach files\",\n COMPOSER_REMOVE_ATTACHMENT: \"Remove attachment\",\n COMPOSER_PLACEHOLDER: \"Write a comment…\",\n COMPOSER_SEND: \"Send\",\n COMPOSER_TOGGLE_MARK: (format) => {\n switch (format) {\n case \"bold\":\n return \"Bold\";\n case \"italic\":\n return \"Italic\";\n case \"strikethrough\":\n return \"Strikethrough\";\n case \"code\":\n return \"Inline code\";\n default:\n return assertNever(format, \"Unexpected mark\");\n }\n },\n COMMENT_EDITED: \"(edited)\",\n COMMENT_DELETED: \"This comment has been deleted.\",\n COMMENT_MORE: \"More\",\n COMMENT_EDIT: \"Edit comment\",\n COMMENT_EDIT_COMPOSER_PLACEHOLDER: \"Edit comment…\",\n COMMENT_EDIT_COMPOSER_CANCEL: \"Cancel\",\n COMMENT_EDIT_COMPOSER_SAVE: \"Save\",\n COMMENT_DELETE: \"Delete comment\",\n COMMENT_DELETE_ATTACHMENT: \"Delete attachment\",\n COMMENT_ADD_REACTION: \"Add reaction\",\n COMMENT_REACTION_LIST: (list, emoji) => (\n <>\n {list} reacted with <Emoji emoji={emoji} />\n </>\n ),\n COMMENT_REACTION_DESCRIPTION: (emoji, count) =>\n `${count} ${pluralize(count, \"reaction\")}, react with ${emoji}`,\n THREAD_RESOLVE: \"Resolve thread\",\n THREAD_UNRESOLVE: \"Re-open thread\",\n THREAD_SUBSCRIBE: \"Subscribe to thread\",\n THREAD_UNSUBSCRIBE: \"Unsubscribe from thread\",\n THREAD_NEW_INDICATOR: \"New\",\n THREAD_NEW_INDICATOR_DESCRIPTION: \"New comments\",\n THREAD_COMPOSER_PLACEHOLDER: \"Reply to thread…\",\n THREAD_COMPOSER_SEND: \"Reply\",\n INBOX_NOTIFICATION_MORE: \"More\",\n INBOX_NOTIFICATION_MARK_AS_READ: \"Mark as read\",\n INBOX_NOTIFICATION_DELETE: \"Delete notification\",\n INBOX_NOTIFICATION_THREAD_COMMENTS_LIST: (\n list: ReactNode,\n room: ReactNode\n ) => (\n <>\n {list} commented\n {room ? <> in {room}</> : <> in a thread</>}\n </>\n ),\n INBOX_NOTIFICATION_THREAD_MENTION: (user: ReactNode, room: ReactNode) => (\n <>\n {user} mentioned you{room ? <> in {room}</> : null}\n </>\n ),\n INBOX_NOTIFICATION_TEXT_MENTION: (user: ReactNode, room: ReactNode) => (\n <>\n {user} mentioned you{room ? <> in {room}</> : null}\n </>\n ),\n HISTORY_VERSION_PREVIEW_AUTHORS_LIST: (list: ReactNode) => (\n <>Edits from {list}</>\n ),\n HISTORY_VERSION_PREVIEW_RESTORE: \"Restore\",\n HISTORY_VERSION_PREVIEW_EMPTY: \"No content.\",\n HISTORY_VERSION_PREVIEW_ERROR: () =>\n \"There was an error while getting this version.\",\n AI_CHAT_COMPOSER_PLACEHOLDER: \"Ask anything…\",\n AI_CHAT_COMPOSER_SEND: \"Send\",\n AI_CHAT_COMPOSER_ABORT: \"Abort response\",\n AI_CHAT_MESSAGE_DELETED: \"This message has been deleted.\",\n AI_CHAT_MESSAGE_THINKING: \"Thinking…\",\n AI_CHAT_MESSAGE_REASONING: (isStreaming) =>\n isStreaming ? \"Reasoning…\" : \"Reasoning\",\n AI_CHAT_MESSAGES_ERROR: () =>\n \"There was an error while getting the messages.\",\n AI_TOOL_CONFIRMATION_CONFIRM: \"Confirm\",\n AI_TOOL_CONFIRMATION_CANCEL: \"Cancel\",\n};\n\nexport const OverridesContext = createContext<Overrides | undefined>(undefined);\n\nexport function useOverrides(overrides?: Partial<Overrides>): Overrides {\n const contextOverrides = useContext(OverridesContext);\n\n return useMemo(\n () => ({\n ...defaultOverrides,\n ...contextOverrides,\n ...overrides,\n }),\n [contextOverrides, overrides]\n );\n}\n\nexport function OverridesProvider({\n children,\n overrides: providerOverrides,\n}: OverridesProviderProps) {\n const contextOverrides = useContext(OverridesContext);\n const overrides = useMemo(\n () => ({\n ...defaultOverrides,\n ...contextOverrides,\n ...providerOverrides,\n }),\n [contextOverrides, providerOverrides]\n );\n\n return (\n <OverridesContext.Provider value={overrides}>\n {children}\n </OverridesContext.Provider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAqIO;AAAoC;AACjC;AACH;AACM;AACG;AACK;AACW;AACuC;AAExB;AACZ;AACb;AAElB;AAC6B;AAEoB;AAC3B;AACC;AACF;AACA;AACK;AACN;AACP;AAEb;AAAgB;AAEZ;AAAO;AAEP;AAAO;AAEP;AAAO;AAEP;AAAO;AAEP;AAA4C;AAChD;AACF;AACgB;AACC;AACH;AACA;AACqB;AACL;AACF;AACZ;AACW;AACL;AAEpB;AACG;AAAA;AAAK;AAAe;AAAM;AAAc;AAAA;AAC3C;AAGwD;AAC1C;AACE;AACA;AACE;AACE;AACY;AACL;AACP;AACG;AACQ;AACN;AAKzB;AACG;AAAA;AAAK;AACE;AAAE;AAAA;AAAK;AAAA;AAAW;AAAE;AAAY;AAAA;AAC1C;AAGA;AACG;AAAA;AAAK;AAAsB;AAAE;AAAA;AAAK;AAAA;AAAW;AAAA;AAChD;AAGA;AACG;AAAA;AAAK;AAAsB;AAAE;AAAA;AAAK;AAAA;AAAW;AAAA;AAChD;AAGA;AAAE;AAAA;AAAY;AAAA;AAAK;AAEY;AACF;AAE7B;AAC4B;AACP;AACC;AACC;AACC;AAEK;AAE7B;AAC4B;AAEhC;AAEa;AAEN;AACL;AAEA;AAAO;AACE;AACF;AACA;AACA;AACL;AAC4B;AAEhC;AAEO;AAA2B;AAChC;AAEF;AACE;AACA;AAAkB;AACT;AACF;AACA;AACA;AACL;AACoC;AAGtC;AACG;AAAiC;AAC/B;AAGP;;"}
|