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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/_private/index.cjs +14 -10
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +200 -105
  4. package/dist/_private/index.d.ts +200 -105
  5. package/dist/_private/index.js +10 -5
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +85 -120
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +87 -122
  10. package/dist/components/AiChat.js.map +1 -1
  11. package/dist/components/AiTool.cjs +164 -0
  12. package/dist/components/AiTool.cjs.map +1 -0
  13. package/dist/components/AiTool.js +162 -0
  14. package/dist/components/AiTool.js.map +1 -0
  15. package/dist/components/Comment.cjs +5 -3
  16. package/dist/components/Comment.cjs.map +1 -1
  17. package/dist/components/Comment.js +6 -4
  18. package/dist/components/Comment.js.map +1 -1
  19. package/dist/components/InboxNotificationList.cjs +11 -3
  20. package/dist/components/InboxNotificationList.cjs.map +1 -1
  21. package/dist/components/InboxNotificationList.js +12 -4
  22. package/dist/components/InboxNotificationList.js.map +1 -1
  23. package/dist/components/Thread.cjs +3 -3
  24. package/dist/components/Thread.cjs.map +1 -1
  25. package/dist/components/Thread.js +3 -3
  26. package/dist/components/Thread.js.map +1 -1
  27. package/dist/components/internal/AiChatAssistantMessage.cjs +53 -229
  28. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  29. package/dist/components/internal/AiChatAssistantMessage.js +55 -231
  30. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  31. package/dist/components/internal/AiChatComposer.cjs +29 -17
  32. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  33. package/dist/components/internal/AiChatComposer.js +29 -17
  34. package/dist/components/internal/AiChatComposer.js.map +1 -1
  35. package/dist/components/internal/AiChatUserMessage.cjs +17 -10
  36. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  37. package/dist/components/internal/AiChatUserMessage.js +17 -10
  38. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  39. package/dist/components/internal/Button.cjs.map +1 -1
  40. package/dist/components/internal/Button.js.map +1 -1
  41. package/dist/components/internal/CodeBlock.cjs +72 -0
  42. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  43. package/dist/components/internal/CodeBlock.js +70 -0
  44. package/dist/components/internal/CodeBlock.js.map +1 -0
  45. package/dist/components/internal/Emoji.cjs +12 -4
  46. package/dist/components/internal/Emoji.cjs.map +1 -1
  47. package/dist/components/internal/Emoji.js +12 -4
  48. package/dist/components/internal/Emoji.js.map +1 -1
  49. package/dist/components/internal/Prose.cjs +37 -0
  50. package/dist/components/internal/Prose.cjs.map +1 -0
  51. package/dist/components/internal/Prose.js +35 -0
  52. package/dist/components/internal/Prose.js.map +1 -0
  53. package/dist/icon.cjs +2 -0
  54. package/dist/icon.cjs.map +1 -1
  55. package/dist/icon.js +1 -0
  56. package/dist/icon.js.map +1 -1
  57. package/dist/icons/{Resolve.cjs → CheckCircle.cjs} +3 -3
  58. package/dist/icons/CheckCircle.cjs.map +1 -0
  59. package/dist/icons/{Resolve.js → CheckCircle.js} +3 -3
  60. package/dist/icons/CheckCircle.js.map +1 -0
  61. package/dist/icons/{Resolved.cjs → CheckCircleFill.cjs} +3 -3
  62. package/dist/icons/CheckCircleFill.cjs.map +1 -0
  63. package/dist/icons/{Resolved.js → CheckCircleFill.js} +3 -3
  64. package/dist/icons/CheckCircleFill.js.map +1 -0
  65. package/dist/icons/index.cjs +4 -4
  66. package/dist/icons/index.js +2 -2
  67. package/dist/index.cjs +2 -0
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.cts +68 -14
  70. package/dist/index.d.ts +68 -14
  71. package/dist/index.js +1 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/overrides.cjs +2 -8
  74. package/dist/overrides.cjs.map +1 -1
  75. package/dist/overrides.js +2 -8
  76. package/dist/overrides.js.map +1 -1
  77. package/dist/primitives/AiChatComposer/index.cjs +1 -2
  78. package/dist/primitives/AiChatComposer/index.cjs.map +1 -1
  79. package/dist/primitives/AiChatComposer/index.js +1 -2
  80. package/dist/primitives/AiChatComposer/index.js.map +1 -1
  81. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  82. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  83. package/dist/primitives/AiMessage/contexts.js +15 -0
  84. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  85. package/dist/primitives/AiMessage/index.cjs +133 -0
  86. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  87. package/dist/primitives/AiMessage/index.js +131 -0
  88. package/dist/primitives/AiMessage/index.js.map +1 -0
  89. package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
  90. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  91. package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
  92. package/dist/primitives/Collapsible/index.js.map +1 -0
  93. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +150 -83
  94. package/dist/primitives/Markdown.cjs.map +1 -0
  95. package/dist/primitives/{internal/Markdown.js → Markdown.js} +151 -83
  96. package/dist/primitives/Markdown.js.map +1 -0
  97. package/dist/primitives/index.cjs +4 -6
  98. package/dist/primitives/index.cjs.map +1 -1
  99. package/dist/primitives/index.d.cts +2 -79
  100. package/dist/primitives/index.d.ts +2 -79
  101. package/dist/primitives/index.js +4 -6
  102. package/dist/primitives/index.js.map +1 -1
  103. package/dist/utils/ErrorBoundary.cjs +48 -0
  104. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  105. package/dist/utils/ErrorBoundary.js +45 -0
  106. package/dist/utils/ErrorBoundary.js.map +1 -0
  107. package/dist/utils/use-visible.cjs +63 -45
  108. package/dist/utils/use-visible.cjs.map +1 -1
  109. package/dist/utils/use-visible.js +64 -46
  110. package/dist/utils/use-visible.js.map +1 -1
  111. package/dist/version.cjs +1 -1
  112. package/dist/version.js +1 -1
  113. package/package.json +5 -5
  114. package/src/styles/constants.css +1 -1
  115. package/src/styles/dark/index.css +7 -3
  116. package/src/styles/index.css +584 -238
  117. package/src/styles/utils.css +1 -1
  118. package/styles/dark/attributes.css +1 -1
  119. package/styles/dark/attributes.css.map +1 -1
  120. package/styles/dark/media-query.css +1 -1
  121. package/styles/dark/media-query.css.map +1 -1
  122. package/styles.css +1 -1
  123. package/styles.css.map +1 -1
  124. package/dist/icons/Resolve.cjs.map +0 -1
  125. package/dist/icons/Resolve.js.map +0 -1
  126. package/dist/icons/Resolved.cjs.map +0 -1
  127. package/dist/icons/Resolved.js.map +0 -1
  128. package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
  129. package/dist/primitives/internal/Collapsible/index.js.map +0 -1
  130. package/dist/primitives/internal/Emoji.cjs +0 -32
  131. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  132. package/dist/primitives/internal/Emoji.js +0 -30
  133. package/dist/primitives/internal/Emoji.js.map +0 -1
  134. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  135. package/dist/primitives/internal/Markdown.js.map +0 -1
@@ -1 +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 * 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 ...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 getPendingMessage = useCallback((messages: UiChatMessage[]) => {\n return messages.find(\n (m) => m.role === \"assistant\" && m.status === \"pending\"\n )?.id;\n }, []);\n\n const pendingMessage = useSignal(\n client[kInternal].ai.signals.getChatMessagesForBranchΣ(chatId, branchId),\n getPendingMessage\n );\n\n const lastMessageId = useSignal(\n client[kInternal].ai.signals.getChatMessagesForBranchΣ(chatId, branchId),\n getLastMessageId\n );\n\n const handleComposerSubmit = useCallback(\n (message: { text: string }, event: FormEvent<HTMLFormElement>) => {\n if (pendingMessage !== undefined) {\n event.preventDefault();\n return;\n }\n\n onComposerSubmit?.(message, event);\n if (event.isDefaultPrevented()) return;\n\n client[kInternal].ai.addUserMessageAndAsk(\n chatId,\n lastMessageId,\n message.text,\n {\n stream,\n copilotId,\n }\n );\n },\n [\n onComposerSubmit,\n client,\n chatId,\n lastMessageId,\n pendingMessage,\n stream,\n copilotId,\n ]\n );\n\n return (\n <TooltipProvider>\n <ComposerPrimitive.Form\n className={classNames(\n \"lb-ai-chat-composer lb-ai-chat-composer-form\",\n className\n )}\n chatId={chatId}\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 {pendingMessage === 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(pendingMessage);\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","useSignal","kInternal","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 { 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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"}
@@ -24,6 +24,7 @@ const AiChatComposer = forwardRef(
24
24
  branchId,
25
25
  copilotId,
26
26
  stream = true,
27
+ onUserMessageCreate,
27
28
  ...props
28
29
  }, forwardedRef) => {
29
30
  const $ = useOverrides(overrides);
@@ -34,32 +35,43 @@ const AiChatComposer = forwardRef(
34
35
  return null;
35
36
  return lastMessage.id;
36
37
  }, []);
37
- const getPendingMessage = useCallback((messages) => {
38
+ const getAbortableMessageId = useCallback((messages) => {
38
39
  return messages.find(
39
- (m) => m.role === "assistant" && m.status === "pending"
40
+ (m) => m.role === "assistant" && (m.status === "generating" || m.status === "awaiting-tool")
40
41
  )?.id;
41
42
  }, []);
42
- const pendingMessage = useSignal(
43
- client[kInternal].ai.signals.getChatMessagesForBranch\u03A3(chatId, branchId),
44
- getPendingMessage
45
- );
46
- const lastMessageId = useSignal(
47
- client[kInternal].ai.signals.getChatMessagesForBranch\u03A3(chatId, branchId),
48
- getLastMessageId
43
+ const messages\u03A3 = client[kInternal].ai.signals.getChatMessagesForBranch\u03A3(
44
+ chatId,
45
+ branchId
49
46
  );
47
+ const abortableMessageId = useSignal(messages\u03A3, getAbortableMessageId);
48
+ const lastMessageId = useSignal(messages\u03A3, getLastMessageId);
50
49
  const handleComposerSubmit = useCallback(
51
50
  (message, event) => {
52
- if (pendingMessage !== void 0) {
51
+ if (abortableMessageId !== void 0) {
53
52
  event.preventDefault();
54
53
  return;
55
54
  }
56
55
  onComposerSubmit?.(message, event);
57
56
  if (event.isDefaultPrevented())
58
57
  return;
59
- client[kInternal].ai.addUserMessageAndAsk(
58
+ const content = [{ type: "text", text: message.text }];
59
+ const newMessageId = client[kInternal].ai[kInternal].context.messagesStore.createOptimistically(
60
60
  chatId,
61
+ "user",
61
62
  lastMessageId,
62
- message.text,
63
+ content
64
+ );
65
+ onUserMessageCreate?.({ id: newMessageId });
66
+ const targetMessageId = client[kInternal].ai[kInternal].context.messagesStore.createOptimistically(
67
+ chatId,
68
+ "assistant",
69
+ newMessageId
70
+ );
71
+ client[kInternal].ai.askUserMessageInChat(
72
+ chatId,
73
+ { id: newMessageId, parentMessageId: lastMessageId, content },
74
+ targetMessageId,
63
75
  {
64
76
  stream,
65
77
  copilotId
@@ -68,10 +80,11 @@ const AiChatComposer = forwardRef(
68
80
  },
69
81
  [
70
82
  onComposerSubmit,
83
+ onUserMessageCreate,
71
84
  client,
72
85
  chatId,
73
86
  lastMessageId,
74
- pendingMessage,
87
+ abortableMessageId,
75
88
  stream,
76
89
  copilotId
77
90
  ]
@@ -79,10 +92,9 @@ const AiChatComposer = forwardRef(
79
92
  return /* @__PURE__ */ jsx(TooltipProvider, {
80
93
  children: /* @__PURE__ */ jsx(AiChatComposerForm, {
81
94
  className: classNames(
82
- "lb-ai-chat-composer lb-ai-chat-composer-form",
95
+ "lb-root lb-ai-chat-composer lb-ai-chat-composer-form",
83
96
  className
84
97
  ),
85
- chatId,
86
98
  dir: $.dir,
87
99
  ...props,
88
100
  disabled,
@@ -105,7 +117,7 @@ const AiChatComposer = forwardRef(
105
117
  }),
106
118
  /* @__PURE__ */ jsx("div", {
107
119
  className: "lb-ai-chat-composer-actions",
108
- children: pendingMessage === void 0 ? /* @__PURE__ */ jsx(ShortcutTooltip, {
120
+ children: abortableMessageId === void 0 ? /* @__PURE__ */ jsx(ShortcutTooltip, {
109
121
  content: $.AI_CHAT_COMPOSER_SEND,
110
122
  shortcut: "Enter",
111
123
  children: /* @__PURE__ */ jsx(AiChatComposerSubmit, {
@@ -125,7 +137,7 @@ const AiChatComposer = forwardRef(
125
137
  onPointerDown: (event) => event.preventDefault(),
126
138
  onClick: (event) => {
127
139
  event.stopPropagation();
128
- client[kInternal].ai.abort(pendingMessage);
140
+ client[kInternal].ai.abort(abortableMessageId);
129
141
  },
130
142
  className: "lb-ai-chat-composer-action",
131
143
  variant: "secondary",
@@ -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 * 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 ...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 getPendingMessage = useCallback((messages: UiChatMessage[]) => {\n return messages.find(\n (m) => m.role === \"assistant\" && m.status === \"pending\"\n )?.id;\n }, []);\n\n const pendingMessage = useSignal(\n client[kInternal].ai.signals.getChatMessagesForBranchΣ(chatId, branchId),\n getPendingMessage\n );\n\n const lastMessageId = useSignal(\n client[kInternal].ai.signals.getChatMessagesForBranchΣ(chatId, branchId),\n getLastMessageId\n );\n\n const handleComposerSubmit = useCallback(\n (message: { text: string }, event: FormEvent<HTMLFormElement>) => {\n if (pendingMessage !== undefined) {\n event.preventDefault();\n return;\n }\n\n onComposerSubmit?.(message, event);\n if (event.isDefaultPrevented()) return;\n\n client[kInternal].ai.addUserMessageAndAsk(\n chatId,\n lastMessageId,\n message.text,\n {\n stream,\n copilotId,\n }\n );\n },\n [\n onComposerSubmit,\n client,\n chatId,\n lastMessageId,\n pendingMessage,\n stream,\n copilotId,\n ]\n );\n\n return (\n <TooltipProvider>\n <ComposerPrimitive.Form\n className={classNames(\n \"lb-ai-chat-composer lb-ai-chat-composer-form\",\n className\n )}\n chatId={chatId}\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 {pendingMessage === 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(pendingMessage);\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 { 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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"}
@@ -2,30 +2,37 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var react = require('react');
5
+ require('../../_private/index.cjs');
5
6
  var overrides = require('../../overrides.cjs');
6
7
  var classNames = require('../../utils/class-names.cjs');
8
+ var index = require('../../primitives/AiMessage/index.cjs');
7
9
 
10
+ function PlainTextPart({ part }) {
11
+ return /* @__PURE__ */ jsxRuntime.jsx("p", {
12
+ children: part.text
13
+ });
14
+ }
8
15
  const AiChatUserMessage = react.memo(
9
16
  react.forwardRef(
10
17
  ({ message, className, overrides: overrides$1 }, forwardedRef) => {
11
18
  const $ = overrides.useOverrides(overrides$1);
12
- const paragraphs = message.content.filter((c) => c.type === "text").map((c) => c.text);
13
19
  return /* @__PURE__ */ jsxRuntime.jsx("div", {
14
20
  ref: forwardedRef,
15
21
  className: classNames.classNames(
16
22
  "lb-ai-chat-message lb-ai-chat-user-message",
17
23
  className
18
24
  ),
19
- children: /* @__PURE__ */ jsxRuntime.jsx("div", {
25
+ children: message.deletedAt !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", {
26
+ className: "lb-ai-chat-message-deleted",
27
+ children: $.AI_CHAT_MESSAGE_DELETED
28
+ }) : /* @__PURE__ */ jsxRuntime.jsx("div", {
20
29
  className: "lb-ai-chat-message-content",
21
- children: message.deletedAt !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", {
22
- className: "lb-ai-chat-message-deleted",
23
- children: $.AI_CHAT_MESSAGE_DELETED
24
- }) : /* @__PURE__ */ jsxRuntime.jsx("div", {
25
- className: "lb-ai-chat-message-text",
26
- children: paragraphs.map((text, index) => /* @__PURE__ */ jsxRuntime.jsx("p", {
27
- children: text
28
- }, index))
30
+ children: /* @__PURE__ */ jsxRuntime.jsx(index.Content, {
31
+ message,
32
+ components: {
33
+ TextPart: PlainTextPart
34
+ },
35
+ className: "lb-prose lb-ai-chat-message-text"
29
36
  })
30
37
  })
31
38
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AiChatUserMessage.cjs","sources":["../../../src/components/internal/AiChatUserMessage.tsx"],"sourcesContent":["import type { UiUserMessage } from \"@liveblocks/core\";\nimport type { ComponentProps } from \"react\";\nimport { forwardRef, memo } from \"react\";\n\nimport { type GlobalOverrides, useOverrides } from \"../../overrides\";\nimport { classNames } from \"../../utils/class-names\";\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\nexport const AiChatUserMessage = memo(\n forwardRef<HTMLDivElement, AiChatUserMessageProps>(\n ({ message, className, overrides }, forwardedRef) => {\n const $ = useOverrides(overrides);\n const paragraphs = message.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text);\n\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 <div className=\"lb-ai-chat-message-content\">\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-text\">\n {/* Mimic the structure of assistant messages even though there's no rich text here yet. */}\n {paragraphs.map((text, index) => (\n <p key={index}>{text}</p>\n ))}\n </div>\n )}\n </div>\n {/* <div className=\"lb-ai-chat-message-actions\" /> */}\n </div>\n );\n }\n )\n);\n"],"names":["memo","forwardRef","overrides","useOverrides","jsx","classNames"],"mappings":";;;;;;;AAqBO,MAAM,iBAAoB,GAAAA,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,MAAM,UAAa,GAAA,OAAA,CAAQ,OACxB,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,IAAS,KAAA,MAAM,CAC/B,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAA;AAEpB,MAAA,uBACGE,cAAA,CAAA,KAAA,EAAA;AAAA,QACC,GAAK,EAAA,YAAA;AAAA,QACL,SAAW,EAAAC,qBAAA;AAAA,UACT,4CAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,QAEA,QAAC,kBAAAD,cAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACZ,QAAA,EAAA,OAAA,CAAQ,SAAc,KAAA,KAAA,CAAA,mBACpBA,cAAA,CAAA,KAAA,EAAA;AAAA,YAAI,SAAU,EAAA,4BAAA;AAAA,YACZ,QAAE,EAAA,CAAA,CAAA,uBAAA;AAAA,WACL,oBAECA,cAAA,CAAA,KAAA,EAAA;AAAA,YAAI,SAAU,EAAA,yBAAA;AAAA,YAEZ,QAAW,EAAA,UAAA,CAAA,GAAA,CAAI,CAAC,IAAA,EAAM,0BACpBA,cAAA,CAAA,GAAA,EAAA;AAAA,cAAe,QAAA,EAAA,IAAA;AAAA,aAAA,EAAR,KAAa,CACtB,CAAA;AAAA,WACH,CAAA;AAAA,SAEJ,CAAA;AAAA,OAEF,CAAA,CAAA;AAAA,KAEJ;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"AiChatUserMessage.cjs","sources":["../../../src/components/internal/AiChatUserMessage.tsx"],"sourcesContent":["import type { AiTextPart, UiUserMessage } 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\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":";;;;;;;;;AA0BA,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,29 +1,36 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { memo, forwardRef } from 'react';
3
+ import '../../_private/index.js';
3
4
  import { useOverrides } from '../../overrides.js';
4
5
  import { classNames } from '../../utils/class-names.js';
6
+ import { Content as AiMessageContent } from '../../primitives/AiMessage/index.js';
5
7
 
8
+ function PlainTextPart({ part }) {
9
+ return /* @__PURE__ */ jsx("p", {
10
+ children: part.text
11
+ });
12
+ }
6
13
  const AiChatUserMessage = memo(
7
14
  forwardRef(
8
15
  ({ message, className, overrides }, forwardedRef) => {
9
16
  const $ = useOverrides(overrides);
10
- const paragraphs = message.content.filter((c) => c.type === "text").map((c) => c.text);
11
17
  return /* @__PURE__ */ jsx("div", {
12
18
  ref: forwardedRef,
13
19
  className: classNames(
14
20
  "lb-ai-chat-message lb-ai-chat-user-message",
15
21
  className
16
22
  ),
17
- children: /* @__PURE__ */ jsx("div", {
23
+ children: message.deletedAt !== void 0 ? /* @__PURE__ */ jsx("div", {
24
+ className: "lb-ai-chat-message-deleted",
25
+ children: $.AI_CHAT_MESSAGE_DELETED
26
+ }) : /* @__PURE__ */ jsx("div", {
18
27
  className: "lb-ai-chat-message-content",
19
- children: message.deletedAt !== void 0 ? /* @__PURE__ */ jsx("div", {
20
- className: "lb-ai-chat-message-deleted",
21
- children: $.AI_CHAT_MESSAGE_DELETED
22
- }) : /* @__PURE__ */ jsx("div", {
23
- className: "lb-ai-chat-message-text",
24
- children: paragraphs.map((text, index) => /* @__PURE__ */ jsx("p", {
25
- children: text
26
- }, index))
28
+ children: /* @__PURE__ */ jsx(AiMessageContent, {
29
+ message,
30
+ components: {
31
+ TextPart: PlainTextPart
32
+ },
33
+ className: "lb-prose lb-ai-chat-message-text"
27
34
  })
28
35
  })
29
36
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AiChatUserMessage.js","sources":["../../../src/components/internal/AiChatUserMessage.tsx"],"sourcesContent":["import type { UiUserMessage } from \"@liveblocks/core\";\nimport type { ComponentProps } from \"react\";\nimport { forwardRef, memo } from \"react\";\n\nimport { type GlobalOverrides, useOverrides } from \"../../overrides\";\nimport { classNames } from \"../../utils/class-names\";\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\nexport const AiChatUserMessage = memo(\n forwardRef<HTMLDivElement, AiChatUserMessageProps>(\n ({ message, className, overrides }, forwardedRef) => {\n const $ = useOverrides(overrides);\n const paragraphs = message.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text);\n\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 <div className=\"lb-ai-chat-message-content\">\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-text\">\n {/* Mimic the structure of assistant messages even though there's no rich text here yet. */}\n {paragraphs.map((text, index) => (\n <p key={index}>{text}</p>\n ))}\n </div>\n )}\n </div>\n {/* <div className=\"lb-ai-chat-message-actions\" /> */}\n </div>\n );\n }\n )\n);\n"],"names":[],"mappings":";;;;;AAqBO,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,MAAM,UAAa,GAAA,OAAA,CAAQ,OACxB,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,IAAS,KAAA,MAAM,CAC/B,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAA;AAEpB,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,QAEA,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,UAAI,SAAU,EAAA,4BAAA;AAAA,UACZ,QAAA,EAAA,OAAA,CAAQ,SAAc,KAAA,KAAA,CAAA,mBACpB,GAAA,CAAA,KAAA,EAAA;AAAA,YAAI,SAAU,EAAA,4BAAA;AAAA,YACZ,QAAE,EAAA,CAAA,CAAA,uBAAA;AAAA,WACL,oBAEC,GAAA,CAAA,KAAA,EAAA;AAAA,YAAI,SAAU,EAAA,yBAAA;AAAA,YAEZ,QAAW,EAAA,UAAA,CAAA,GAAA,CAAI,CAAC,IAAA,EAAM,0BACpB,GAAA,CAAA,GAAA,EAAA;AAAA,cAAe,QAAA,EAAA,IAAA;AAAA,aAAA,EAAR,KAAa,CACtB,CAAA;AAAA,WACH,CAAA;AAAA,SAEJ,CAAA;AAAA,OAEF,CAAA,CAAA;AAAA,KAEJ;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"AiChatUserMessage.js","sources":["../../../src/components/internal/AiChatUserMessage.tsx"],"sourcesContent":["import type { AiTextPart, UiUserMessage } 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\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":";;;;;;;AA0BA,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;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Button.cjs","sources":["../../../src/components/internal/Button.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { ChevronDownIcon } from \"../../icons/ChevronDown\";\nimport { classNames } from \"../../utils/class-names\";\n\nexport interface ButtonProps extends ComponentProps<\"button\"> {\n variant?: \"default\" | \"toolbar\" | \"outline\" | \"primary\" | \"secondary\";\n size?: \"default\" | \"large\";\n disableable?: boolean;\n icon?: ReactNode;\n}\n\nexport const CustomButton = forwardRef<\n HTMLButtonElement,\n Omit<ButtonProps, \"icon\">\n>(\n (\n {\n variant = \"default\",\n size = \"default\",\n disableable = true,\n className,\n children,\n ...props\n },\n forwardedRef\n ) => {\n return (\n <button\n type=\"button\"\n className={classNames(\n \"lb-button\",\n !disableable && \"lb-button:non-disableable\",\n className\n )}\n data-variant={variant}\n data-size={size}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </button>\n );\n }\n);\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ icon, children, ...props }, forwardedRef) => {\n return (\n <CustomButton {...props} ref={forwardedRef}>\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? <span className=\"lb-button-label\">{children}</span> : null}\n </CustomButton>\n );\n }\n);\n\nexport const SelectButton = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ icon, children, className, ...props }, forwardedRef) => {\n return (\n <CustomButton\n {...props}\n type=\"button\"\n className={classNames(\"lb-select-button\", className)}\n ref={forwardedRef}\n >\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? <span className=\"lb-button-label\">{children}</span> : null}\n <span className=\"lb-select-button-chevron\">\n <ChevronDownIcon />\n </span>\n </CustomButton>\n );\n }\n);\n"],"names":[],"mappings":";;;;;;;;;AAeO;AAAqB;AAKxB;AACY;AACH;AACO;AACd;AACA;AACG;AAIL;AACG;AACM;AACM;AACT;AACgB;AAChB;AACF;AACc;AACH;AACP;AACC;AAEJ;AACH;AAGN;AAEO;AAAe;AAElB;AACG;AAAiB;AAAY;AAC3B;AAAQ;AAAe;AAAqB;AAAe;AAC/C;AAAe;AAAmB;AAAmB;AAAA;AACpE;AAGN;AAEO;AAAqB;AAExB;AACG;AACK;AACC;AAC8C;AAC9C;AAEJ;AAAQ;AAAe;AAAqB;AAAe;AAC/C;AAAe;AAAmB;AAAmB;AACjE;AAAe;AACG;AACnB;AAAA;AACF;AAGN;;;;"}
1
+ {"version":3,"file":"Button.cjs","sources":["../../../src/components/internal/Button.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { ChevronDownIcon } from \"../../icons/ChevronDown\";\nimport { classNames } from \"../../utils/class-names\";\n\nexport interface ButtonProps extends ComponentProps<\"button\"> {\n variant?:\n | \"default\"\n | \"toolbar\"\n | \"outline\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\";\n size?: \"default\" | \"large\";\n disableable?: boolean;\n icon?: ReactNode;\n}\n\nexport const CustomButton = forwardRef<\n HTMLButtonElement,\n Omit<ButtonProps, \"icon\">\n>(\n (\n {\n variant = \"default\",\n size = \"default\",\n disableable = true,\n className,\n children,\n ...props\n },\n forwardedRef\n ) => {\n return (\n <button\n type=\"button\"\n className={classNames(\n \"lb-button\",\n !disableable && \"lb-button:non-disableable\",\n className\n )}\n data-variant={variant}\n data-size={size}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </button>\n );\n }\n);\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ icon, children, ...props }, forwardedRef) => {\n return (\n <CustomButton {...props} ref={forwardedRef}>\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? <span className=\"lb-button-label\">{children}</span> : null}\n </CustomButton>\n );\n }\n);\n\nexport const SelectButton = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ icon, children, className, ...props }, forwardedRef) => {\n return (\n <CustomButton\n {...props}\n type=\"button\"\n className={classNames(\"lb-select-button\", className)}\n ref={forwardedRef}\n >\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? <span className=\"lb-button-label\">{children}</span> : null}\n <span className=\"lb-select-button-chevron\">\n <ChevronDownIcon />\n </span>\n </CustomButton>\n );\n }\n);\n"],"names":[],"mappings":";;;;;;;;;AAqBO;AAAqB;AAKxB;AACY;AACH;AACO;AACd;AACA;AACG;AAIL;AACG;AACM;AACM;AACT;AACgB;AAChB;AACF;AACc;AACH;AACP;AACC;AAEJ;AACH;AAGN;AAEO;AAAe;AAElB;AACG;AAAiB;AAAY;AAC3B;AAAQ;AAAe;AAAqB;AAAe;AAC/C;AAAe;AAAmB;AAAmB;AAAA;AACpE;AAGN;AAEO;AAAqB;AAExB;AACG;AACK;AACC;AAC8C;AAC9C;AAEJ;AAAQ;AAAe;AAAqB;AAAe;AAC/C;AAAe;AAAmB;AAAmB;AACjE;AAAe;AACG;AACnB;AAAA;AACF;AAGN;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../../src/components/internal/Button.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { ChevronDownIcon } from \"../../icons/ChevronDown\";\nimport { classNames } from \"../../utils/class-names\";\n\nexport interface ButtonProps extends ComponentProps<\"button\"> {\n variant?: \"default\" | \"toolbar\" | \"outline\" | \"primary\" | \"secondary\";\n size?: \"default\" | \"large\";\n disableable?: boolean;\n icon?: ReactNode;\n}\n\nexport const CustomButton = forwardRef<\n HTMLButtonElement,\n Omit<ButtonProps, \"icon\">\n>(\n (\n {\n variant = \"default\",\n size = \"default\",\n disableable = true,\n className,\n children,\n ...props\n },\n forwardedRef\n ) => {\n return (\n <button\n type=\"button\"\n className={classNames(\n \"lb-button\",\n !disableable && \"lb-button:non-disableable\",\n className\n )}\n data-variant={variant}\n data-size={size}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </button>\n );\n }\n);\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ icon, children, ...props }, forwardedRef) => {\n return (\n <CustomButton {...props} ref={forwardedRef}>\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? <span className=\"lb-button-label\">{children}</span> : null}\n </CustomButton>\n );\n }\n);\n\nexport const SelectButton = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ icon, children, className, ...props }, forwardedRef) => {\n return (\n <CustomButton\n {...props}\n type=\"button\"\n className={classNames(\"lb-select-button\", className)}\n ref={forwardedRef}\n >\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? <span className=\"lb-button-label\">{children}</span> : null}\n <span className=\"lb-select-button-chevron\">\n <ChevronDownIcon />\n </span>\n </CustomButton>\n );\n }\n);\n"],"names":[],"mappings":";;;;;;;AAeO;AAAqB;AAKxB;AACY;AACH;AACO;AACd;AACA;AACG;AAIL;AACG;AACM;AACM;AACT;AACgB;AAChB;AACF;AACc;AACH;AACP;AACC;AAEJ;AACH;AAGN;AAEO;AAAe;AAElB;AACG;AAAiB;AAAY;AAC3B;AAAQ;AAAe;AAAqB;AAAe;AAC/C;AAAe;AAAmB;AAAmB;AAAA;AACpE;AAGN;AAEO;AAAqB;AAExB;AACG;AACK;AACC;AAC8C;AAC9C;AAEJ;AAAQ;AAAe;AAAqB;AAAe;AAC/C;AAAe;AAAmB;AAAmB;AACjE;AAAe;AACG;AACnB;AAAA;AACF;AAGN;;"}
1
+ {"version":3,"file":"Button.js","sources":["../../../src/components/internal/Button.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\n\nimport { ChevronDownIcon } from \"../../icons/ChevronDown\";\nimport { classNames } from \"../../utils/class-names\";\n\nexport interface ButtonProps extends ComponentProps<\"button\"> {\n variant?:\n | \"default\"\n | \"toolbar\"\n | \"outline\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\";\n size?: \"default\" | \"large\";\n disableable?: boolean;\n icon?: ReactNode;\n}\n\nexport const CustomButton = forwardRef<\n HTMLButtonElement,\n Omit<ButtonProps, \"icon\">\n>(\n (\n {\n variant = \"default\",\n size = \"default\",\n disableable = true,\n className,\n children,\n ...props\n },\n forwardedRef\n ) => {\n return (\n <button\n type=\"button\"\n className={classNames(\n \"lb-button\",\n !disableable && \"lb-button:non-disableable\",\n className\n )}\n data-variant={variant}\n data-size={size}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </button>\n );\n }\n);\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ icon, children, ...props }, forwardedRef) => {\n return (\n <CustomButton {...props} ref={forwardedRef}>\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? <span className=\"lb-button-label\">{children}</span> : null}\n </CustomButton>\n );\n }\n);\n\nexport const SelectButton = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ icon, children, className, ...props }, forwardedRef) => {\n return (\n <CustomButton\n {...props}\n type=\"button\"\n className={classNames(\"lb-select-button\", className)}\n ref={forwardedRef}\n >\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? <span className=\"lb-button-label\">{children}</span> : null}\n <span className=\"lb-select-button-chevron\">\n <ChevronDownIcon />\n </span>\n </CustomButton>\n );\n }\n);\n"],"names":[],"mappings":";;;;;;;AAqBO;AAAqB;AAKxB;AACY;AACH;AACO;AACd;AACA;AACG;AAIL;AACG;AACM;AACM;AACT;AACgB;AAChB;AACF;AACc;AACH;AACP;AACC;AAEJ;AACH;AAGN;AAEO;AAAe;AAElB;AACG;AAAiB;AAAY;AAC3B;AAAQ;AAAe;AAAqB;AAAe;AAC/C;AAAe;AAAmB;AAAmB;AAAA;AACpE;AAGN;AAEO;AAAqB;AAExB;AACG;AACK;AACC;AAC8C;AAC9C;AAEJ;AAAQ;AAAe;AAAqB;AAAe;AAC/C;AAAe;AAAmB;AAAmB;AACjE;AAAe;AACG;AACnB;AAAA;AACF;AAGN;;"}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ require('../../icons/index.cjs');
6
+ var Button = require('./Button.cjs');
7
+ var Tooltip = require('./Tooltip.cjs');
8
+ var TooltipPrimitive = require('@radix-ui/react-tooltip');
9
+ var Check = require('../../icons/Check.cjs');
10
+ var Copy = require('../../icons/Copy.cjs');
11
+
12
+ const COPY_DELAY = 1500;
13
+ function CodeBlock({ title, code }) {
14
+ const [isCopied, setCopied] = react.useState(false);
15
+ const timeoutRef = react.useRef(null);
16
+ react.useEffect(() => {
17
+ if (isCopied) {
18
+ timeoutRef.current = setTimeout(() => {
19
+ setCopied(false);
20
+ }, COPY_DELAY);
21
+ }
22
+ return () => {
23
+ if (timeoutRef.current) {
24
+ clearTimeout(timeoutRef.current);
25
+ }
26
+ };
27
+ }, [isCopied]);
28
+ const handleCopy = react.useCallback(() => {
29
+ try {
30
+ navigator.clipboard.writeText(code);
31
+ setCopied(true);
32
+ } catch (error) {
33
+ console.error(error);
34
+ }
35
+ }, [code]);
36
+ return /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive.TooltipProvider, {
37
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", {
38
+ className: "lb-code-block",
39
+ children: [
40
+ /* @__PURE__ */ jsxRuntime.jsxs("div", {
41
+ className: "lb-code-block-header",
42
+ children: [
43
+ /* @__PURE__ */ jsxRuntime.jsx("span", {
44
+ className: "lb-code-block-title",
45
+ children: title
46
+ }),
47
+ /* @__PURE__ */ jsxRuntime.jsx("div", {
48
+ className: "lb-code-block-header-actions",
49
+ children: /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, {
50
+ content: isCopied ? null : "Copy",
51
+ children: /* @__PURE__ */ jsxRuntime.jsx(Button.Button, {
52
+ className: "lb-code-block-header-action",
53
+ icon: isCopied ? /* @__PURE__ */ jsxRuntime.jsx(Check.CheckIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(Copy.CopyIcon, {}),
54
+ onClick: handleCopy
55
+ })
56
+ })
57
+ })
58
+ ]
59
+ }),
60
+ /* @__PURE__ */ jsxRuntime.jsx("pre", {
61
+ className: "lb-code-block-content",
62
+ children: /* @__PURE__ */ jsxRuntime.jsx("code", {
63
+ children: code
64
+ })
65
+ })
66
+ ]
67
+ })
68
+ });
69
+ }
70
+
71
+ exports.CodeBlock = CodeBlock;
72
+ //# sourceMappingURL=CodeBlock.cjs.map
@@ -0,0 +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 : \"Copy\"}>\n <Button\n className=\"lb-code-block-header-action\"\n icon={isCopied ? <CheckIcon /> : <CopyIcon />}\n onClick={handleCopy}\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":["useState","useRef","useEffect","useCallback","jsx","TooltipProvider","jsxs","Tooltip","Button","CheckIcon","CopyIcon"],"mappings":";;;;;;;;;;;AAOA,MAAM,UAAa,GAAA,IAAA,CAAA;AAOZ,SAAS,SAAU,CAAA,EAAE,KAAO,EAAA,IAAA,EAAwB,EAAA;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,SAAS,CAAA,GAAIA,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,WAAW,IAAO,GAAA,MAAA;AAAA,gBAClC,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,iBACX,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;;;;"}
@@ -0,0 +1,70 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState, useRef, useEffect, useCallback } from 'react';
3
+ import '../../icons/index.js';
4
+ import { Button } from './Button.js';
5
+ import { Tooltip } from './Tooltip.js';
6
+ import { TooltipProvider } from '@radix-ui/react-tooltip';
7
+ import { CheckIcon } from '../../icons/Check.js';
8
+ import { CopyIcon } from '../../icons/Copy.js';
9
+
10
+ const COPY_DELAY = 1500;
11
+ function CodeBlock({ title, code }) {
12
+ const [isCopied, setCopied] = useState(false);
13
+ const timeoutRef = useRef(null);
14
+ useEffect(() => {
15
+ if (isCopied) {
16
+ timeoutRef.current = setTimeout(() => {
17
+ setCopied(false);
18
+ }, COPY_DELAY);
19
+ }
20
+ return () => {
21
+ if (timeoutRef.current) {
22
+ clearTimeout(timeoutRef.current);
23
+ }
24
+ };
25
+ }, [isCopied]);
26
+ const handleCopy = useCallback(() => {
27
+ try {
28
+ navigator.clipboard.writeText(code);
29
+ setCopied(true);
30
+ } catch (error) {
31
+ console.error(error);
32
+ }
33
+ }, [code]);
34
+ return /* @__PURE__ */ jsx(TooltipProvider, {
35
+ children: /* @__PURE__ */ jsxs("div", {
36
+ className: "lb-code-block",
37
+ children: [
38
+ /* @__PURE__ */ jsxs("div", {
39
+ className: "lb-code-block-header",
40
+ children: [
41
+ /* @__PURE__ */ jsx("span", {
42
+ className: "lb-code-block-title",
43
+ children: title
44
+ }),
45
+ /* @__PURE__ */ jsx("div", {
46
+ className: "lb-code-block-header-actions",
47
+ children: /* @__PURE__ */ jsx(Tooltip, {
48
+ content: isCopied ? null : "Copy",
49
+ children: /* @__PURE__ */ jsx(Button, {
50
+ className: "lb-code-block-header-action",
51
+ icon: isCopied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {}),
52
+ onClick: handleCopy
53
+ })
54
+ })
55
+ })
56
+ ]
57
+ }),
58
+ /* @__PURE__ */ jsx("pre", {
59
+ className: "lb-code-block-content",
60
+ children: /* @__PURE__ */ jsx("code", {
61
+ children: code
62
+ })
63
+ })
64
+ ]
65
+ })
66
+ });
67
+ }
68
+
69
+ export { CodeBlock };
70
+ //# sourceMappingURL=CodeBlock.js.map
@@ -0,0 +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 : \"Copy\"}>\n <Button\n className=\"lb-code-block-header-action\"\n icon={isCopied ? <CheckIcon /> : <CopyIcon />}\n onClick={handleCopy}\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":";;;;;;;;;AAOA,MAAM,UAAa,GAAA,IAAA,CAAA;AAOZ,SAAS,SAAU,CAAA,EAAE,KAAO,EAAA,IAAA,EAAwB,EAAA;AACzD,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,WAAW,IAAO,GAAA,MAAA;AAAA,gBAClC,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,iBACX,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;;;;"}
@@ -2,15 +2,23 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var react = require('react');
5
- var Emoji$1 = require('../../primitives/internal/Emoji.cjs');
5
+ var constants = require('../../constants.cjs');
6
6
  var classNames = require('../../utils/class-names.cjs');
7
7
 
8
8
  const Emoji = react.forwardRef(
9
- ({ className, ...props }, forwardedRef) => {
10
- return /* @__PURE__ */ jsxRuntime.jsx(Emoji$1.Emoji, {
9
+ ({ emoji, className, style, ...props }, forwardedRef) => {
10
+ return /* @__PURE__ */ jsxRuntime.jsx("span", {
11
+ role: "img",
12
+ "aria-label": emoji,
13
+ "data-emoji": emoji,
11
14
  className: classNames.classNames("lb-emoji", className),
15
+ style: {
16
+ ...style,
17
+ fontFamily: constants.EMOJI_FONT_FAMILY
18
+ },
12
19
  ...props,
13
- ref: forwardedRef
20
+ ref: forwardedRef,
21
+ children: emoji
14
22
  });
15
23
  }
16
24
  );
@@ -1 +1 @@
1
- {"version":3,"file":"Emoji.cjs","sources":["../../../src/components/internal/Emoji.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\n\nimport type { EmojiProps as EmojiPrimitiveProps } from \"../../primitives/internal/Emoji\";\nimport { Emoji as EmojiPrimitive } from \"../../primitives/internal/Emoji\";\nimport { classNames } from \"../../utils/class-names\";\n\nexport const Emoji = forwardRef<HTMLSpanElement, EmojiPrimitiveProps>(\n ({ className, ...props }, forwardedRef) => {\n return (\n <EmojiPrimitive\n className={classNames(\"lb-emoji\", className)}\n {...props}\n ref={forwardedRef}\n />\n );\n }\n);\n"],"names":["forwardRef","jsx","EmojiPrimitive","classNames"],"mappings":";;;;;;;AAMO,MAAM,KAAQ,GAAAA,gBAAA;AAAA,EACnB,CAAC,EAAE,SAAc,EAAA,GAAA,KAAA,IAAS,YAAiB,KAAA;AACzC,IAAA,uBACGC,cAAA,CAAAC,aAAA,EAAA;AAAA,MACC,SAAA,EAAWC,qBAAW,CAAA,UAAA,EAAY,SAAS,CAAA;AAAA,MAC1C,GAAG,KAAA;AAAA,MACJ,GAAK,EAAA,YAAA;AAAA,KACP,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"Emoji.cjs","sources":["../../../src/components/internal/Emoji.tsx"],"sourcesContent":["import { type ComponentProps, forwardRef } from \"react\";\n\nimport { EMOJI_FONT_FAMILY } from \"../../constants\";\nimport { classNames } from \"../../utils/class-names\";\n\ninterface EmojiProps extends ComponentProps<\"span\"> {\n emoji: string;\n}\n\nexport const Emoji = forwardRef<HTMLSpanElement, EmojiProps>(\n ({ emoji, className, style, ...props }, forwardedRef) => {\n return (\n <span\n role=\"img\"\n aria-label={emoji}\n data-emoji={emoji}\n className={classNames(\"lb-emoji\", className)}\n style={{\n ...style,\n fontFamily: EMOJI_FONT_FAMILY,\n }}\n {...props}\n ref={forwardedRef}\n >\n {emoji}\n </span>\n );\n }\n);\n"],"names":["forwardRef","jsx","classNames","EMOJI_FONT_FAMILY"],"mappings":";;;;;;;AASO,MAAM,KAAQ,GAAAA,gBAAA;AAAA,EACnB,CAAC,EAAE,KAAA,EAAO,WAAW,KAAU,EAAA,GAAA,KAAA,IAAS,YAAiB,KAAA;AACvD,IAAA,uBACGC,cAAA,CAAA,MAAA,EAAA;AAAA,MACC,IAAK,EAAA,KAAA;AAAA,MACL,YAAY,EAAA,KAAA;AAAA,MACZ,YAAY,EAAA,KAAA;AAAA,MACZ,SAAA,EAAWC,qBAAW,CAAA,UAAA,EAAY,SAAS,CAAA;AAAA,MAC3C,KAAO,EAAA;AAAA,QACL,GAAG,KAAA;AAAA,QACH,UAAY,EAAAC,2BAAA;AAAA,OACd;AAAA,MACC,GAAG,KAAA;AAAA,MACJ,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAA,EAAA,KAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}