@toimc/vue 0.0.1 → 0.0.3
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/LICENSE +21 -0
- package/README.md +374 -0
- package/dist/attachment/Attachment.vue.d.ts +5 -3
- package/dist/attachment/Attachment.vue.d.ts.map +1 -1
- package/dist/attachment/AttachmentEmpty.vue.d.ts +5 -3
- package/dist/attachment/AttachmentEmpty.vue.d.ts.map +1 -1
- package/dist/attachment/AttachmentInfo.vue.d.ts.map +1 -1
- package/dist/attachment/AttachmentRemove.vue.d.ts.map +1 -1
- package/dist/attachment/Attachments.vue.d.ts +6 -4
- package/dist/attachment/Attachments.vue.d.ts.map +1 -1
- package/dist/citation/InlineCitation.vue.d.ts +19 -0
- package/dist/citation/InlineCitation.vue.d.ts.map +1 -0
- package/dist/citation/Sources.vue.d.ts +40 -0
- package/dist/citation/Sources.vue.d.ts.map +1 -0
- package/dist/citation/index.d.ts +4 -0
- package/dist/citation/index.d.ts.map +1 -0
- package/dist/citation/url.d.ts +3 -0
- package/dist/citation/url.d.ts.map +1 -0
- package/dist/comparison/ComparisonMessage.vue.d.ts +15 -13
- package/dist/comparison/ComparisonMessage.vue.d.ts.map +1 -1
- package/dist/composables/useClipboard.d.ts +7 -0
- package/dist/composables/useClipboard.d.ts.map +1 -0
- package/dist/composables/useScrollAnchor.d.ts +2 -0
- package/dist/composables/useScrollAnchor.d.ts.map +1 -1
- package/dist/composables/useSpeechInput.d.ts +48 -0
- package/dist/composables/useSpeechInput.d.ts.map +1 -0
- package/dist/composables/useSpeechOutput.d.ts +31 -0
- package/dist/composables/useSpeechOutput.d.ts.map +1 -0
- package/dist/conversation/Conversation.vue.d.ts +5 -3
- package/dist/conversation/Conversation.vue.d.ts.map +1 -1
- package/dist/conversation/ConversationContent.vue.d.ts +5 -3
- package/dist/conversation/ConversationContent.vue.d.ts.map +1 -1
- package/dist/conversation/ConversationEmpty.vue.d.ts +7 -5
- package/dist/conversation/ConversationEmpty.vue.d.ts.map +1 -1
- package/dist/conversation/ConversationScrollBtn.vue.d.ts +5 -1
- package/dist/conversation/ConversationScrollBtn.vue.d.ts.map +1 -1
- package/dist/{MessageBubble.vue.d.ts → genui/GenUIRenderer.vue.d.ts} +8 -10
- package/dist/genui/GenUIRenderer.vue.d.ts.map +1 -0
- package/dist/genui/PlanActions.vue.d.ts +12 -0
- package/dist/genui/PlanActions.vue.d.ts.map +1 -0
- package/dist/genui/WeatherCard.vue.d.ts +13 -0
- package/dist/genui/WeatherCard.vue.d.ts.map +1 -0
- package/dist/genui/index.d.ts +8 -0
- package/dist/genui/index.d.ts.map +1 -0
- package/dist/genui/registry.d.ts +8 -0
- package/dist/genui/registry.d.ts.map +1 -0
- package/dist/genui/sanitize.d.ts +19 -0
- package/dist/genui/sanitize.d.ts.map +1 -0
- package/dist/genui/types.d.ts +7 -0
- package/dist/genui/types.d.ts.map +1 -0
- package/dist/index.cjs +5 -5
- package/dist/index.d.ts +25 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +3679 -1552
- package/dist/locales/en-US.d.ts +115 -5
- package/dist/locales/en-US.d.ts.map +1 -1
- package/dist/locales/index.d.ts +460 -20
- package/dist/locales/index.d.ts.map +1 -1
- package/dist/locales/zh-CN.d.ts +115 -5
- package/dist/locales/zh-CN.d.ts.map +1 -1
- package/dist/message/BranchPicker.vue.d.ts +30 -0
- package/dist/message/BranchPicker.vue.d.ts.map +1 -0
- package/dist/message/Message.vue.d.ts +13 -11
- package/dist/message/Message.vue.d.ts.map +1 -1
- package/dist/message/MessageAction.vue.d.ts +5 -3
- package/dist/message/MessageAction.vue.d.ts.map +1 -1
- package/dist/message/MessageActions.vue.d.ts +5 -3
- package/dist/message/MessageActions.vue.d.ts.map +1 -1
- package/dist/message/MessageAttachments.vue.d.ts +5 -3
- package/dist/message/MessageAttachments.vue.d.ts.map +1 -1
- package/dist/message/MessageContent.vue.d.ts +12 -4
- package/dist/message/MessageContent.vue.d.ts.map +1 -1
- package/dist/message/MessageFeedback.vue.d.ts +19 -0
- package/dist/message/MessageFeedback.vue.d.ts.map +1 -0
- package/dist/message/actions/MessageActionCopy.vue.d.ts +10 -0
- package/dist/message/actions/MessageActionCopy.vue.d.ts.map +1 -0
- package/dist/message/actions/MessageActionEdit.vue.d.ts +16 -0
- package/dist/message/actions/MessageActionEdit.vue.d.ts.map +1 -0
- package/dist/message/actions/MessageActionFeedback.vue.d.ts +16 -0
- package/dist/message/actions/MessageActionFeedback.vue.d.ts.map +1 -0
- package/dist/message/actions/MessageActionRetry.vue.d.ts +14 -0
- package/dist/message/actions/MessageActionRetry.vue.d.ts.map +1 -0
- package/dist/message/actions/MessageActionSpeak.vue.d.ts +12 -0
- package/dist/message/actions/MessageActionSpeak.vue.d.ts.map +1 -0
- package/dist/message/actions/index.d.ts +6 -0
- package/dist/message/actions/index.d.ts.map +1 -0
- package/dist/message/index.d.ts +2 -0
- package/dist/message/index.d.ts.map +1 -1
- package/dist/preview/ImageLightbox.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInput.vue.d.ts +10 -8
- package/dist/prompt-input/PromptInput.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputAttachments.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputBody.vue.d.ts +5 -3
- package/dist/prompt-input/PromptInputBody.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputButton.vue.d.ts +5 -3
- package/dist/prompt-input/PromptInputButton.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputFooter.vue.d.ts +7 -5
- package/dist/prompt-input/PromptInputFooter.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputHeader.vue.d.ts +5 -3
- package/dist/prompt-input/PromptInputHeader.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputMicButton.vue.d.ts +13 -0
- package/dist/prompt-input/PromptInputMicButton.vue.d.ts.map +1 -0
- package/dist/prompt-input/PromptInputSubmit.vue.d.ts +5 -3
- package/dist/prompt-input/PromptInputSubmit.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputSuggestion.vue.d.ts +23 -0
- package/dist/prompt-input/PromptInputSuggestion.vue.d.ts.map +1 -0
- package/dist/prompt-input/PromptInputTextarea.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputTools.vue.d.ts +5 -3
- package/dist/prompt-input/PromptInputTools.vue.d.ts.map +1 -1
- package/dist/prompt-input/PromptInputUploadButton.vue.d.ts +5 -3
- package/dist/prompt-input/PromptInputUploadButton.vue.d.ts.map +1 -1
- package/dist/prompt-input/index.d.ts +4 -0
- package/dist/prompt-input/index.d.ts.map +1 -1
- package/dist/prompt-input/suggestions.d.ts +38 -0
- package/dist/prompt-input/suggestions.d.ts.map +1 -0
- package/dist/provider/ProviderSettingsDialog.vue.d.ts +22 -0
- package/dist/provider/ProviderSettingsDialog.vue.d.ts.map +1 -0
- package/dist/provider/ProviderSettingsForm.vue.d.ts +17 -0
- package/dist/provider/ProviderSettingsForm.vue.d.ts.map +1 -0
- package/dist/provider/index.d.ts +3 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/types.d.ts +20 -0
- package/dist/provider/types.d.ts.map +1 -0
- package/dist/shared/Button.vue.d.ts +7 -3
- package/dist/shared/Button.vue.d.ts.map +1 -1
- package/dist/shared/Input.vue.d.ts +28 -0
- package/dist/shared/Input.vue.d.ts.map +1 -0
- package/dist/shared/JsonDiffView.vue.d.ts +16 -0
- package/dist/shared/JsonDiffView.vue.d.ts.map +1 -0
- package/dist/shared/LanguageToggle.vue.d.ts +1 -1
- package/dist/shared/LanguageToggle.vue.d.ts.map +1 -1
- package/dist/shared/ModelIcon.vue.d.ts +28 -0
- package/dist/shared/ModelIcon.vue.d.ts.map +1 -0
- package/dist/shared/Radio.vue.d.ts +19 -0
- package/dist/shared/Radio.vue.d.ts.map +1 -0
- package/dist/shared/Select.vue.d.ts +32 -0
- package/dist/shared/Select.vue.d.ts.map +1 -0
- package/dist/shared/Shimmer.vue.d.ts +5 -3
- package/dist/shared/Shimmer.vue.d.ts.map +1 -1
- package/dist/shared/StreamText.vue.d.ts.map +1 -1
- package/dist/shared/Toast.vue.d.ts +1 -1
- package/dist/shared/Toast.vue.d.ts.map +1 -1
- package/dist/thinking/ThinkingBlock.vue.d.ts +5 -3
- package/dist/thinking/ThinkingBlock.vue.d.ts.map +1 -1
- package/dist/thinking/ThinkingChain.vue.d.ts +22 -0
- package/dist/thinking/ThinkingChain.vue.d.ts.map +1 -0
- package/dist/thinking/index.d.ts +2 -0
- package/dist/thinking/index.d.ts.map +1 -0
- package/dist/tool-call/ToolCall.vue.d.ts +12 -10
- package/dist/tool-call/ToolCall.vue.d.ts.map +1 -1
- package/dist/tool-call/ToolCallContent.vue.d.ts.map +1 -1
- package/dist/tool-call/ToolCallHeader.vue.d.ts.map +1 -1
- package/dist/tool-call/ToolCallInput.vue.d.ts.map +1 -1
- package/dist/tool-call/ToolCallOutput.vue.d.ts.map +1 -1
- package/dist/tool-call/ToolConfirmation.vue.d.ts +19 -0
- package/dist/tool-call/ToolConfirmation.vue.d.ts.map +1 -0
- package/dist/tool-call/index.d.ts +1 -0
- package/dist/tool-call/index.d.ts.map +1 -1
- package/dist/utils/compress-image.d.ts +21 -0
- package/dist/utils/compress-image.d.ts.map +1 -0
- package/dist/vue.css +1 -1
- package/dist/welcome/Prompts.vue.d.ts +33 -0
- package/dist/welcome/Prompts.vue.d.ts.map +1 -0
- package/dist/{ChatWindow.vue.d.ts → welcome/Welcome.vue.d.ts} +12 -7
- package/dist/welcome/Welcome.vue.d.ts.map +1 -0
- package/dist/welcome/index.d.ts +4 -0
- package/dist/welcome/index.d.ts.map +1 -0
- package/dist/welcome/types.d.ts +10 -0
- package/dist/welcome/types.d.ts.map +1 -0
- package/package.json +19 -14
- package/dist/ChatWindow.test.d.ts +0 -2
- package/dist/ChatWindow.test.d.ts.map +0 -1
- package/dist/ChatWindow.vue.d.ts.map +0 -1
- package/dist/InputArea.i18n.test.d.ts +0 -2
- package/dist/InputArea.i18n.test.d.ts.map +0 -1
- package/dist/InputArea.test.d.ts +0 -2
- package/dist/InputArea.test.d.ts.map +0 -1
- package/dist/InputArea.vue.d.ts +0 -24
- package/dist/InputArea.vue.d.ts.map +0 -1
- package/dist/MessageBubble.test.d.ts +0 -2
- package/dist/MessageBubble.test.d.ts.map +0 -1
- package/dist/MessageBubble.vue.d.ts.map +0 -1
- package/dist/MessageList.test.d.ts +0 -2
- package/dist/MessageList.test.d.ts.map +0 -1
- package/dist/MessageList.vue.d.ts +0 -20
- package/dist/MessageList.vue.d.ts.map +0 -1
- package/dist/attachment/Attachment.test.d.ts +0 -2
- package/dist/attachment/Attachment.test.d.ts.map +0 -1
- package/dist/attachment/AttachmentPreview.test.d.ts +0 -2
- package/dist/attachment/AttachmentPreview.test.d.ts.map +0 -1
- package/dist/attachment/Attachments.test.d.ts +0 -2
- package/dist/attachment/Attachments.test.d.ts.map +0 -1
- package/dist/comparison/ComparisonMessage.i18n.test.d.ts +0 -2
- package/dist/comparison/ComparisonMessage.i18n.test.d.ts.map +0 -1
- package/dist/comparison/ComparisonMessage.test.d.ts +0 -2
- package/dist/comparison/ComparisonMessage.test.d.ts.map +0 -1
- package/dist/composables/useLayoutConfig.test.d.ts +0 -2
- package/dist/composables/useLayoutConfig.test.d.ts.map +0 -1
- package/dist/composables/useMarkdownRenderer.test.d.ts +0 -2
- package/dist/composables/useMarkdownRenderer.test.d.ts.map +0 -1
- package/dist/composables/usePendingFiles.test.d.ts +0 -2
- package/dist/composables/usePendingFiles.test.d.ts.map +0 -1
- package/dist/composables/useScrollAnchor.test.d.ts +0 -2
- package/dist/composables/useScrollAnchor.test.d.ts.map +0 -1
- package/dist/composables/useTheme.test.d.ts +0 -2
- package/dist/composables/useTheme.test.d.ts.map +0 -1
- package/dist/composables/useThemePreset.test.d.ts +0 -2
- package/dist/composables/useThemePreset.test.d.ts.map +0 -1
- package/dist/conversation/Conversation.test.d.ts +0 -2
- package/dist/conversation/Conversation.test.d.ts.map +0 -1
- package/dist/conversation/ConversationContent.test.d.ts +0 -2
- package/dist/conversation/ConversationContent.test.d.ts.map +0 -1
- package/dist/conversation/ConversationEmpty.test.d.ts +0 -2
- package/dist/conversation/ConversationEmpty.test.d.ts.map +0 -1
- package/dist/conversation/ConversationScrollBtn.test.d.ts +0 -2
- package/dist/conversation/ConversationScrollBtn.test.d.ts.map +0 -1
- package/dist/integration/chat-flow.test.d.ts +0 -1
- package/dist/integration/chat-flow.test.d.ts.map +0 -1
- package/dist/locales/locales.test.d.ts +0 -2
- package/dist/locales/locales.test.d.ts.map +0 -1
- package/dist/message/Message.test.d.ts +0 -2
- package/dist/message/Message.test.d.ts.map +0 -1
- package/dist/message/MessageAction.test.d.ts +0 -2
- package/dist/message/MessageAction.test.d.ts.map +0 -1
- package/dist/message/MessageContent.test.d.ts +0 -2
- package/dist/message/MessageContent.test.d.ts.map +0 -1
- package/dist/preview/ImageLightbox.test.d.ts +0 -2
- package/dist/preview/ImageLightbox.test.d.ts.map +0 -1
- package/dist/prompt-input/PromptInput.i18n.test.d.ts +0 -2
- package/dist/prompt-input/PromptInput.i18n.test.d.ts.map +0 -1
- package/dist/prompt-input/PromptInput.test.d.ts +0 -2
- package/dist/prompt-input/PromptInput.test.d.ts.map +0 -1
- package/dist/prompt-input/PromptInputAttachments.test.d.ts +0 -2
- package/dist/prompt-input/PromptInputAttachments.test.d.ts.map +0 -1
- package/dist/prompt-input/PromptInputButton.test.d.ts +0 -2
- package/dist/prompt-input/PromptInputButton.test.d.ts.map +0 -1
- package/dist/prompt-input/PromptInputFooter.test.d.ts +0 -2
- package/dist/prompt-input/PromptInputFooter.test.d.ts.map +0 -1
- package/dist/prompt-input/PromptInputSubmit.test.d.ts +0 -2
- package/dist/prompt-input/PromptInputSubmit.test.d.ts.map +0 -1
- package/dist/prompt-input/PromptInputTextarea.test.d.ts +0 -2
- package/dist/prompt-input/PromptInputTextarea.test.d.ts.map +0 -1
- package/dist/prompt-input/PromptInputUploadButton.test.d.ts +0 -2
- package/dist/prompt-input/PromptInputUploadButton.test.d.ts.map +0 -1
- package/dist/shared/Button.test.d.ts +0 -2
- package/dist/shared/Button.test.d.ts.map +0 -1
- package/dist/shared/LanguageToggle.test.d.ts +0 -2
- package/dist/shared/LanguageToggle.test.d.ts.map +0 -1
- package/dist/shared/Shimmer.test.d.ts +0 -2
- package/dist/shared/Shimmer.test.d.ts.map +0 -1
- package/dist/shared/StreamText.test.d.ts +0 -2
- package/dist/shared/StreamText.test.d.ts.map +0 -1
- package/dist/shared/Toast.test.d.ts +0 -2
- package/dist/shared/Toast.test.d.ts.map +0 -1
- package/dist/theme/tokens-meta.test.d.ts +0 -2
- package/dist/theme/tokens-meta.test.d.ts.map +0 -1
- package/dist/thinking/ThinkingBlock.test.d.ts +0 -2
- package/dist/thinking/ThinkingBlock.test.d.ts.map +0 -1
- package/dist/tool-call/ToolCall.test.d.ts +0 -2
- package/dist/tool-call/ToolCall.test.d.ts.map +0 -1
- package/dist/utils/format.test.d.ts +0 -2
- package/dist/utils/format.test.d.ts.map +0 -1
- package/dist/utils/media.test.d.ts +0 -2
- package/dist/utils/media.test.d.ts.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 toimc
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
# @toimc/vue
|
|
2
|
+
|
|
3
|
+
Vue 3.5+ AI 聊天界面组件库:对话容器、消息流、提示词输入、思维链、工具调用、多模态附件、引用溯源、GenUI 动态渲染——62 个组件开箱即用,且全部可深度组合。样式经 `@layer` 分层 + `.ai-chat-` 前缀隔离,宿主一行未分层 CSS 即可覆盖任意设计令牌。
|
|
4
|
+
|
|
5
|
+
组件与 AI 后端完全解耦:数据层来自 [`@toimc/core`](../core) 的 `useChat` + `ChatAdapter` 接口,fetch SSE、mock 剧本、Mastra 网关都能接——本包不持有任何密钥,也不发任何网络请求。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i @toimc/vue
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- peer 依赖 `vue ^3.5.0`(宿主自备)
|
|
14
|
+
- `@toimc/core` 为直接依赖,随安装自动带入
|
|
15
|
+
- **`@toimc/markdown` 是 optionalDependencies**:npm 会自动装上,但不是硬依赖(见下)
|
|
16
|
+
|
|
17
|
+
样式必须显式引入一次(子路径导出,含 Design Token 与全部组件样式):
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import '@toimc/vue/style.css'
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Markdown 渲染(可选装配)
|
|
24
|
+
|
|
25
|
+
不注入渲染器时 `MessageContent` 回退纯文本渲染,不报错。接入 `@toimc/markdown`(Shiki 高亮 + KaTeX 公式 + Mermaid 沙箱 iframe)或任意宿主自制渲染组件,方式二选一:
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
// 方式一:应用入口一次性装配(推荐)——全树消息自动启用 Markdown
|
|
29
|
+
import { markdownRendererKey } from '@toimc/vue'
|
|
30
|
+
import { MarkdownRenderer } from '@toimc/markdown'
|
|
31
|
+
|
|
32
|
+
app.provide(markdownRendererKey, MarkdownRenderer)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```vue
|
|
36
|
+
<!-- 方式二:组件 setup 中注入 -->
|
|
37
|
+
<script setup lang="ts">
|
|
38
|
+
import { provideMarkdownRenderer } from '@toimc/vue'
|
|
39
|
+
import { MarkdownRenderer } from '@toimc/markdown'
|
|
40
|
+
|
|
41
|
+
provideMarkdownRenderer(MarkdownRenderer)
|
|
42
|
+
</script>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
注入的是「组件」本身——想换渲染实现只需换注入对象,消息组件零改动。
|
|
46
|
+
|
|
47
|
+
## 最小可用示例
|
|
48
|
+
|
|
49
|
+
`ChatAdapter` 是唯一需要宿主实现的东西(AsyncGenerator 流式契约):
|
|
50
|
+
|
|
51
|
+
```vue
|
|
52
|
+
<script setup lang="ts">
|
|
53
|
+
import '@toimc/vue/style.css'
|
|
54
|
+
import { useChat } from '@toimc/core'
|
|
55
|
+
import {
|
|
56
|
+
Conversation,
|
|
57
|
+
ConversationContent,
|
|
58
|
+
ConversationEmpty,
|
|
59
|
+
Message,
|
|
60
|
+
MessageContent,
|
|
61
|
+
PromptInput,
|
|
62
|
+
PromptInputTextarea,
|
|
63
|
+
PromptInputSubmit,
|
|
64
|
+
} from '@toimc/vue'
|
|
65
|
+
import type { ChatAdapter } from '@toimc/core'
|
|
66
|
+
|
|
67
|
+
const adapter: ChatAdapter = {
|
|
68
|
+
async *sendMessage({ messages, signal }) {
|
|
69
|
+
const res = await fetch('/api/chat', {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: { 'Content-Type': 'application/json' },
|
|
72
|
+
body: JSON.stringify({ messages }),
|
|
73
|
+
signal,
|
|
74
|
+
})
|
|
75
|
+
const reader = res.body!.getReader()
|
|
76
|
+
const decoder = new TextDecoder()
|
|
77
|
+
while (true) {
|
|
78
|
+
const { done, value } = await reader.read()
|
|
79
|
+
if (done) break
|
|
80
|
+
yield { type: 'text', content: decoder.decode(value, { stream: true }) }
|
|
81
|
+
}
|
|
82
|
+
yield { type: 'done', content: '' }
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const chat = useChat(adapter)
|
|
87
|
+
</script>
|
|
88
|
+
|
|
89
|
+
<template>
|
|
90
|
+
<Conversation>
|
|
91
|
+
<ConversationContent>
|
|
92
|
+
<ConversationEmpty v-if="chat.messages.length === 0">
|
|
93
|
+
<h3>有什么可以帮你的?</h3>
|
|
94
|
+
</ConversationEmpty>
|
|
95
|
+
|
|
96
|
+
<Message v-for="msg in chat.messages" :key="msg.id" :from="msg.role">
|
|
97
|
+
<MessageContent>{{ msg.content }}</MessageContent>
|
|
98
|
+
</Message>
|
|
99
|
+
</ConversationContent>
|
|
100
|
+
|
|
101
|
+
<PromptInput>
|
|
102
|
+
<PromptInputTextarea @send="(t) => chat.send(t)" />
|
|
103
|
+
<PromptInputSubmit />
|
|
104
|
+
</PromptInput>
|
|
105
|
+
</Conversation>
|
|
106
|
+
</template>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 组件总览(62 个 · 14 能力域)
|
|
110
|
+
|
|
111
|
+
每个组件的完整 API(Props / Events / Slots / 交互示例)见文档站对应页(`packages/docs/components/`,仓库根 `pnpm dev:docs` 本地启动)。
|
|
112
|
+
|
|
113
|
+
### 通用 Shared(10)
|
|
114
|
+
|
|
115
|
+
流式文本与表单原语、轻提示等无 AI 语义的基础件,均可独立使用。
|
|
116
|
+
|
|
117
|
+
| 组件 | 职责 |
|
|
118
|
+
| --- | --- |
|
|
119
|
+
| StreamText | 文本逐字流式输出(打字机光标) |
|
|
120
|
+
| Button | 按钮原语 |
|
|
121
|
+
| Input | 输入框原语 |
|
|
122
|
+
| Select | 下拉选择原语 |
|
|
123
|
+
| Radio | 单选原语 |
|
|
124
|
+
| Shimmer | 加载微光占位 |
|
|
125
|
+
| Toast | 轻提示 |
|
|
126
|
+
| LanguageToggle | 中英文切换按钮 |
|
|
127
|
+
| ModelIcon | 模型厂商图标 |
|
|
128
|
+
| JsonDiffView | JSON 差异对比视图 |
|
|
129
|
+
|
|
130
|
+
文档:[stream-text](../docs/components/stream-text.md) · [button](../docs/components/button.md) · [input](../docs/components/input.md) · [select](../docs/components/select.md) · [radio](../docs/components/radio.md) · [shimmer](../docs/components/shimmer.md) · [toast](../docs/components/toast.md) · [language-toggle](../docs/components/language-toggle.md) · [model-icon](../docs/components/model-icon.md) · [json-diff-view](../docs/components/json-diff-view.md)
|
|
131
|
+
|
|
132
|
+
### 对话容器 Conversation(4)
|
|
133
|
+
|
|
134
|
+
对话页骨架:布局容器、滚动消息区、空状态、回到底部。
|
|
135
|
+
|
|
136
|
+
| 组件 | 职责 |
|
|
137
|
+
| --- | --- |
|
|
138
|
+
| Conversation | 对话布局容器(消息区 + 输入区 + 主题承载) |
|
|
139
|
+
| ConversationContent | 滚动消息区 |
|
|
140
|
+
| ConversationEmpty | 空会话欢迎屏容器 |
|
|
141
|
+
| ConversationScrollBtn | 「回到底部」悬浮按钮(配合 useScrollAnchor 的未读计数) |
|
|
142
|
+
|
|
143
|
+
文档:[conversation](../docs/components/conversation.md) · [conversation-scroll-btn](../docs/components/conversation-scroll-btn.md)
|
|
144
|
+
|
|
145
|
+
### 消息 Message(8)
|
|
146
|
+
|
|
147
|
+
消息项与正文聚合渲染。
|
|
148
|
+
|
|
149
|
+
| 组件 | 职责 |
|
|
150
|
+
| --- | --- |
|
|
151
|
+
| Message | 消息项布局(按 role 分侧) |
|
|
152
|
+
| MessageContent | 正文聚合:Markdown(注入渲染器)/ 思考块 / 流式三点 / 工具调用卡(GenUI 优先) |
|
|
153
|
+
| MessageActions | 操作按钮容器(hover 显隐) |
|
|
154
|
+
| MessageAction | 单个操作按钮 |
|
|
155
|
+
| MessageAttachments | 消息附件展示区 |
|
|
156
|
+
| ThinkingBlock | 可折叠思考过程块(进行中 / 已完成 / 耗时) |
|
|
157
|
+
| MessageFeedback | 点赞 / 点踩 |
|
|
158
|
+
| BranchPicker | 多分支回复切换(‹ 2/3 ›) |
|
|
159
|
+
|
|
160
|
+
文档:[message](../docs/components/message.md) · [message-actions](../docs/components/message-actions.md) · [message-feedback](../docs/components/message-feedback.md) · [branch-picker](../docs/components/branch-picker.md)
|
|
161
|
+
|
|
162
|
+
### 预设操作 MessageAction\*(5)
|
|
163
|
+
|
|
164
|
+
常用消息操作的开箱预设,均基于 MessageAction 组装。
|
|
165
|
+
|
|
166
|
+
| 组件 | 职责 |
|
|
167
|
+
| --- | --- |
|
|
168
|
+
| MessageActionCopy | 复制消息全文(配合 useClipboard) |
|
|
169
|
+
| MessageActionRetry | 重新生成 |
|
|
170
|
+
| MessageActionSpeak | 朗读消息(配合 useSpeechOutput) |
|
|
171
|
+
| MessageActionEdit | 编辑后重发 |
|
|
172
|
+
| MessageActionFeedback | 点赞点踩预设 |
|
|
173
|
+
|
|
174
|
+
文档:[message-actions](../docs/components/message-actions.md)
|
|
175
|
+
|
|
176
|
+
### 思维链 Thinking(1)
|
|
177
|
+
|
|
178
|
+
| 组件 | 职责 |
|
|
179
|
+
| --- | --- |
|
|
180
|
+
| ThinkingChain | 多步骤思维链时间线(pending / active / complete / error 分步状态) |
|
|
181
|
+
|
|
182
|
+
文档:[thinking-chain](../docs/components/thinking-chain.md)
|
|
183
|
+
|
|
184
|
+
### 提示词输入 PromptInput(12)
|
|
185
|
+
|
|
186
|
+
自适应输入系统:sendKey 键位切换、IME 组合输入防御、多模态附件管道(上传 / 粘贴 / 拖拽)、建议词触发。
|
|
187
|
+
|
|
188
|
+
| 组件 | 职责 |
|
|
189
|
+
| --- | --- |
|
|
190
|
+
| PromptInput | 输入容器(组合根) |
|
|
191
|
+
| PromptInputBody | 表单体(label + 控件布局) |
|
|
192
|
+
| PromptInputTextarea | 自适应高度文本域,`@send` 触发发送 |
|
|
193
|
+
| PromptInputHeader | 顶部插槽区 |
|
|
194
|
+
| PromptInputFooter | 底部插槽区 |
|
|
195
|
+
| PromptInputTools | 工具按钮行容器 |
|
|
196
|
+
| PromptInputButton | 通用工具按钮 |
|
|
197
|
+
| PromptInputMicButton | 语音输入按钮(配合 useSpeechInput) |
|
|
198
|
+
| PromptInputSubmit | 发送 / 停止中断双态按钮 |
|
|
199
|
+
| PromptInputUploadButton | 文件上传按钮 |
|
|
200
|
+
| PromptInputAttachments | 待发送附件预览列表 |
|
|
201
|
+
| PromptInputSuggestion | 建议词触发面板(parseSuggestion / filterSuggestions 一并导出) |
|
|
202
|
+
|
|
203
|
+
文档:[prompt-input](../docs/components/prompt-input.md) · [prompt-input-suggestion](../docs/components/prompt-input-suggestion.md)
|
|
204
|
+
|
|
205
|
+
### A/B 对比 Comparison(1)
|
|
206
|
+
|
|
207
|
+
| 组件 | 职责 |
|
|
208
|
+
| --- | --- |
|
|
209
|
+
| ComparisonMessage | A/B 双列对比消息,点选收集用户偏好后原地固化 |
|
|
210
|
+
|
|
211
|
+
文档:[comparison-message](../docs/components/comparison-message.md)
|
|
212
|
+
|
|
213
|
+
### 附件展示 Attachment(6)
|
|
214
|
+
|
|
215
|
+
| 组件 | 职责 |
|
|
216
|
+
| --- | --- |
|
|
217
|
+
| Attachments | 附件列表容器(grid / inline / list 布局) |
|
|
218
|
+
| Attachment | 单个附件卡 |
|
|
219
|
+
| AttachmentPreview | 图片缩略图预览 |
|
|
220
|
+
| AttachmentInfo | 文件名 / 大小信息 |
|
|
221
|
+
| AttachmentRemove | 删除按钮 |
|
|
222
|
+
| AttachmentEmpty | 空状态 |
|
|
223
|
+
|
|
224
|
+
文档:[attachments](../docs/components/attachments.md)
|
|
225
|
+
|
|
226
|
+
### 工具调用 ToolCall(6)
|
|
227
|
+
|
|
228
|
+
| 组件 | 职责 |
|
|
229
|
+
| --- | --- |
|
|
230
|
+
| ToolCall | 工具调用可折叠面板(calling / completed / error 等 6 态状态机) |
|
|
231
|
+
| ToolCallHeader | 面板头:状态图标 + 工具名 + 耗时 |
|
|
232
|
+
| ToolCallContent | 面板展开体 |
|
|
233
|
+
| ToolCallInput | 调用参数 JSON |
|
|
234
|
+
| ToolCallOutput | 执行结果 JSON |
|
|
235
|
+
| ToolConfirmation | 等待人工审批的确认交互 |
|
|
236
|
+
|
|
237
|
+
文档:[tool-call](../docs/components/tool-call.md) · [tool-confirmation](../docs/components/tool-confirmation.md)
|
|
238
|
+
|
|
239
|
+
### 引用溯源 Citation(2)
|
|
240
|
+
|
|
241
|
+
| 组件 | 职责 |
|
|
242
|
+
| --- | --- |
|
|
243
|
+
| InlineCitation | 行内引用角标(悬浮展示 quote 片段) |
|
|
244
|
+
| Sources | 来源列表(http(s) 白名单校验后渲染外链,isSafeHttpUrl 可独立复用) |
|
|
245
|
+
|
|
246
|
+
文档:[inline-citation](../docs/components/inline-citation.md) · [sources](../docs/components/sources.md)
|
|
247
|
+
|
|
248
|
+
### GenUI 动态渲染(3)
|
|
249
|
+
|
|
250
|
+
生成式 UI:schema → 组件注册表 → 动态渲染。
|
|
251
|
+
|
|
252
|
+
| 组件 | 职责 |
|
|
253
|
+
| --- | --- |
|
|
254
|
+
| GenUIRenderer | UISchema 动态渲染(props 经 sanitizeGenuiProps 消毒,未注册组件回退 ToolCall 面板) |
|
|
255
|
+
| WeatherCard | 内置示例:天气卡 |
|
|
256
|
+
| PlanActions | 内置示例:计划操作组 |
|
|
257
|
+
|
|
258
|
+
注册表函数一并导出:`registerGenuiComponent` / `resolveGenuiComponent` / `unregisterGenuiComponent`。文档:[genui-renderer](../docs/components/genui-renderer.md)
|
|
259
|
+
|
|
260
|
+
### 欢迎引导 Welcome(2)
|
|
261
|
+
|
|
262
|
+
| 组件 | 职责 |
|
|
263
|
+
| --- | --- |
|
|
264
|
+
| Welcome | 首屏欢迎语 |
|
|
265
|
+
| Prompts | 推荐提示词模板(点击即填) |
|
|
266
|
+
|
|
267
|
+
文档:[welcome](../docs/components/welcome.md)
|
|
268
|
+
|
|
269
|
+
### 图片预览 Preview(1)
|
|
270
|
+
|
|
271
|
+
| 组件 | 职责 |
|
|
272
|
+
| --- | --- |
|
|
273
|
+
| ImageLightbox | 灯箱预览(Esc 关闭、方向键翻页),可独立于消息流使用 |
|
|
274
|
+
|
|
275
|
+
文档:[image-lightbox](../docs/components/image-lightbox.md)
|
|
276
|
+
|
|
277
|
+
### 模型接入 Provider(1)
|
|
278
|
+
|
|
279
|
+
| 组件 | 职责 |
|
|
280
|
+
| --- | --- |
|
|
281
|
+
| ProviderSettingsDialog | 自定义模型端点新增 / 编辑 / 删除表单(存储中立,密钥交宿主持有) |
|
|
282
|
+
|
|
283
|
+
文档:[provider-settings-dialog](../docs/components/provider-settings-dialog.md)
|
|
284
|
+
|
|
285
|
+
## Composables 与工具函数
|
|
286
|
+
|
|
287
|
+
来自 `@toimc/core`(纯逻辑,不依赖 DOM):
|
|
288
|
+
|
|
289
|
+
| 名称 | 职责 |
|
|
290
|
+
| --- | --- |
|
|
291
|
+
| useChat | 聊天状态机:send / stop、messages、streaming / error 状态 |
|
|
292
|
+
| truncateContext / resolveTokenCount | 上下文窗口裁剪与 token 计数 |
|
|
293
|
+
| estimateTokens | token 估算 |
|
|
294
|
+
| generateId / createUserMessage / createAssistantMessage | ID 与消息工厂 |
|
|
295
|
+
| copyText | 剪贴板写入 |
|
|
296
|
+
| splitAtoms / joinAtoms | Markdown 原子切分与重组(流式增量单元) |
|
|
297
|
+
| isUISchema | GenUI UISchema 判别 |
|
|
298
|
+
|
|
299
|
+
来自 `@toimc/vue`(依赖 Vue 响应式):
|
|
300
|
+
|
|
301
|
+
| 名称 | 职责 |
|
|
302
|
+
| --- | --- |
|
|
303
|
+
| useTheme / resolvedTheme / componentTheme | 明暗主题(模块级单例,见下节) |
|
|
304
|
+
| useThemePreset | 主题预设与自定义变量写入容器根 |
|
|
305
|
+
| useMarkdownRenderer / provideMarkdownRenderer | Markdown 渲染器注入通道(见上文装配示例) |
|
|
306
|
+
| useScrollAnchor | 滚动锚定:isAtBottom / 未读计数 / scrollToBottom / bindContainer |
|
|
307
|
+
| useClipboard | copyText 的响应式包装(copied 状态自动复位) |
|
|
308
|
+
| useLayoutConfig | 结构化布局配置 → CSS 变量字典 + Conversation 布局 props |
|
|
309
|
+
| useSpeechInput | 语音输入(Web Speech API 识别) |
|
|
310
|
+
| useSpeechOutput / splitSentences | 语音朗读与按句切分 |
|
|
311
|
+
| compressImageToDataUrl | 图片压缩为 JPEG dataUrl(发送用 dataUrl、预览用 url 分离) |
|
|
312
|
+
| aiChatI18n / setAiChatLocale / getInitialLocale | 国际化(见下节) |
|
|
313
|
+
| tokensMeta | 设计令牌元数据(令牌定制参考) |
|
|
314
|
+
| registerGenuiComponent 等注册表函数 | GenUI 组件注册(见上文 GenUI 节) |
|
|
315
|
+
|
|
316
|
+
## 主题与国际化
|
|
317
|
+
|
|
318
|
+
### 明暗主题
|
|
319
|
+
|
|
320
|
+
`useTheme` 是模块级单例:多处调用共享状态,`'light' | 'dark' | 'system'` 三模式,`system` 跟随 `prefers-color-scheme`;解析结果自动写入 `data-theme` 属性,写入位置由 `target` 决定——`'html'`(默认,写宿主根)或 `'component'`(写组件根子树,不碰宿主 `<html>`)。默认持久化到 `localStorage['ai-chat-theme']`,SSR 安全。
|
|
321
|
+
|
|
322
|
+
```ts
|
|
323
|
+
import { useTheme } from '@toimc/vue'
|
|
324
|
+
|
|
325
|
+
const { theme, resolvedTheme, setTheme, toggleTheme } = useTheme()
|
|
326
|
+
setTheme('dark') // 'light' | 'dark' | 'system'
|
|
327
|
+
toggleTheme()
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### 主题预设
|
|
331
|
+
|
|
332
|
+
`presets` 内置四套 accent 色阶预设:`default`(默认靛蓝)/ `purple`(优雅紫)/ `green`(自然绿)/ `warm`(暖橙),经 `useThemePreset` 应用到容器根 inline style,只替换原始层 accent 变量、不动语义层。
|
|
333
|
+
|
|
334
|
+
### CSS Variables 覆盖
|
|
335
|
+
|
|
336
|
+
组件全部引用 `--ai-chat-*` 令牌,且令牌定义在 `ai-chat-tokens` 层内——宿主一行**未分层** CSS 即可覆盖,无需 `!important`:
|
|
337
|
+
|
|
338
|
+
```css
|
|
339
|
+
:root {
|
|
340
|
+
--ai-chat-color-accent-500: #8b5cf6;
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### 国际化
|
|
345
|
+
|
|
346
|
+
内置 `zh-CN` / `en-US` 双语字典,`zh-CN` 为 source of truth,`en-US` 以 `satisfies MessageSchema` 锁定 key 结构(缺 key / 写错 key 编译期报错)。初始化按「已存偏好 → 浏览器语言 → zh-CN」兜底:
|
|
347
|
+
|
|
348
|
+
```ts
|
|
349
|
+
import { aiChatI18n, setAiChatLocale } from '@toimc/vue'
|
|
350
|
+
|
|
351
|
+
setAiChatLocale('en-US') // 写 locale + 同步 <html lang> + 持久化
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
## 特色能力
|
|
355
|
+
|
|
356
|
+
- **流式渲染**:`StreamText` 打字机光标;`StreamChunk` 契约(text / tool_call / thinking / error / done)贯穿组件层,正文流式期间思考块结束时光标不双闪。
|
|
357
|
+
- **思维链**:`ThinkingBlock` 单消息可折叠思考块;`ThinkingChain` 多步骤时间线,分步 pending / active / complete / error。
|
|
358
|
+
- **工具调用**:`ToolCall` 六态面板 + `ToolConfirmation` 人工审批;`MessageContent` 传 `toolCalls` 即渲染(opt-in),时序上卡片置于总结文字之前。
|
|
359
|
+
- **多模态**:`PromptInputUploadButton` / `PromptInputAttachments` 承接上传 / 粘贴 / 拖拽;`compressImageToDataUrl` 压缩图片(预览走 blob url、发送走 dataUrl);`ImageLightbox` 全屏预览。
|
|
360
|
+
- **GenUI**:`GenUIRenderer` 按 UISchema 从注册表取组件动态渲染,props 经 `sanitizeGenuiProps` 消毒,未注册回退 ToolCall 面板——工具结果从 JSON 变成真正的 UI。
|
|
361
|
+
- **语音**:`useSpeechInput` 识别 + `PromptInputMicButton` 输入;`useSpeechOutput` 朗读 + `MessageActionSpeak` 一键播报,按句切分驱动。
|
|
362
|
+
- **A/B 对比**:`ComparisonMessage` 双列对比,点选即收集偏好并原地固化。
|
|
363
|
+
- **引用溯源**:`InlineCitation` 行内角标悬浮展示引文,`Sources` 来源列表仅放行 http(s) 外链。
|
|
364
|
+
|
|
365
|
+
## 相关包
|
|
366
|
+
|
|
367
|
+
| 包 | 说明 |
|
|
368
|
+
| --- | --- |
|
|
369
|
+
| [@toimc/core](../core) | 核心类型与 useChat / ChatAdapter(本包运行时依赖) |
|
|
370
|
+
| [@toimc/markdown](../markdown) | Markdown 渲染:Shiki + KaTeX + Mermaid 沙箱(可选依赖,见上文装配) |
|
|
371
|
+
| [@toimc/agents](../agents) | 服务端模型适配层(多协议适配器) |
|
|
372
|
+
| [@toimc/server](../server) | Hono 聊天网关(SSE) |
|
|
373
|
+
|
|
374
|
+
完整文档在仓库 `packages/docs/`(VitePress):33 个组件页 + 7 个 composable 页,Props / Events / Slots 全表与交互示例;仓库根 `pnpm dev:docs` 本地启动。
|
|
@@ -2,10 +2,12 @@ import { Attachment } from '@toimc/core';
|
|
|
2
2
|
type __VLS_Props = {
|
|
3
3
|
data: Attachment;
|
|
4
4
|
};
|
|
5
|
-
declare
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
declare const __VLS_template: () => {
|
|
6
|
+
__VLS_Slots: {
|
|
7
|
+
default?: (props: {}) => any;
|
|
8
|
+
};
|
|
8
9
|
};
|
|
10
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
9
11
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
10
12
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
11
13
|
declare const _default: typeof __VLS_export;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Attachment.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/Attachment.vue"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"Attachment.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/Attachment.vue"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,UAAU,CAAA;CACjB,CAAC;AAiBF,QAAA,MAAM,cAAc;;kBASN,CAAC,KAAK,IAAgB,KAAK,GAAG;;CAI3C,CAAC;AACF,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC;AAEpE,QAAA,MAAM,UAAU,kSAEd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
declare
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
declare const __VLS_template: () => {
|
|
2
|
+
__VLS_Slots: {
|
|
3
|
+
default?: (props: {}) => any;
|
|
4
|
+
};
|
|
4
5
|
};
|
|
6
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
5
7
|
declare const __VLS_base: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
6
8
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
7
9
|
declare const _default: typeof __VLS_export;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachmentEmpty.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/AttachmentEmpty.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AttachmentEmpty.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/AttachmentEmpty.vue"],"names":[],"mappings":"AAmCA,QAAA,MAAM,cAAc;;kBAUN,CAAC,KAAK,IAAgB,KAAK,GAAG;;CAM3C,CAAC;AACF,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC;AAEpE,QAAA,MAAM,UAAU,+QACd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachmentInfo.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/AttachmentInfo.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AttachmentInfo.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/AttachmentInfo.vue"],"names":[],"mappings":"AAmFA,QAAA,MAAM,YAAY,+QAChB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachmentRemove.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/AttachmentRemove.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AttachmentRemove.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/AttachmentRemove.vue"],"names":[],"mappings":"AA+GA,QAAA,MAAM,YAAY;;;;iFAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
type __VLS_Props = {
|
|
2
2
|
variant?: 'grid' | 'inline' | 'list';
|
|
3
3
|
};
|
|
4
|
-
declare
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
declare const __VLS_template: () => {
|
|
5
|
+
__VLS_Slots: {
|
|
6
|
+
default?: (props: {}) => any;
|
|
7
|
+
};
|
|
7
8
|
};
|
|
9
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
8
10
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
9
|
-
variant: "
|
|
11
|
+
variant: "list" | "grid" | "inline";
|
|
10
12
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
11
13
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
12
14
|
declare const _default: typeof __VLS_export;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Attachments.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/Attachments.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Attachments.vue.d.ts","sourceRoot":"","sources":["../../src/attachment/Attachments.vue"],"names":[],"mappings":"AAyCA,KAAK,WAAW,GAAG;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;CACrC,CAAC;AAoBJ,QAAA,MAAM,cAAc;;kBAUN,CAAC,KAAK,IAAgB,KAAK,GAAG;;CAM3C,CAAC;AACF,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC;AAEpE,QAAA,MAAM,UAAU;;6EAGd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { MessageSource } from '@toimc/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** 显示编号,从 1 起 */
|
|
4
|
+
index: number;
|
|
5
|
+
/** 该角标关联的来源;多来源时卡片内轮播 */
|
|
6
|
+
sources: MessageSource[];
|
|
7
|
+
/** 悬浮卡宽度 px,默认 300 */
|
|
8
|
+
cardWidth?: number;
|
|
9
|
+
}
|
|
10
|
+
declare const __VLS_export: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
11
|
+
select: (source: MessageSource) => any;
|
|
12
|
+
}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
|
|
13
|
+
onSelect?: ((source: MessageSource) => any) | undefined;
|
|
14
|
+
}>, {
|
|
15
|
+
cardWidth: number;
|
|
16
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
17
|
+
declare const _default: typeof __VLS_export;
|
|
18
|
+
export default _default;
|
|
19
|
+
//# sourceMappingURL=InlineCitation.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineCitation.vue.d.ts","sourceRoot":"","sources":["../../src/citation/InlineCitation.vue"],"names":[],"mappings":"AA8RA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,UAAU,KAAK;IACb,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,yBAAyB;IACzB,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA4KD,QAAA,MAAM,YAAY;;;;;;6EAIhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { MessageSource } from '@toimc/core';
|
|
2
|
+
interface Props {
|
|
3
|
+
sources: MessageSource[];
|
|
4
|
+
/** 分组标题,默认 i18n citation.sources(含计数) */
|
|
5
|
+
title?: string;
|
|
6
|
+
/** 横排徽标模式(Popover 展示详情);默认 false = 折叠列表 */
|
|
7
|
+
inline?: boolean;
|
|
8
|
+
/** inline 模式最多直接显示数,超出折叠进 Popover,默认 3 */
|
|
9
|
+
maxInline?: number;
|
|
10
|
+
/** 初始展开态(非 inline 模式),默认 false 折叠 */
|
|
11
|
+
defaultOpen?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare const __VLS_template: () => {
|
|
14
|
+
__VLS_Slots: {
|
|
15
|
+
source?: (props: {
|
|
16
|
+
source: MessageSource;
|
|
17
|
+
index: number;
|
|
18
|
+
}) => any;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
22
|
+
declare const __VLS_base: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
23
|
+
select: (source: MessageSource, index: number) => any;
|
|
24
|
+
}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
|
|
25
|
+
onSelect?: ((source: MessageSource, index: number) => any) | undefined;
|
|
26
|
+
}>, {
|
|
27
|
+
title: string;
|
|
28
|
+
inline: boolean;
|
|
29
|
+
maxInline: number;
|
|
30
|
+
defaultOpen: boolean;
|
|
31
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
32
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
33
|
+
declare const _default: typeof __VLS_export;
|
|
34
|
+
export default _default;
|
|
35
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
36
|
+
new (): {
|
|
37
|
+
$slots: S;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=Sources.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sources.vue.d.ts","sourceRoot":"","sources":["../../src/citation/Sources.vue"],"names":[],"mappings":"AAgXA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,UAAU,KAAK;IACb,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAiED,QAAA,MAAM,cAAc;;iBAgOP,CAAC,KAAK;;;SAAgB,KAAK,GAAG;;CAM1C,CAAC;AACF,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC;AAEpE,QAAA,MAAM,UAAU;;;;;;;;;6EAId,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/citation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/citation/url.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlD"}
|
|
@@ -9,20 +9,22 @@ type __VLS_Props = {
|
|
|
9
9
|
stackOnMobile?: boolean;
|
|
10
10
|
disabled?: boolean;
|
|
11
11
|
};
|
|
12
|
-
declare
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
} & {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
} & {
|
|
24
|
-
|
|
12
|
+
declare const __VLS_template: () => {
|
|
13
|
+
__VLS_Slots: {
|
|
14
|
+
left?: (props: {
|
|
15
|
+
label: string;
|
|
16
|
+
}) => any;
|
|
17
|
+
} & {
|
|
18
|
+
'action-left'?: (props: {}) => any;
|
|
19
|
+
} & {
|
|
20
|
+
right?: (props: {
|
|
21
|
+
label: string;
|
|
22
|
+
}) => any;
|
|
23
|
+
} & {
|
|
24
|
+
'action-right'?: (props: {}) => any;
|
|
25
|
+
};
|
|
25
26
|
};
|
|
27
|
+
type __VLS_Slots = ReturnType<typeof __VLS_template>['__VLS_Slots'];
|
|
26
28
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
27
29
|
prefer: (args_0: {
|
|
28
30
|
chosen: Side;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComparisonMessage.vue.d.ts","sourceRoot":"","sources":["../../src/comparison/ComparisonMessage.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ComparisonMessage.vue.d.ts","sourceRoot":"","sources":["../../src/comparison/ComparisonMessage.vue"],"names":[],"mappings":"AAmMA,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,CAAA;AAErB,KAAK,WAAW,GAAG;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AAwDJ,QAAA,MAAM,cAAc;;eAgHT,CAAC,KAAK;;SAAgB,KAAK,GAAG;;wBACrB,CAAC,KAAK,IAAgB,KAAK,GAAG;;gBACtC,CAAC,KAAK;;SAAiB,KAAK,GAAG;;yBACtB,CAAC,KAAK,IAAiB,KAAK,GAAG;;CAMnD,CAAC;AACF,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC;AAEpE,QAAA,MAAM,UAAU;;gBAlKK,IAAI;cAAQ,MAAM;eAAS,MAAM;;;;gBAAjC,IAAI;cAAQ,MAAM;eAAS,MAAM;;;;;;6EAsKpD,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
/** copyText 的响应式包装:复制成功后 copied 置 true,resetDelay 毫秒后自动复位 */
|
|
3
|
+
export declare function useClipboard(resetDelay?: number): {
|
|
4
|
+
copied: Ref<boolean>;
|
|
5
|
+
copy: (text: string) => Promise<boolean>;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=useClipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClipboard.d.ts","sourceRoot":"","sources":["../../src/composables/useClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAGpE,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,UAAU,SAAO,GAAG;IAC/C,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACpB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACzC,CAoCA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollAnchor.d.ts","sourceRoot":"","sources":["../../src/composables/useScrollAnchor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACxB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,aAAa,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;CAChD;AAED,wBAAgB,eAAe,CAAC,SAAS,SAAK,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"useScrollAnchor.d.ts","sourceRoot":"","sources":["../../src/composables/useScrollAnchor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACxB,iCAAiC;IACjC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACxB,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,aAAa,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;CAChD;AAED,wBAAgB,eAAe,CAAC,SAAS,SAAK,GAAG,mBAAmB,CA+EnE"}
|