From 9556db2f900ef4a0097b4f6bd940e4c2b2a0fa9c Mon Sep 17 00:00:00 2001 From: ekko Date: Wed, 15 Apr 2026 09:12:54 +0800 Subject: [PATCH] feat: add mobile responsiveness support - Hamburger menu + drawer sidebar for mobile navigation - Auto-collapse chat session list on mobile - Responsive grids, modals, forms, and settings - Touch-friendly nav items (44px targets) - Skills page sidebar toggle on mobile - Memory sections stack vertically on mobile Co-Authored-By: Claude Opus 4.6 --- src/App.vue | 11 +++- src/components/chat/ChatPanel.vue | 29 ++++++++- src/components/chat/MarkdownRenderer.vue | 3 + src/components/chat/MessageItem.vue | 14 ++++ src/components/jobs/JobFormModal.vue | 2 +- src/components/jobs/JobsPanel.vue | 2 +- src/components/layout/AppSidebar.vue | 23 ++++++- src/components/layout/LanguageSwitch.vue | 2 +- src/components/models/ProviderFormModal.vue | 2 +- src/components/models/ProvidersPanel.vue | 2 +- src/components/settings/AgentSettings.vue | 8 +-- src/components/settings/MemorySettings.vue | 4 +- src/components/settings/PlatformSettings.vue | 26 ++++---- src/components/settings/SessionSettings.vue | 6 +- src/components/settings/SettingRow.vue | 16 +++++ src/components/usage/StatCards.vue | 6 ++ src/stores/app.ts | 13 ++++ src/styles/global.scss | 53 +++++++++++++++ src/styles/variables.scss | 1 + src/views/LoginView.vue | 7 +- src/views/LogsView.vue | 6 +- src/views/MemoryView.vue | 4 ++ src/views/SettingsView.vue | 8 +-- src/views/SkillsView.vue | 68 ++++++++++++++++++-- 24 files changed, 273 insertions(+), 43 deletions(-) diff --git a/src/App.vue b/src/App.vue index 8a37246..9552aff 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@ diff --git a/src/components/models/ProviderFormModal.vue b/src/components/models/ProviderFormModal.vue index 11f081a..5477c5b 100644 --- a/src/components/models/ProviderFormModal.vue +++ b/src/components/models/ProviderFormModal.vue @@ -150,7 +150,7 @@ function handleClose() { v-model:show="showModal" preset="card" :title="t('models.addProvider')" - :style="{ width: '520px' }" + :style="{ width: 'min(520px, calc(100vw - 32px))' }" :mask-closable="!loading" @after-leave="emit('close')" > diff --git a/src/components/models/ProvidersPanel.vue b/src/components/models/ProvidersPanel.vue index 720a8c6..4e46fcb 100644 --- a/src/components/models/ProvidersPanel.vue +++ b/src/components/models/ProvidersPanel.vue @@ -48,7 +48,7 @@ const modelsStore = useModelsStore() .providers-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(420px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(min(100%, 420px), 1fr)); gap: 14px; } diff --git a/src/components/settings/AgentSettings.vue b/src/components/settings/AgentSettings.vue index 3b424b9..9679473 100644 --- a/src/components/settings/AgentSettings.vue +++ b/src/components/settings/AgentSettings.vue @@ -24,7 +24,7 @@ async function save(values: Record) { @@ -32,7 +32,7 @@ async function save(values: Record) { @@ -40,7 +40,7 @@ async function save(values: Record) { @@ -52,7 +52,7 @@ async function save(values: Record) { { label: t('settings.agent.always'), value: 'always' }, { label: t('settings.agent.never'), value: 'never' }, ]" - size="small" style="width: 120px" + size="small" class="input-sm" @update:value="v => save({ tool_use_enforcement: v })" /> diff --git a/src/components/settings/MemorySettings.vue b/src/components/settings/MemorySettings.vue index b7bed25..121b7bf 100644 --- a/src/components/settings/MemorySettings.vue +++ b/src/components/settings/MemorySettings.vue @@ -30,7 +30,7 @@ async function save(values: Record) { @@ -38,7 +38,7 @@ async function save(values: Record) { diff --git a/src/components/settings/PlatformSettings.vue b/src/components/settings/PlatformSettings.vue index 25ef38e..874c476 100644 --- a/src/components/settings/PlatformSettings.vue +++ b/src/components/settings/PlatformSettings.vue @@ -164,7 +164,7 @@ const platforms = [