@crafter/rn-ai-elements 0.0.1
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/lib/commonjs/chatbot/AIImage.js +126 -0
- package/lib/commonjs/chatbot/AIImage.js.map +1 -0
- package/lib/commonjs/chatbot/Attachments.js +317 -0
- package/lib/commonjs/chatbot/Attachments.js.map +1 -0
- package/lib/commonjs/chatbot/ChatErrorBoundary.js +201 -0
- package/lib/commonjs/chatbot/ChatErrorBoundary.js.map +1 -0
- package/lib/commonjs/chatbot/ChatMessageItem.js +169 -0
- package/lib/commonjs/chatbot/ChatMessageItem.js.map +1 -0
- package/lib/commonjs/chatbot/Conversation.js +415 -0
- package/lib/commonjs/chatbot/Conversation.js.map +1 -0
- package/lib/commonjs/chatbot/ConversationScrollButton.js +131 -0
- package/lib/commonjs/chatbot/ConversationScrollButton.js.map +1 -0
- package/lib/commonjs/chatbot/Message.js +203 -0
- package/lib/commonjs/chatbot/Message.js.map +1 -0
- package/lib/commonjs/chatbot/PromptInput.js +352 -0
- package/lib/commonjs/chatbot/PromptInput.js.map +1 -0
- package/lib/commonjs/chatbot/Reasoning.js +184 -0
- package/lib/commonjs/chatbot/Reasoning.js.map +1 -0
- package/lib/commonjs/chatbot/Shimmer.js +116 -0
- package/lib/commonjs/chatbot/Shimmer.js.map +1 -0
- package/lib/commonjs/chatbot/Sources.js +212 -0
- package/lib/commonjs/chatbot/Sources.js.map +1 -0
- package/lib/commonjs/chatbot/Suggestion.js +99 -0
- package/lib/commonjs/chatbot/Suggestion.js.map +1 -0
- package/lib/commonjs/chatbot/Tool.js +307 -0
- package/lib/commonjs/chatbot/Tool.js.map +1 -0
- package/lib/commonjs/chatbot/adapters/uiMessageAdapter.js +141 -0
- package/lib/commonjs/chatbot/adapters/uiMessageAdapter.js.map +1 -0
- package/lib/commonjs/chatbot/index.js +140 -0
- package/lib/commonjs/chatbot/index.js.map +1 -0
- package/lib/commonjs/chatbot/types.js +6 -0
- package/lib/commonjs/chatbot/types.js.map +1 -0
- package/lib/commonjs/hooks/index.js +34 -0
- package/lib/commonjs/hooks/index.js.map +1 -0
- package/lib/commonjs/hooks/useAutoScroll.js +39 -0
- package/lib/commonjs/hooks/useAutoScroll.js.map +1 -0
- package/lib/commonjs/hooks/useClipboard.js +44 -0
- package/lib/commonjs/hooks/useClipboard.js.map +1 -0
- package/lib/commonjs/hooks/useCollapsible.js +35 -0
- package/lib/commonjs/hooks/useCollapsible.js.map +1 -0
- package/lib/commonjs/hooks/useStickToBottom.js +68 -0
- package/lib/commonjs/hooks/useStickToBottom.js.map +1 -0
- package/lib/commonjs/index.js +257 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/primitives/Badge.js +119 -0
- package/lib/commonjs/primitives/Badge.js.map +1 -0
- package/lib/commonjs/primitives/Button.js +185 -0
- package/lib/commonjs/primitives/Button.js.map +1 -0
- package/lib/commonjs/primitives/Card.js +166 -0
- package/lib/commonjs/primitives/Card.js.map +1 -0
- package/lib/commonjs/primitives/Collapsible.js +137 -0
- package/lib/commonjs/primitives/Collapsible.js.map +1 -0
- package/lib/commonjs/primitives/ScrollArea.js +40 -0
- package/lib/commonjs/primitives/ScrollArea.js.map +1 -0
- package/lib/commonjs/primitives/index.js +83 -0
- package/lib/commonjs/primitives/index.js.map +1 -0
- package/lib/commonjs/streaming/StreamingMarkdown.js +252 -0
- package/lib/commonjs/streaming/StreamingMarkdown.js.map +1 -0
- package/lib/commonjs/streaming/index.js +13 -0
- package/lib/commonjs/streaming/index.js.map +1 -0
- package/lib/commonjs/streaming/parser.js +482 -0
- package/lib/commonjs/streaming/parser.js.map +1 -0
- package/lib/commonjs/streaming/renderers/BlockquoteRenderer.js +35 -0
- package/lib/commonjs/streaming/renderers/BlockquoteRenderer.js.map +1 -0
- package/lib/commonjs/streaming/renderers/CodeRenderer.js +128 -0
- package/lib/commonjs/streaming/renderers/CodeRenderer.js.map +1 -0
- package/lib/commonjs/streaming/renderers/HeadingRenderer.js +61 -0
- package/lib/commonjs/streaming/renderers/HeadingRenderer.js.map +1 -0
- package/lib/commonjs/streaming/renderers/ImageRenderer.js +53 -0
- package/lib/commonjs/streaming/renderers/ImageRenderer.js.map +1 -0
- package/lib/commonjs/streaming/renderers/LinkRenderer.js +49 -0
- package/lib/commonjs/streaming/renderers/LinkRenderer.js.map +1 -0
- package/lib/commonjs/streaming/renderers/ListRenderer.js +63 -0
- package/lib/commonjs/streaming/renderers/ListRenderer.js.map +1 -0
- package/lib/commonjs/streaming/renderers/TableRenderer.js +77 -0
- package/lib/commonjs/streaming/renderers/TableRenderer.js.map +1 -0
- package/lib/commonjs/streaming/renderers/TextRenderer.js +41 -0
- package/lib/commonjs/streaming/renderers/TextRenderer.js.map +1 -0
- package/lib/commonjs/streaming/renderers/index.js +76 -0
- package/lib/commonjs/streaming/renderers/index.js.map +1 -0
- package/lib/commonjs/streaming/renderers/renderInlineChildren.js +112 -0
- package/lib/commonjs/streaming/renderers/renderInlineChildren.js.map +1 -0
- package/lib/commonjs/streaming/renderers/renderNode.js +81 -0
- package/lib/commonjs/streaming/renderers/renderNode.js.map +1 -0
- package/lib/commonjs/theme/ThemeProvider.js +68 -0
- package/lib/commonjs/theme/ThemeProvider.js.map +1 -0
- package/lib/commonjs/theme/defaultTheme.js +96 -0
- package/lib/commonjs/theme/defaultTheme.js.map +1 -0
- package/lib/commonjs/theme/index.js +32 -0
- package/lib/commonjs/theme/index.js.map +1 -0
- package/lib/commonjs/theme/tokens.js +2 -0
- package/lib/commonjs/theme/tokens.js.map +1 -0
- package/lib/commonjs/types.d.js +2 -0
- package/lib/commonjs/types.d.js.map +1 -0
- package/lib/commonjs/voice/index.js +13 -0
- package/lib/commonjs/voice/index.js.map +1 -0
- package/lib/commonjs/voice/useSpeechRecognition.js +172 -0
- package/lib/commonjs/voice/useSpeechRecognition.js.map +1 -0
- package/lib/module/chatbot/AIImage.js +121 -0
- package/lib/module/chatbot/AIImage.js.map +1 -0
- package/lib/module/chatbot/Attachments.js +312 -0
- package/lib/module/chatbot/Attachments.js.map +1 -0
- package/lib/module/chatbot/ChatErrorBoundary.js +196 -0
- package/lib/module/chatbot/ChatErrorBoundary.js.map +1 -0
- package/lib/module/chatbot/ChatMessageItem.js +164 -0
- package/lib/module/chatbot/ChatMessageItem.js.map +1 -0
- package/lib/module/chatbot/Conversation.js +412 -0
- package/lib/module/chatbot/Conversation.js.map +1 -0
- package/lib/module/chatbot/ConversationScrollButton.js +126 -0
- package/lib/module/chatbot/ConversationScrollButton.js.map +1 -0
- package/lib/module/chatbot/Message.js +198 -0
- package/lib/module/chatbot/Message.js.map +1 -0
- package/lib/module/chatbot/PromptInput.js +347 -0
- package/lib/module/chatbot/PromptInput.js.map +1 -0
- package/lib/module/chatbot/Reasoning.js +179 -0
- package/lib/module/chatbot/Reasoning.js.map +1 -0
- package/lib/module/chatbot/Shimmer.js +111 -0
- package/lib/module/chatbot/Shimmer.js.map +1 -0
- package/lib/module/chatbot/Sources.js +207 -0
- package/lib/module/chatbot/Sources.js.map +1 -0
- package/lib/module/chatbot/Suggestion.js +94 -0
- package/lib/module/chatbot/Suggestion.js.map +1 -0
- package/lib/module/chatbot/Tool.js +303 -0
- package/lib/module/chatbot/Tool.js.map +1 -0
- package/lib/module/chatbot/adapters/uiMessageAdapter.js +137 -0
- package/lib/module/chatbot/adapters/uiMessageAdapter.js.map +1 -0
- package/lib/module/chatbot/index.js +39 -0
- package/lib/module/chatbot/index.js.map +1 -0
- package/lib/module/chatbot/types.js +4 -0
- package/lib/module/chatbot/types.js.map +1 -0
- package/lib/module/hooks/index.js +7 -0
- package/lib/module/hooks/index.js.map +1 -0
- package/lib/module/hooks/useAutoScroll.js +35 -0
- package/lib/module/hooks/useAutoScroll.js.map +1 -0
- package/lib/module/hooks/useClipboard.js +40 -0
- package/lib/module/hooks/useClipboard.js.map +1 -0
- package/lib/module/hooks/useCollapsible.js +31 -0
- package/lib/module/hooks/useCollapsible.js.map +1 -0
- package/lib/module/hooks/useStickToBottom.js +64 -0
- package/lib/module/hooks/useStickToBottom.js.map +1 -0
- package/lib/module/index.js +19 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/primitives/Badge.js +114 -0
- package/lib/module/primitives/Badge.js.map +1 -0
- package/lib/module/primitives/Button.js +180 -0
- package/lib/module/primitives/Button.js.map +1 -0
- package/lib/module/primitives/Card.js +156 -0
- package/lib/module/primitives/Card.js.map +1 -0
- package/lib/module/primitives/Collapsible.js +130 -0
- package/lib/module/primitives/Collapsible.js.map +1 -0
- package/lib/module/primitives/ScrollArea.js +35 -0
- package/lib/module/primitives/ScrollArea.js.map +1 -0
- package/lib/module/primitives/index.js +8 -0
- package/lib/module/primitives/index.js.map +1 -0
- package/lib/module/streaming/StreamingMarkdown.js +246 -0
- package/lib/module/streaming/StreamingMarkdown.js.map +1 -0
- package/lib/module/streaming/index.js +4 -0
- package/lib/module/streaming/index.js.map +1 -0
- package/lib/module/streaming/parser.js +477 -0
- package/lib/module/streaming/parser.js.map +1 -0
- package/lib/module/streaming/renderers/BlockquoteRenderer.js +30 -0
- package/lib/module/streaming/renderers/BlockquoteRenderer.js.map +1 -0
- package/lib/module/streaming/renderers/CodeRenderer.js +123 -0
- package/lib/module/streaming/renderers/CodeRenderer.js.map +1 -0
- package/lib/module/streaming/renderers/HeadingRenderer.js +56 -0
- package/lib/module/streaming/renderers/HeadingRenderer.js.map +1 -0
- package/lib/module/streaming/renderers/ImageRenderer.js +48 -0
- package/lib/module/streaming/renderers/ImageRenderer.js.map +1 -0
- package/lib/module/streaming/renderers/LinkRenderer.js +44 -0
- package/lib/module/streaming/renderers/LinkRenderer.js.map +1 -0
- package/lib/module/streaming/renderers/ListRenderer.js +58 -0
- package/lib/module/streaming/renderers/ListRenderer.js.map +1 -0
- package/lib/module/streaming/renderers/TableRenderer.js +72 -0
- package/lib/module/streaming/renderers/TableRenderer.js.map +1 -0
- package/lib/module/streaming/renderers/TextRenderer.js +36 -0
- package/lib/module/streaming/renderers/TextRenderer.js.map +1 -0
- package/lib/module/streaming/renderers/index.js +13 -0
- package/lib/module/streaming/renderers/index.js.map +1 -0
- package/lib/module/streaming/renderers/renderInlineChildren.js +107 -0
- package/lib/module/streaming/renderers/renderInlineChildren.js.map +1 -0
- package/lib/module/streaming/renderers/renderNode.js +78 -0
- package/lib/module/streaming/renderers/renderNode.js.map +1 -0
- package/lib/module/theme/ThemeProvider.js +62 -0
- package/lib/module/theme/ThemeProvider.js.map +1 -0
- package/lib/module/theme/defaultTheme.js +92 -0
- package/lib/module/theme/defaultTheme.js.map +1 -0
- package/lib/module/theme/index.js +5 -0
- package/lib/module/theme/index.js.map +1 -0
- package/lib/module/theme/tokens.js +2 -0
- package/lib/module/theme/tokens.js.map +1 -0
- package/lib/module/types.d.js +2 -0
- package/lib/module/types.d.js.map +1 -0
- package/lib/module/voice/index.js +14 -0
- package/lib/module/voice/index.js.map +1 -0
- package/lib/module/voice/useSpeechRecognition.js +169 -0
- package/lib/module/voice/useSpeechRecognition.js.map +1 -0
- package/lib/typescript/src/chatbot/AIImage.d.ts +24 -0
- package/lib/typescript/src/chatbot/AIImage.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/Attachments.d.ts +20 -0
- package/lib/typescript/src/chatbot/Attachments.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/ChatErrorBoundary.d.ts +57 -0
- package/lib/typescript/src/chatbot/ChatErrorBoundary.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/ChatMessageItem.d.ts +45 -0
- package/lib/typescript/src/chatbot/ChatMessageItem.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/Conversation.d.ts +94 -0
- package/lib/typescript/src/chatbot/Conversation.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/ConversationScrollButton.d.ts +62 -0
- package/lib/typescript/src/chatbot/ConversationScrollButton.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/Message.d.ts +39 -0
- package/lib/typescript/src/chatbot/Message.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/PromptInput.d.ts +93 -0
- package/lib/typescript/src/chatbot/PromptInput.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/Reasoning.d.ts +14 -0
- package/lib/typescript/src/chatbot/Reasoning.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/Shimmer.d.ts +13 -0
- package/lib/typescript/src/chatbot/Shimmer.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/Sources.d.ts +17 -0
- package/lib/typescript/src/chatbot/Sources.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/Suggestion.d.ts +15 -0
- package/lib/typescript/src/chatbot/Suggestion.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/Tool.d.ts +30 -0
- package/lib/typescript/src/chatbot/Tool.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/adapters/uiMessageAdapter.d.ts +24 -0
- package/lib/typescript/src/chatbot/adapters/uiMessageAdapter.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/index.d.ts +29 -0
- package/lib/typescript/src/chatbot/index.d.ts.map +1 -0
- package/lib/typescript/src/chatbot/types.d.ts +49 -0
- package/lib/typescript/src/chatbot/types.d.ts.map +1 -0
- package/lib/typescript/src/hooks/index.d.ts +9 -0
- package/lib/typescript/src/hooks/index.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useAutoScroll.d.ts +23 -0
- package/lib/typescript/src/hooks/useAutoScroll.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useClipboard.d.ts +22 -0
- package/lib/typescript/src/hooks/useClipboard.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useCollapsible.d.ts +28 -0
- package/lib/typescript/src/hooks/useCollapsible.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useStickToBottom.d.ts +39 -0
- package/lib/typescript/src/hooks/useStickToBottom.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +11 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Badge.d.ts +10 -0
- package/lib/typescript/src/primitives/Badge.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Button.d.ts +16 -0
- package/lib/typescript/src/primitives/Button.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Card.d.ts +33 -0
- package/lib/typescript/src/primitives/Card.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Collapsible.d.ts +20 -0
- package/lib/typescript/src/primitives/Collapsible.d.ts.map +1 -0
- package/lib/typescript/src/primitives/ScrollArea.d.ts +10 -0
- package/lib/typescript/src/primitives/ScrollArea.d.ts.map +1 -0
- package/lib/typescript/src/primitives/index.d.ts +11 -0
- package/lib/typescript/src/primitives/index.d.ts.map +1 -0
- package/lib/typescript/src/streaming/StreamingMarkdown.d.ts +47 -0
- package/lib/typescript/src/streaming/StreamingMarkdown.d.ts.map +1 -0
- package/lib/typescript/src/streaming/index.d.ts +3 -0
- package/lib/typescript/src/streaming/index.d.ts.map +1 -0
- package/lib/typescript/src/streaming/parser.d.ts +41 -0
- package/lib/typescript/src/streaming/parser.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/BlockquoteRenderer.d.ts +7 -0
- package/lib/typescript/src/streaming/renderers/BlockquoteRenderer.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/CodeRenderer.d.ts +7 -0
- package/lib/typescript/src/streaming/renderers/CodeRenderer.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/HeadingRenderer.d.ts +7 -0
- package/lib/typescript/src/streaming/renderers/HeadingRenderer.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/ImageRenderer.d.ts +7 -0
- package/lib/typescript/src/streaming/renderers/ImageRenderer.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/LinkRenderer.d.ts +7 -0
- package/lib/typescript/src/streaming/renderers/LinkRenderer.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/ListRenderer.d.ts +7 -0
- package/lib/typescript/src/streaming/renderers/ListRenderer.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/TableRenderer.d.ts +7 -0
- package/lib/typescript/src/streaming/renderers/TableRenderer.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/TextRenderer.d.ts +7 -0
- package/lib/typescript/src/streaming/renderers/TextRenderer.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/index.d.ts +19 -0
- package/lib/typescript/src/streaming/renderers/index.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/renderInlineChildren.d.ts +12 -0
- package/lib/typescript/src/streaming/renderers/renderInlineChildren.d.ts.map +1 -0
- package/lib/typescript/src/streaming/renderers/renderNode.d.ts +8 -0
- package/lib/typescript/src/streaming/renderers/renderNode.d.ts.map +1 -0
- package/lib/typescript/src/theme/ThemeProvider.d.ts +14 -0
- package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -0
- package/lib/typescript/src/theme/defaultTheme.d.ts +4 -0
- package/lib/typescript/src/theme/defaultTheme.d.ts.map +1 -0
- package/lib/typescript/src/theme/index.d.ts +5 -0
- package/lib/typescript/src/theme/index.d.ts.map +1 -0
- package/lib/typescript/src/theme/tokens.d.ts +66 -0
- package/lib/typescript/src/theme/tokens.d.ts.map +1 -0
- package/lib/typescript/src/voice/index.d.ts +3 -0
- package/lib/typescript/src/voice/index.d.ts.map +1 -0
- package/lib/typescript/src/voice/useSpeechRecognition.d.ts +77 -0
- package/lib/typescript/src/voice/useSpeechRecognition.d.ts.map +1 -0
- package/package.json +132 -0
- package/src/chatbot/AIImage.tsx +166 -0
- package/src/chatbot/Attachments.tsx +382 -0
- package/src/chatbot/ChatErrorBoundary.tsx +230 -0
- package/src/chatbot/ChatMessageItem.tsx +195 -0
- package/src/chatbot/Conversation.tsx +537 -0
- package/src/chatbot/ConversationScrollButton.tsx +149 -0
- package/src/chatbot/Message.tsx +266 -0
- package/src/chatbot/PromptInput.tsx +532 -0
- package/src/chatbot/Reasoning.tsx +198 -0
- package/src/chatbot/Shimmer.tsx +146 -0
- package/src/chatbot/Sources.tsx +263 -0
- package/src/chatbot/Suggestion.tsx +123 -0
- package/src/chatbot/Tool.tsx +340 -0
- package/src/chatbot/adapters/uiMessageAdapter.ts +177 -0
- package/src/chatbot/index.ts +97 -0
- package/src/chatbot/types.ts +66 -0
- package/src/hooks/index.ts +17 -0
- package/src/hooks/useAutoScroll.ts +43 -0
- package/src/hooks/useClipboard.ts +46 -0
- package/src/hooks/useCollapsible.ts +42 -0
- package/src/hooks/useStickToBottom.ts +82 -0
- package/src/index.ts +139 -0
- package/src/primitives/Badge.tsx +119 -0
- package/src/primitives/Button.tsx +213 -0
- package/src/primitives/Card.tsx +221 -0
- package/src/primitives/Collapsible.tsx +168 -0
- package/src/primitives/ScrollArea.tsx +53 -0
- package/src/primitives/index.ts +36 -0
- package/src/streaming/StreamingMarkdown.tsx +282 -0
- package/src/streaming/index.ts +2 -0
- package/src/streaming/parser.ts +506 -0
- package/src/streaming/renderers/BlockquoteRenderer.tsx +42 -0
- package/src/streaming/renderers/CodeRenderer.tsx +158 -0
- package/src/streaming/renderers/HeadingRenderer.tsx +64 -0
- package/src/streaming/renderers/ImageRenderer.tsx +62 -0
- package/src/streaming/renderers/LinkRenderer.tsx +53 -0
- package/src/streaming/renderers/ListRenderer.tsx +65 -0
- package/src/streaming/renderers/TableRenderer.tsx +103 -0
- package/src/streaming/renderers/TextRenderer.tsx +39 -0
- package/src/streaming/renderers/index.ts +26 -0
- package/src/streaming/renderers/renderInlineChildren.tsx +115 -0
- package/src/streaming/renderers/renderNode.tsx +72 -0
- package/src/theme/ThemeProvider.tsx +77 -0
- package/src/theme/defaultTheme.ts +93 -0
- package/src/theme/index.ts +4 -0
- package/src/theme/tokens.ts +69 -0
- package/src/types.d.ts +71 -0
- package/src/voice/index.ts +15 -0
- package/src/voice/useSpeechRecognition.ts +230 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @crafter/rn-ai-elements/chatbot — public surface
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
// --- Conversation (generic list wrapper) -----------------------------------
|
|
6
|
+
export { Conversation } from './Conversation';
|
|
7
|
+
export type {
|
|
8
|
+
ConversationProps,
|
|
9
|
+
ConversationRef,
|
|
10
|
+
ConversationMessage,
|
|
11
|
+
ConversationMessageOrder,
|
|
12
|
+
ConversationScrollBehavior,
|
|
13
|
+
} from './Conversation';
|
|
14
|
+
|
|
15
|
+
// --- ConversationScrollButton (floating "scroll to latest" affordance) -----
|
|
16
|
+
export { ConversationScrollButton } from './ConversationScrollButton';
|
|
17
|
+
export type { ConversationScrollButtonProps } from './ConversationScrollButton';
|
|
18
|
+
|
|
19
|
+
// --- ChatMessageItem (default assistant/user message composition) ---------
|
|
20
|
+
export { ChatMessageItem } from './ChatMessageItem';
|
|
21
|
+
export type { ChatMessageItemProps } from './ChatMessageItem';
|
|
22
|
+
|
|
23
|
+
// --- ChatErrorBoundary (per-message error containment) --------------------
|
|
24
|
+
export { ChatErrorBoundary } from './ChatErrorBoundary';
|
|
25
|
+
export type { ChatErrorBoundaryProps } from './ChatErrorBoundary';
|
|
26
|
+
|
|
27
|
+
// --- Canonical chat data types (consumed by ChatMessageItem) --------------
|
|
28
|
+
export type {
|
|
29
|
+
ChatMessageData,
|
|
30
|
+
ChatReasoning,
|
|
31
|
+
ChatTool,
|
|
32
|
+
} from './types';
|
|
33
|
+
|
|
34
|
+
// --- AI SDK adapter -------------------------------------------------------
|
|
35
|
+
export { uiMessageToChatMessageData } from './adapters/uiMessageAdapter';
|
|
36
|
+
|
|
37
|
+
// --- Message compound (user bubbles + default content rendering) ----------
|
|
38
|
+
export {
|
|
39
|
+
Message,
|
|
40
|
+
MessageAvatar,
|
|
41
|
+
MessageContent,
|
|
42
|
+
MessageActions,
|
|
43
|
+
} from './Message';
|
|
44
|
+
export type {
|
|
45
|
+
ChatMessage,
|
|
46
|
+
MessageContextValue,
|
|
47
|
+
MessageProps,
|
|
48
|
+
MessageAvatarProps,
|
|
49
|
+
MessageContentProps,
|
|
50
|
+
MessageActionsProps,
|
|
51
|
+
} from './Message';
|
|
52
|
+
|
|
53
|
+
// --- PromptInput (sticky bottom input bar) --------------------------------
|
|
54
|
+
export { PromptInput } from './PromptInput';
|
|
55
|
+
export type {
|
|
56
|
+
PromptInputProps,
|
|
57
|
+
PromptInputRef,
|
|
58
|
+
PromptInputStatus,
|
|
59
|
+
} from './PromptInput';
|
|
60
|
+
|
|
61
|
+
// --- Reasoning ------------------------------------------------------------
|
|
62
|
+
export { Reasoning } from './Reasoning';
|
|
63
|
+
export type { ReasoningProps } from './Reasoning';
|
|
64
|
+
|
|
65
|
+
// --- Suggestion -----------------------------------------------------------
|
|
66
|
+
export { Suggestion } from './Suggestion';
|
|
67
|
+
export type { SuggestionProps, SuggestionItem } from './Suggestion';
|
|
68
|
+
|
|
69
|
+
// --- Shimmer --------------------------------------------------------------
|
|
70
|
+
export { Shimmer } from './Shimmer';
|
|
71
|
+
export type { ShimmerProps } from './Shimmer';
|
|
72
|
+
|
|
73
|
+
// --- Tool -----------------------------------------------------------------
|
|
74
|
+
export { Tool, ToolHeader, ToolArgs, ToolResult } from './Tool';
|
|
75
|
+
export type {
|
|
76
|
+
ToolProps,
|
|
77
|
+
ToolStatus,
|
|
78
|
+
ToolHeaderProps,
|
|
79
|
+
ToolArgsProps,
|
|
80
|
+
ToolResultProps,
|
|
81
|
+
} from './Tool';
|
|
82
|
+
|
|
83
|
+
// --- Sources --------------------------------------------------------------
|
|
84
|
+
export { Sources } from './Sources';
|
|
85
|
+
export type { Source, SourcesProps } from './Sources';
|
|
86
|
+
|
|
87
|
+
// --- Attachments ----------------------------------------------------------
|
|
88
|
+
export { Attachments } from './Attachments';
|
|
89
|
+
export type {
|
|
90
|
+
Attachment,
|
|
91
|
+
AttachmentVariant,
|
|
92
|
+
AttachmentsProps,
|
|
93
|
+
} from './Attachments';
|
|
94
|
+
|
|
95
|
+
// --- AIImage --------------------------------------------------------------
|
|
96
|
+
export { AIImage } from './AIImage';
|
|
97
|
+
export type { AIImageProps, AIImageSource } from './AIImage';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ChatMessage } from './Message';
|
|
2
|
+
import type { Source } from './Sources';
|
|
3
|
+
import type { ToolStatus } from './Tool';
|
|
4
|
+
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Canonical chat-message shape rendered by `ChatMessageItem`.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
//
|
|
9
|
+
// Real AI SDKs (Vercel `ai`, OpenAI, Anthropic) all expose a different set
|
|
10
|
+
// of fields for streaming reasoning, tool calls, and sources. Rather than
|
|
11
|
+
// pick one provider's shape, we define a small canonical type and ask
|
|
12
|
+
// callers to map their messages to it inside their `renderMessage`. The
|
|
13
|
+
// adapter is usually 5-10 lines and clarifies exactly what's being rendered.
|
|
14
|
+
//
|
|
15
|
+
// For `@ai-sdk/react` consumers, we ship a ready-made adapter —
|
|
16
|
+
// `uiMessageToChatMessageData` — that handles the mapping from `UIMessage`
|
|
17
|
+
// to this shape.
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
/** Reasoning ("thinking") content attached to an assistant message. */
|
|
21
|
+
export interface ChatReasoning {
|
|
22
|
+
/** The reasoning text (rendered as markdown). */
|
|
23
|
+
content: string;
|
|
24
|
+
/** True while the reasoning is still streaming. */
|
|
25
|
+
isStreaming?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** A tool / function invocation attached to an assistant message. */
|
|
29
|
+
export interface ChatTool {
|
|
30
|
+
/** Tool / function name (e.g. `"search_docs"`). */
|
|
31
|
+
name: string;
|
|
32
|
+
/** Lifecycle state. */
|
|
33
|
+
status: ToolStatus;
|
|
34
|
+
/** Arguments the tool was called with. */
|
|
35
|
+
args?: Record<string, unknown>;
|
|
36
|
+
/** Tool output, once the call resolves. */
|
|
37
|
+
result?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The canonical message shape consumed by `ChatMessageItem`. Map your
|
|
42
|
+
* own message type to this shape inside your `renderMessage` callback.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* const data: ChatMessageData = {
|
|
47
|
+
* id: msg.id,
|
|
48
|
+
* role: msg.role,
|
|
49
|
+
* content: msg.content,
|
|
50
|
+
* reasoning: msg.reasoning && {
|
|
51
|
+
* content: msg.reasoning,
|
|
52
|
+
* isStreaming: msg.reasoningStreaming,
|
|
53
|
+
* },
|
|
54
|
+
* tool: msg.tool,
|
|
55
|
+
* sources: msg.sources,
|
|
56
|
+
* };
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export interface ChatMessageData {
|
|
60
|
+
id: string;
|
|
61
|
+
role: ChatMessage['role'];
|
|
62
|
+
content: string;
|
|
63
|
+
reasoning?: ChatReasoning;
|
|
64
|
+
tool?: ChatTool;
|
|
65
|
+
sources?: Source[];
|
|
66
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { useAutoScroll } from './useAutoScroll';
|
|
2
|
+
export type { UseAutoScrollOptions, UseAutoScrollReturn } from './useAutoScroll';
|
|
3
|
+
|
|
4
|
+
export { useClipboard } from './useClipboard';
|
|
5
|
+
export type { UseClipboardReturn } from './useClipboard';
|
|
6
|
+
|
|
7
|
+
export { useStickToBottom } from './useStickToBottom';
|
|
8
|
+
export type {
|
|
9
|
+
UseStickToBottomOptions,
|
|
10
|
+
UseStickToBottomReturn,
|
|
11
|
+
} from './useStickToBottom';
|
|
12
|
+
|
|
13
|
+
export { useCollapsible } from './useCollapsible';
|
|
14
|
+
export type {
|
|
15
|
+
UseCollapsibleOptions,
|
|
16
|
+
UseCollapsibleReturn,
|
|
17
|
+
} from './useCollapsible';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useCallback, useRef } from 'react';
|
|
2
|
+
import type { FlatList } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface UseAutoScrollOptions {
|
|
5
|
+
/** When true, auto-scrolls to bottom on content size changes. Defaults to `true`. */
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface UseAutoScrollReturn<T = any> {
|
|
10
|
+
/** Ref to attach to your FlatList. */
|
|
11
|
+
ref: React.RefObject<FlatList<T> | null>;
|
|
12
|
+
/** Imperatively scroll to the end of the list. */
|
|
13
|
+
scrollToEnd: () => void;
|
|
14
|
+
/** Pass as the `onContentSizeChange` prop on your FlatList. */
|
|
15
|
+
onContentSizeChange: () => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Provides a FlatList ref and helpers that keep the list pinned to the bottom.
|
|
20
|
+
*
|
|
21
|
+
* ```tsx
|
|
22
|
+
* const { ref, onContentSizeChange } = useAutoScroll();
|
|
23
|
+
* <FlatList ref={ref} onContentSizeChange={onContentSizeChange} ... />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function useAutoScroll<T = any>(
|
|
27
|
+
options: UseAutoScrollOptions = {},
|
|
28
|
+
): UseAutoScrollReturn<T> {
|
|
29
|
+
const { enabled = true } = options;
|
|
30
|
+
const ref = useRef<FlatList<T>>(null);
|
|
31
|
+
|
|
32
|
+
const scrollToEnd = useCallback(() => {
|
|
33
|
+
ref.current?.scrollToEnd({ animated: true });
|
|
34
|
+
}, []);
|
|
35
|
+
|
|
36
|
+
const onContentSizeChange = useCallback(() => {
|
|
37
|
+
if (enabled) {
|
|
38
|
+
ref.current?.scrollToEnd({ animated: true });
|
|
39
|
+
}
|
|
40
|
+
}, [enabled]);
|
|
41
|
+
|
|
42
|
+
return { ref, scrollToEnd, onContentSizeChange };
|
|
43
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from 'react';
|
|
2
|
+
import { Clipboard } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface UseClipboardReturn {
|
|
5
|
+
/** Copy text to the clipboard. Resolves once the text has been written. */
|
|
6
|
+
copy: (text: string) => Promise<void>;
|
|
7
|
+
/** `true` for 2 seconds after a successful `copy` call, then resets. */
|
|
8
|
+
copied: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const RESET_DELAY_MS = 2_000;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Thin wrapper around the system clipboard with a transient `copied` flag.
|
|
15
|
+
*
|
|
16
|
+
* Uses the built-in `react-native` Clipboard API. The implementation is
|
|
17
|
+
* isolated so it can be swapped for `@react-native-clipboard/clipboard`
|
|
18
|
+
* without changing the public interface.
|
|
19
|
+
*
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const { copy, copied } = useClipboard();
|
|
22
|
+
* <Pressable onPress={() => copy(code)}>
|
|
23
|
+
* <Text>{copied ? 'Copied!' : 'Copy'}</Text>
|
|
24
|
+
* </Pressable>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function useClipboard(): UseClipboardReturn {
|
|
28
|
+
const [copied, setCopied] = useState(false);
|
|
29
|
+
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
30
|
+
|
|
31
|
+
const copy = useCallback(async (text: string): Promise<void> => {
|
|
32
|
+
Clipboard.setString(text);
|
|
33
|
+
setCopied(true);
|
|
34
|
+
|
|
35
|
+
if (timerRef.current !== null) {
|
|
36
|
+
clearTimeout(timerRef.current);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
timerRef.current = setTimeout(() => {
|
|
40
|
+
setCopied(false);
|
|
41
|
+
timerRef.current = null;
|
|
42
|
+
}, RESET_DELAY_MS);
|
|
43
|
+
}, []);
|
|
44
|
+
|
|
45
|
+
return { copy, copied };
|
|
46
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface UseCollapsibleOptions {
|
|
4
|
+
/** Initial open state. Defaults to `false`. */
|
|
5
|
+
defaultOpen?: boolean;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface UseCollapsibleReturn {
|
|
9
|
+
/** Whether the collapsible section is currently open. */
|
|
10
|
+
isOpen: boolean;
|
|
11
|
+
/** Toggle between open and closed. */
|
|
12
|
+
toggle: () => void;
|
|
13
|
+
/** Set to open. */
|
|
14
|
+
open: () => void;
|
|
15
|
+
/** Set to closed. */
|
|
16
|
+
close: () => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Minimal state hook for a collapsible section.
|
|
21
|
+
*
|
|
22
|
+
* ```tsx
|
|
23
|
+
* const { isOpen, toggle } = useCollapsible({ defaultOpen: true });
|
|
24
|
+
*
|
|
25
|
+
* <Pressable onPress={toggle}>
|
|
26
|
+
* <Text>{isOpen ? 'Hide' : 'Show'}</Text>
|
|
27
|
+
* </Pressable>
|
|
28
|
+
* {isOpen && <View>...</View>}
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function useCollapsible(
|
|
32
|
+
options: UseCollapsibleOptions = {},
|
|
33
|
+
): UseCollapsibleReturn {
|
|
34
|
+
const { defaultOpen = false } = options;
|
|
35
|
+
const [isOpen, setIsOpen] = useState(defaultOpen);
|
|
36
|
+
|
|
37
|
+
const toggle = useCallback(() => setIsOpen((prev: boolean) => !prev), []);
|
|
38
|
+
const open = useCallback(() => setIsOpen(true), []);
|
|
39
|
+
const close = useCallback(() => setIsOpen(false), []);
|
|
40
|
+
|
|
41
|
+
return { isOpen, toggle, open, close };
|
|
42
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from 'react';
|
|
2
|
+
import type {
|
|
3
|
+
FlatList,
|
|
4
|
+
NativeScrollEvent,
|
|
5
|
+
NativeSyntheticEvent,
|
|
6
|
+
} from 'react-native';
|
|
7
|
+
|
|
8
|
+
export interface UseStickToBottomOptions {
|
|
9
|
+
/** Distance (in px) from the bottom that still counts as "at the bottom". Defaults to `50`. */
|
|
10
|
+
threshold?: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface UseStickToBottomReturn<T = any> {
|
|
14
|
+
/** Whether the list is currently scrolled to (or near) the bottom. */
|
|
15
|
+
isAtBottom: boolean;
|
|
16
|
+
/** Imperatively scroll to the bottom. */
|
|
17
|
+
scrollToBottom: () => void;
|
|
18
|
+
/** Pass as the `onScroll` prop on your FlatList / ScrollView. */
|
|
19
|
+
onScroll: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
|
|
20
|
+
/** Pass as the `onContentSizeChange` prop to auto-scroll when already at bottom. */
|
|
21
|
+
onContentSizeChange: () => void;
|
|
22
|
+
/** Ref to attach to your FlatList. */
|
|
23
|
+
ref: React.RefObject<FlatList<T> | null>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Chat-style "stick to bottom" behaviour for a FlatList.
|
|
28
|
+
*
|
|
29
|
+
* When the user is scrolled to (or near) the bottom and new content arrives,
|
|
30
|
+
* the list automatically scrolls down. If the user scrolls up to read history,
|
|
31
|
+
* auto-scrolling pauses until they return to the bottom.
|
|
32
|
+
*
|
|
33
|
+
* ```tsx
|
|
34
|
+
* const { ref, onScroll, onContentSizeChange, isAtBottom, scrollToBottom } =
|
|
35
|
+
* useStickToBottom();
|
|
36
|
+
*
|
|
37
|
+
* <FlatList
|
|
38
|
+
* ref={ref}
|
|
39
|
+
* onScroll={onScroll}
|
|
40
|
+
* onContentSizeChange={onContentSizeChange}
|
|
41
|
+
* scrollEventThrottle={16}
|
|
42
|
+
* ...
|
|
43
|
+
* />
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function useStickToBottom<T = any>(
|
|
47
|
+
options: UseStickToBottomOptions = {},
|
|
48
|
+
): UseStickToBottomReturn<T> {
|
|
49
|
+
const { threshold = 50 } = options;
|
|
50
|
+
const ref = useRef<FlatList<T>>(null);
|
|
51
|
+
const [isAtBottom, setIsAtBottom] = useState(true);
|
|
52
|
+
|
|
53
|
+
const onScroll = useCallback(
|
|
54
|
+
(event: NativeSyntheticEvent<NativeScrollEvent>) => {
|
|
55
|
+
const { contentOffset, contentSize, layoutMeasurement } =
|
|
56
|
+
event.nativeEvent;
|
|
57
|
+
|
|
58
|
+
const distanceFromBottom =
|
|
59
|
+
contentSize.height - layoutMeasurement.height - contentOffset.y;
|
|
60
|
+
|
|
61
|
+
setIsAtBottom(distanceFromBottom <= threshold);
|
|
62
|
+
},
|
|
63
|
+
[threshold],
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const scrollToBottom = useCallback(() => {
|
|
67
|
+
ref.current?.scrollToEnd({ animated: true });
|
|
68
|
+
}, []);
|
|
69
|
+
|
|
70
|
+
// Keep a ref so the callback doesn't re-create on every isAtBottom change,
|
|
71
|
+
// but still reads the latest value.
|
|
72
|
+
const isAtBottomRef = useRef(isAtBottom);
|
|
73
|
+
isAtBottomRef.current = isAtBottom;
|
|
74
|
+
|
|
75
|
+
const onContentSizeChange = useCallback(() => {
|
|
76
|
+
if (isAtBottomRef.current) {
|
|
77
|
+
ref.current?.scrollToEnd({ animated: true });
|
|
78
|
+
}
|
|
79
|
+
}, []);
|
|
80
|
+
|
|
81
|
+
return { isAtBottom, scrollToBottom, onScroll, onContentSizeChange, ref };
|
|
82
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @crafter/rn-ai-elements — public surface
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
// --- Theme ----------------------------------------------------------------
|
|
6
|
+
export {
|
|
7
|
+
AIElementsProvider,
|
|
8
|
+
useAIElementsTheme,
|
|
9
|
+
lightTheme,
|
|
10
|
+
darkTheme,
|
|
11
|
+
} from './theme';
|
|
12
|
+
export type {
|
|
13
|
+
AIElementsProviderProps,
|
|
14
|
+
ColorSchemeMode,
|
|
15
|
+
AIElementsTheme,
|
|
16
|
+
ColorTokens,
|
|
17
|
+
SpacingTokens,
|
|
18
|
+
RadiusTokens,
|
|
19
|
+
TypographyTokens,
|
|
20
|
+
} from './theme';
|
|
21
|
+
|
|
22
|
+
// --- Primitives -----------------------------------------------------------
|
|
23
|
+
export {
|
|
24
|
+
Button,
|
|
25
|
+
Badge,
|
|
26
|
+
Card,
|
|
27
|
+
CardHeader,
|
|
28
|
+
CardTitle,
|
|
29
|
+
CardDescription,
|
|
30
|
+
CardContent,
|
|
31
|
+
CardFooter,
|
|
32
|
+
Collapsible,
|
|
33
|
+
CollapsibleTrigger,
|
|
34
|
+
CollapsibleContent,
|
|
35
|
+
ScrollArea,
|
|
36
|
+
} from './primitives';
|
|
37
|
+
export type {
|
|
38
|
+
ButtonProps,
|
|
39
|
+
ButtonVariant,
|
|
40
|
+
ButtonSize,
|
|
41
|
+
BadgeProps,
|
|
42
|
+
BadgeVariant,
|
|
43
|
+
CardProps,
|
|
44
|
+
CardHeaderProps,
|
|
45
|
+
CardTitleProps,
|
|
46
|
+
CardDescriptionProps,
|
|
47
|
+
CardContentProps,
|
|
48
|
+
CardFooterProps,
|
|
49
|
+
CollapsibleProps,
|
|
50
|
+
CollapsibleTriggerProps,
|
|
51
|
+
CollapsibleContentProps,
|
|
52
|
+
ScrollAreaProps,
|
|
53
|
+
} from './primitives';
|
|
54
|
+
|
|
55
|
+
// --- Streaming Markdown ---------------------------------------------------
|
|
56
|
+
export { StreamingMarkdown } from './streaming';
|
|
57
|
+
export type { StreamingMarkdownProps } from './streaming';
|
|
58
|
+
|
|
59
|
+
// --- Hooks ----------------------------------------------------------------
|
|
60
|
+
export {
|
|
61
|
+
useAutoScroll,
|
|
62
|
+
useClipboard,
|
|
63
|
+
useStickToBottom,
|
|
64
|
+
useCollapsible,
|
|
65
|
+
} from './hooks';
|
|
66
|
+
export type {
|
|
67
|
+
UseAutoScrollOptions,
|
|
68
|
+
UseAutoScrollReturn,
|
|
69
|
+
UseClipboardReturn,
|
|
70
|
+
UseStickToBottomOptions,
|
|
71
|
+
UseStickToBottomReturn,
|
|
72
|
+
UseCollapsibleOptions,
|
|
73
|
+
UseCollapsibleReturn,
|
|
74
|
+
} from './hooks';
|
|
75
|
+
|
|
76
|
+
// --- Chatbot components ---------------------------------------------------
|
|
77
|
+
export {
|
|
78
|
+
Conversation,
|
|
79
|
+
ConversationScrollButton,
|
|
80
|
+
ChatMessageItem,
|
|
81
|
+
ChatErrorBoundary,
|
|
82
|
+
Message,
|
|
83
|
+
MessageAvatar,
|
|
84
|
+
MessageContent,
|
|
85
|
+
MessageActions,
|
|
86
|
+
PromptInput,
|
|
87
|
+
Reasoning,
|
|
88
|
+
Suggestion,
|
|
89
|
+
Shimmer,
|
|
90
|
+
Tool,
|
|
91
|
+
ToolHeader,
|
|
92
|
+
ToolArgs,
|
|
93
|
+
ToolResult,
|
|
94
|
+
Sources,
|
|
95
|
+
Attachments,
|
|
96
|
+
AIImage,
|
|
97
|
+
uiMessageToChatMessageData,
|
|
98
|
+
} from './chatbot';
|
|
99
|
+
|
|
100
|
+
// --- Chatbot types --------------------------------------------------------
|
|
101
|
+
export type {
|
|
102
|
+
// Conversation
|
|
103
|
+
ConversationProps,
|
|
104
|
+
ConversationRef,
|
|
105
|
+
ConversationMessage,
|
|
106
|
+
ConversationMessageOrder,
|
|
107
|
+
ConversationScrollBehavior,
|
|
108
|
+
// ConversationScrollButton
|
|
109
|
+
ConversationScrollButtonProps,
|
|
110
|
+
// ChatMessageItem
|
|
111
|
+
ChatMessageItemProps,
|
|
112
|
+
// ChatErrorBoundary
|
|
113
|
+
ChatErrorBoundaryProps,
|
|
114
|
+
// Canonical message data
|
|
115
|
+
ChatMessageData,
|
|
116
|
+
ChatReasoning,
|
|
117
|
+
ChatTool,
|
|
118
|
+
// Message compound
|
|
119
|
+
ChatMessage,
|
|
120
|
+
MessageProps,
|
|
121
|
+
MessageAvatarProps,
|
|
122
|
+
MessageContentProps,
|
|
123
|
+
MessageActionsProps,
|
|
124
|
+
// PromptInput
|
|
125
|
+
PromptInputProps,
|
|
126
|
+
PromptInputRef,
|
|
127
|
+
PromptInputStatus,
|
|
128
|
+
// Others
|
|
129
|
+
ReasoningProps,
|
|
130
|
+
SuggestionProps,
|
|
131
|
+
ShimmerProps,
|
|
132
|
+
ToolProps,
|
|
133
|
+
ToolStatus,
|
|
134
|
+
Source,
|
|
135
|
+
SourcesProps,
|
|
136
|
+
Attachment,
|
|
137
|
+
AttachmentsProps,
|
|
138
|
+
AIImageProps,
|
|
139
|
+
} from './chatbot';
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import React, { type ReactNode } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
View,
|
|
4
|
+
Text,
|
|
5
|
+
StyleSheet,
|
|
6
|
+
type StyleProp,
|
|
7
|
+
type ViewStyle,
|
|
8
|
+
type TextStyle,
|
|
9
|
+
} from 'react-native';
|
|
10
|
+
import { useAIElementsTheme } from '../theme';
|
|
11
|
+
import type { AIElementsTheme } from '../theme';
|
|
12
|
+
|
|
13
|
+
export type BadgeVariant =
|
|
14
|
+
| 'default'
|
|
15
|
+
| 'secondary'
|
|
16
|
+
| 'outline'
|
|
17
|
+
| 'destructive'
|
|
18
|
+
| 'success'
|
|
19
|
+
| 'warning';
|
|
20
|
+
|
|
21
|
+
export interface BadgeProps {
|
|
22
|
+
variant?: BadgeVariant;
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
style?: StyleProp<ViewStyle>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function getVariantStyles(
|
|
28
|
+
variant: BadgeVariant,
|
|
29
|
+
theme: AIElementsTheme
|
|
30
|
+
): { container: ViewStyle; text: TextStyle } {
|
|
31
|
+
const { colors } = theme;
|
|
32
|
+
|
|
33
|
+
switch (variant) {
|
|
34
|
+
case 'default':
|
|
35
|
+
return {
|
|
36
|
+
container: { backgroundColor: colors.primary },
|
|
37
|
+
text: { color: colors.primaryForeground },
|
|
38
|
+
};
|
|
39
|
+
case 'secondary':
|
|
40
|
+
return {
|
|
41
|
+
container: { backgroundColor: colors.secondary },
|
|
42
|
+
text: { color: colors.secondaryForeground },
|
|
43
|
+
};
|
|
44
|
+
case 'outline':
|
|
45
|
+
return {
|
|
46
|
+
container: {
|
|
47
|
+
backgroundColor: 'transparent',
|
|
48
|
+
borderWidth: 1,
|
|
49
|
+
borderColor: colors.border,
|
|
50
|
+
},
|
|
51
|
+
text: { color: colors.foreground },
|
|
52
|
+
};
|
|
53
|
+
case 'destructive':
|
|
54
|
+
return {
|
|
55
|
+
container: { backgroundColor: colors.destructive },
|
|
56
|
+
text: { color: colors.destructiveForeground },
|
|
57
|
+
};
|
|
58
|
+
case 'success':
|
|
59
|
+
return {
|
|
60
|
+
container: { backgroundColor: colors.success },
|
|
61
|
+
text: { color: colors.successForeground },
|
|
62
|
+
};
|
|
63
|
+
case 'warning':
|
|
64
|
+
return {
|
|
65
|
+
container: { backgroundColor: colors.warning },
|
|
66
|
+
text: { color: colors.warningForeground },
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function Badge({ variant = 'default', children, style }: BadgeProps) {
|
|
72
|
+
const theme = useAIElementsTheme();
|
|
73
|
+
const variantStyles = getVariantStyles(variant, theme);
|
|
74
|
+
|
|
75
|
+
const textStyle: TextStyle = {
|
|
76
|
+
...variantStyles.text,
|
|
77
|
+
fontSize: theme.typography.fontSize.xs,
|
|
78
|
+
fontWeight: theme.typography.fontWeight.semibold as TextStyle['fontWeight'],
|
|
79
|
+
fontFamily: theme.typography.fontFamily,
|
|
80
|
+
// Intentionally no lineHeight override — on iOS, lineHeight much larger
|
|
81
|
+
// than fontSize creates a tall line box with the glyph sitting at the
|
|
82
|
+
// baseline, which looks pushed-down inside a short pill. Letting RN use
|
|
83
|
+
// the native font metrics + the container's `alignItems: center` gives
|
|
84
|
+
// proper vertical centering.
|
|
85
|
+
textAlignVertical: 'center', // Android
|
|
86
|
+
includeFontPadding: false, // Android — strip extra font padding
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<View
|
|
91
|
+
style={[
|
|
92
|
+
styles.base,
|
|
93
|
+
{ borderRadius: theme.radius.full },
|
|
94
|
+
variantStyles.container,
|
|
95
|
+
style,
|
|
96
|
+
]}
|
|
97
|
+
>
|
|
98
|
+
{typeof children === 'string' ? (
|
|
99
|
+
<Text style={textStyle}>{children}</Text>
|
|
100
|
+
) : (
|
|
101
|
+
children
|
|
102
|
+
)}
|
|
103
|
+
</View>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const styles = StyleSheet.create({
|
|
108
|
+
base: {
|
|
109
|
+
alignSelf: 'flex-start',
|
|
110
|
+
flexDirection: 'row',
|
|
111
|
+
alignItems: 'center',
|
|
112
|
+
justifyContent: 'center',
|
|
113
|
+
paddingHorizontal: 10,
|
|
114
|
+
paddingVertical: 3,
|
|
115
|
+
// Consistent pill height regardless of rendered font metrics — keeps
|
|
116
|
+
// every variant the same visual size even when text differs.
|
|
117
|
+
minHeight: 22,
|
|
118
|
+
},
|
|
119
|
+
});
|