From c5193626a55cce1893f5c72777cecc9c53859efc Mon Sep 17 00:00:00 2001 From: KiriAky 107 Date: Sun, 30 Aug 2026 09:57:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=E5=BC=95=E5=85=A5=E5=8F=AF?= =?UTF-8?q?=E8=A7=86=E5=8C=96Markdown=E5=86=99=E4=BD=9C=E4=B8=8EShiki?= =?UTF-8?q?=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/MarkdownContent.vue | 42 +++++ frontend/src/features/chat/ChatView.vue | 13 +- frontend/src/features/editor/EditorPane.vue | 28 +--- .../features/editor/VisualMarkdownEditor.vue | 144 ++++++++++++++++++ frontend/src/utils/markdown.ts | 48 +++++- frontend/tsconfig.app.json | 2 +- 6 files changed, 237 insertions(+), 40 deletions(-) create mode 100644 frontend/src/components/common/MarkdownContent.vue create mode 100644 frontend/src/features/editor/VisualMarkdownEditor.vue diff --git a/frontend/src/components/common/MarkdownContent.vue b/frontend/src/components/common/MarkdownContent.vue new file mode 100644 index 0000000..b0a225d --- /dev/null +++ b/frontend/src/components/common/MarkdownContent.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/frontend/src/features/chat/ChatView.vue b/frontend/src/features/chat/ChatView.vue index b269d5f..df3dee4 100644 --- a/frontend/src/features/chat/ChatView.vue +++ b/frontend/src/features/chat/ChatView.vue @@ -7,7 +7,7 @@ import { useEditorStore } from '@/stores/editor' import { useProviderStore } from '@/stores/provider' import { useSkillStore } from '@/stores/skill' import { useWorkspaceStore } from '@/stores/workspace' -import { renderMarkdown } from '@/utils/markdown' +import MarkdownContent from '@/components/common/MarkdownContent.vue' const chatStore = useChatStore() const providerStore = useProviderStore() @@ -69,7 +69,7 @@ async function openCitation(citation: Citation) {
{{ message.role === 'user' ? '你' : 'AI' }}
思考过程

{{ message.thinking }}

-
+
正在思考…
{{ call.status }}{{ call.name }}
{{ JSON.stringify(call.parameters, null, 2) }}
@@ -104,15 +104,6 @@ async function openCitation(citation: Citation) { .avatar { display: grid; place-items: center; width: 34px; height: 34px; border-radius: var(--radius-full); background: var(--color-background-tertiary); font-weight: 700; } .assistant .avatar { background: var(--color-accent-soft); color: var(--color-accent-primary); } .message-content { white-space: pre-wrap; line-height: var(--line-height-relaxed); } -.markdown-content { white-space: normal; user-select: text; } -.markdown-content :deep(p), .markdown-content :deep(ul), .markdown-content :deep(ol), .markdown-content :deep(pre), .markdown-content :deep(blockquote) { margin: .65em 0; } -.markdown-content :deep(h1), .markdown-content :deep(h2), .markdown-content :deep(h3) { margin: 1em 0 .5em; line-height: var(--line-height-tight); } -.markdown-content :deep(ul) { padding-left: 1.5em; list-style: disc; }.markdown-content :deep(ol) { padding-left: 1.5em; list-style: decimal; } -.markdown-content :deep(pre) { overflow: auto; padding: var(--space-md); border-radius: var(--radius-md); background: var(--color-background-secondary); } -.markdown-content :deep(code) { padding: .1em .3em; border-radius: var(--radius-sm); background: var(--color-background-tertiary); font-family: var(--font-ui-mono); }.markdown-content :deep(pre code) { padding: 0; background: transparent; } -.markdown-content :deep(blockquote) { padding-left: 1em; border-left: 3px solid var(--color-accent-primary); color: var(--color-text-secondary); } -.markdown-content :deep(table) { width: 100%; margin: .65em 0; border-collapse: collapse; }.markdown-content :deep(th), .markdown-content :deep(td) { padding: .45em .65em; border: 1px solid var(--color-border-default); text-align: left; } -.markdown-content :deep(img) { max-width: 100%; }.markdown-content :deep(hr) { margin: 1em 0; border: 0; border-top: 1px solid var(--color-border-default); } .thinking { margin-bottom: var(--space-sm); color: var(--color-text-secondary); }.thinking p { margin-top: var(--space-sm); white-space: pre-wrap; } .tool-calls { display: grid; gap: var(--space-sm); margin-top: var(--space-md); }.tool-calls .item-card { display: grid; gap: var(--space-xs); }.tool-calls pre { overflow: auto; font-size: var(--font-size-xs); } .usage { display: block; margin-top: var(--space-xs); color: var(--color-text-tertiary); } diff --git a/frontend/src/features/editor/EditorPane.vue b/frontend/src/features/editor/EditorPane.vue index 6da29c9..2e64f78 100644 --- a/frontend/src/features/editor/EditorPane.vue +++ b/frontend/src/features/editor/EditorPane.vue @@ -1,13 +1,10 @@