From 13cdb55268e27c3ae48f15cdde752746d79ce440 Mon Sep 17 00:00:00 2001 From: KiriAky 107 Date: Sat, 29 Aug 2026 22:49:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=E6=8E=A5=E9=80=9A=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E9=A1=B5=E9=9D=A2=E8=B7=AF=E7=94=B1=E4=B8=8E=E6=A1=8C?= =?UTF-8?q?=E9=9D=A2=E5=A3=B3=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/common/AppShell.vue | 6 +- .../src/components/common/CommandPalette.vue | 101 ++++++++++++++++++ .../src/components/common/PrimarySidebar.vue | 24 ++++- .../components/common/SecondarySidebar.vue | 16 +-- frontend/src/components/common/StatusBar.vue | 4 +- .../src/features/common/PlaceholderView.vue | 34 ------ frontend/src/features/editor/EditorHeader.vue | 29 ++++- frontend/src/features/editor/EditorPane.vue | 9 +- frontend/src/router/index.ts | 17 ++- 9 files changed, 176 insertions(+), 64 deletions(-) create mode 100644 frontend/src/components/common/CommandPalette.vue delete mode 100644 frontend/src/features/common/PlaceholderView.vue diff --git a/frontend/src/components/common/AppShell.vue b/frontend/src/components/common/AppShell.vue index 289cfac..b53ab2f 100644 --- a/frontend/src/components/common/AppShell.vue +++ b/frontend/src/components/common/AppShell.vue @@ -4,12 +4,11 @@ import { useRoute, useRouter } from 'vue-router' import { useWorkspaceStore } from '@/stores/workspace' import { useThemeStore } from '@/stores/theme' import { useEditorStore } from '@/stores/editor' -import { useSettingsStore } from '@/stores/settings' -import { useAgentStore } from '@/stores/agent' import PrimarySidebar from './PrimarySidebar.vue' import SecondarySidebar from './SecondarySidebar.vue' import StatusBar from './StatusBar.vue' import TitleBar from './TitleBar.vue' +import CommandPalette from './CommandPalette.vue' defineProps<{ showSecondarySidebar?: boolean @@ -18,8 +17,6 @@ defineProps<{ const workspaceStore = useWorkspaceStore() const themeStore = useThemeStore() const editorStore = useEditorStore() -const settingsStore = useSettingsStore() -const agentStore = useAgentStore() const route = useRoute() const router = useRouter() @@ -58,6 +55,7 @@ defineExpose({ openCitation }) + diff --git a/frontend/src/components/common/CommandPalette.vue b/frontend/src/components/common/CommandPalette.vue new file mode 100644 index 0000000..b501f1a --- /dev/null +++ b/frontend/src/components/common/CommandPalette.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/frontend/src/components/common/PrimarySidebar.vue b/frontend/src/components/common/PrimarySidebar.vue index e5d0047..5aa7886 100644 --- a/frontend/src/components/common/PrimarySidebar.vue +++ b/frontend/src/components/common/PrimarySidebar.vue @@ -1,9 +1,10 @@ @@ -62,6 +69,11 @@ function navigate(name: string) { z-index: var(--z-sidebar); } +.primary-sidebar.expanded { width: var(--sidebar-primary-width-expanded); } +.primary-sidebar.expanded .nav-item { flex-direction: row; justify-content: flex-start; gap: var(--space-md); padding: 0 var(--space-lg); } +.primary-sidebar.expanded .nav-icon { margin-bottom: 0; } +.primary-sidebar.expanded .nav-label { font-size: var(--font-size-sm); } + .nav-list { flex: 1; padding: var(--space-sm) 0; @@ -121,4 +133,6 @@ function navigate(name: string) { padding: var(--space-sm) 0; border-top: 1px solid var(--color-border-subtle); } + +.collapse-button { width: calc(100% - 8px); } diff --git a/frontend/src/components/common/SecondarySidebar.vue b/frontend/src/components/common/SecondarySidebar.vue index 99c5a68..1c51e1f 100644 --- a/frontend/src/components/common/SecondarySidebar.vue +++ b/frontend/src/components/common/SecondarySidebar.vue @@ -1,6 +1,11 @@ - - - - diff --git a/frontend/src/features/editor/EditorHeader.vue b/frontend/src/features/editor/EditorHeader.vue index 42a2801..82d0497 100644 --- a/frontend/src/features/editor/EditorHeader.vue +++ b/frontend/src/features/editor/EditorHeader.vue @@ -4,12 +4,24 @@ import { useWorkspaceStore } from '@/stores/workspace' const editorStore = useEditorStore() const workspaceStore = useWorkspaceStore() + +const statusText: Record = { + idle: '空闲', dirty: '未保存', saving: '保存中…', saved: '已保存', save_failed: '保存失败', + external_changed: '外部文件已变化', conflict: '存在编辑冲突', +} @@ -23,4 +35,17 @@ const workspaceStore = useWorkspaceStore() border-bottom: 1px solid var(--color-border-subtle); color: var(--color-text-secondary); } +.file-identity { display: grid; min-width: 0; } +.file-identity strong, .file-identity small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.file-identity small { color: var(--color-text-tertiary); font-size: var(--font-size-xs); } +.editor-actions, .mode-switch { display: flex; align-items: center; gap: var(--space-sm); } +.save-status { color: var(--color-text-tertiary); font-size: var(--font-size-xs); } +.save-status.dirty, .save-status.external_changed { color: var(--color-warning); } +.save-status.save_failed, .save-status.conflict { color: var(--color-error); } +.save-status.saved { color: var(--color-success); } +.mode-switch { gap: 2px; padding: 2px; border-radius: var(--radius-md); background: var(--color-background-secondary); } +.mode-switch button, .save-button { padding: 5px 9px; border-radius: var(--radius-sm); } +.mode-switch button.active { background: var(--color-surface-primary); color: var(--color-accent-primary); box-shadow: var(--shadow-sm); } +.save-button { background: var(--color-accent-primary); color: var(--color-text-inverse); } +.save-button:disabled { opacity: .55; } diff --git a/frontend/src/features/editor/EditorPane.vue b/frontend/src/features/editor/EditorPane.vue index d4a60ba..f575ee5 100644 --- a/frontend/src/features/editor/EditorPane.vue +++ b/frontend/src/features/editor/EditorPane.vue @@ -5,10 +5,12 @@ const editorStore = useEditorStore()