From b8aa794a2572517436cff365a9088f6328332c20 Mon Sep 17 00:00:00 2001 From: deepinsect Date: Wed, 22 Oct 2025 11:11:28 +0800 Subject: [PATCH 1/2] feat(theme): add markdown layout style and table style --- src/renderer/src/components/ModelSelect.vue | 2 +- src/renderer/src/components/NewThread.vue | 192 ++++++------------ .../src/components/chat-input/ChatInput.vue | 5 +- .../components/markdown/MarkdownRenderer.vue | 59 +++++- .../components/message/MessageBlockError.vue | 27 ++- .../message/MessageItemAssistant.vue | 2 +- 6 files changed, 139 insertions(+), 148 deletions(-) diff --git a/src/renderer/src/components/ModelSelect.vue b/src/renderer/src/components/ModelSelect.vue index be1b164ca..5cd351838 100644 --- a/src/renderer/src/components/ModelSelect.vue +++ b/src/renderer/src/components/ModelSelect.vue @@ -2,7 +2,7 @@
diff --git a/src/renderer/src/components/NewThread.vue b/src/renderer/src/components/NewThread.vue index 49277bf16..592647833 100644 --- a/src/renderer/src/components/NewThread.vue +++ b/src/renderer/src/components/NewThread.vue @@ -15,85 +15,75 @@ :context-length="contextLength" @send="handleSend" > -
@@ -118,14 +108,11 @@ import { computed, nextTick, ref, watch, onMounted } from 'vue' import { UserMessageContent } from '@shared/chat' import ChatConfig from './ChatConfig.vue' import { usePresenter } from '@/composables/usePresenter' -import { useEventListener } from '@vueuse/core' import { useThemeStore } from '@/stores/theme' -import { useLanguageStore } from '@/stores/language' import { ModelType } from '@shared/model' const configPresenter = usePresenter('configPresenter') const themeStore = useThemeStore() -const langStore = useLanguageStore() // 定义偏好模型的类型 interface PreferredModel { modelId: string @@ -306,17 +293,7 @@ watch( const modelSelectOpen = ref(false) const settingsPopoverOpen = ref(false) -const showSettingsButton = ref(false) -const isHovering = ref(false) const chatInputRef = ref | null>(null) -// 监听鼠标悬停 -const handleMouseEnter = () => { - isHovering.value = true -} - -const handleMouseLeave = () => { - isHovering.value = false -} const handleModelUpdate = (model: MODEL_META, providerId: string) => { activeModel.value = { @@ -405,41 +382,13 @@ watch( ) onMounted(async () => { - const groupElement = document.querySelector('.new-thread-model-select') configPresenter.getDefaultSystemPrompt().then((prompt) => { systemPrompt.value = prompt }) // 组件激活时初始化一次默认模型 await initActiveModel() - if (groupElement) { - useEventListener(groupElement, 'mouseenter', handleMouseEnter) - useEventListener(groupElement, 'mouseleave', handleMouseLeave) - } }) -const handleSettingsPopoverUpdate = (isOpen: boolean) => { - if (isOpen) { - // 如果打开,立即显示按钮 - showSettingsButton.value = true - } else { - // 如果关闭,延迟隐藏按钮,等待动画完成 - setTimeout(() => { - showSettingsButton.value = false - }, 300) // 300ms是一个常见的动画持续时间,可以根据实际情况调整 - } -} - -// 初始化时设置showSettingsButton的值与settingsPopoverOpen一致 -watch( - settingsPopoverOpen, - (value) => { - if (value) { - showSettingsButton.value = true - } - }, - { immediate: true } -) - const handleSend = async (content: UserMessageContent) => { const threadId = await chatStore.createThread(content.text, { providerId: activeModel.value.providerId, @@ -461,14 +410,3 @@ const handleSend = async (content: UserMessageContent) => { chatStore.sendMessage(content) } - - diff --git a/src/renderer/src/components/chat-input/ChatInput.vue b/src/renderer/src/components/chat-input/ChatInput.vue index 03dc158b1..374525c0e 100644 --- a/src/renderer/src/components/chat-input/ChatInput.vue +++ b/src/renderer/src/components/chat-input/ChatInput.vue @@ -100,13 +100,12 @@ - - -
+ +
- +
@@ -17,7 +17,7 @@ import NodeRenderer, { setCustomComponents } from 'vue-renderer-markdown' -defineProps<{ +const props = defineProps<{ content: string debug?: boolean }>() @@ -99,7 +99,7 @@ defineEmits(['copy']) margin: 0 !important; } p { - @apply my-0; + @apply my-2; } li p { padding-top: 0; @@ -107,12 +107,32 @@ defineEmits(['copy']) margin-top: 0; margin-bottom: 0; } + h1 { + @apply text-2xl font-bold my-3 py-0; + } + h2 { + @apply text-xl font-medium my-3 py-0; + } + h3 { + @apply text-base font-medium my-2 py-0; + } + h4 { + @apply text-sm font-medium my-2 py-0; + } + h5 { + @apply text-sm my-1.5 py-0; + } + h6 { + @apply text-sm my-1.5 py-0; + } + + ul, + ol { + @apply my-1.5; + } hr { - margin-block-start: 0.5em; - margin-block-end: 0.5em; - margin-inline-start: auto; - margin-inline-end: auto; + @apply my-8; } /* @@ -123,5 +143,30 @@ defineEmits(['copy']) a .markdown-renderer { display: inline; } + + .table-node-wrapper { + @apply border border-border rounded-lg py-0 my-0 overflow-hidden shadow-sm; + } + + table { + @apply py-0 my-0; + /* @apply bg-card border block rounded-lg my-0 py-0 overflow-hidden; */ + border-collapse: collapse; + } + + thead, + thead tr, + thead th { + @apply bg-muted; + } + + th, + td { + @apply border-b not-last:border-r border-border; + } + + tbody tr:last-child td { + @apply border-b-0; + } } diff --git a/src/renderer/src/components/message/MessageBlockError.vue b/src/renderer/src/components/message/MessageBlockError.vue index 9cf7568de..6a313819a 100644 --- a/src/renderer/src/components/message/MessageBlockError.vue +++ b/src/renderer/src/components/message/MessageBlockError.vue @@ -6,15 +6,22 @@ {{ t(block.content || '') }}
-
-
- - {{ t('common.error.requestFailed') }} +
+
+ {{ t('common.error.requestFailed') + }}
-
+
{{ t(block.content || '') }}
@@ -26,7 +33,7 @@