From 63714b6c6e6f13a60d9b3c1c6e1e8c2443375020 Mon Sep 17 00:00:00 2001 From: oudecheng <13802883547@139.com> Date: Fri, 26 Jun 2026 11:34:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E6=A0=8F=E6=94=B6=E8=B5=B7/=E5=B1=95=E5=BC=80=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/App.tsx | 119 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 27 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index 6b3ad5a..5606df4 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { Zap, ArrowLeft, Bot, Clock, Sun, Moon, PanelRightOpen, X, Brain, Settings as SettingsIcon, ChevronRight } from 'lucide-react' +import { Zap, ArrowLeft, Bot, Clock, Sun, Moon, PanelRightOpen, PanelLeftClose, PanelLeftOpen, X, Brain, Settings as SettingsIcon, ChevronRight } from 'lucide-react' import { ChatContainer } from './components/Chat/ChatContainer' import { TopicList } from './components/Sidebar/TopicList' import { SchedulerJobList } from './components/Sidebar/SchedulerJobList' @@ -120,6 +120,22 @@ function App() { const [rightPanelTab, setRightPanelTab] = useState<'memory' | 'skill'>('memory') + const [sidebarCollapsed, setSidebarCollapsed] = useState(() => { + try { + return localStorage.getItem('picobot-sidebar-collapsed') === 'true' + } catch { + return false + } + }) + + const toggleSidebar = useCallback(() => { + setSidebarCollapsed(prev => { + const next = !prev + localStorage.setItem('picobot-sidebar-collapsed', String(next)) + return next + }) + }, []) + const [theme, setTheme] = useState<'dark' | 'light'>(() => { const saved = localStorage.getItem('picobot-theme') return saved === 'light' ? 'light' : 'dark' @@ -562,34 +578,83 @@ function App() { {/* Main Content */}
- {/* Left Sidebar */} -
- {/* Tab 栏 */} -
- - + {/* Left Sidebar — smooth width animation via will-change + overflow-hidden */} +
+ {/* Tab 栏 + collapse toggle */} +
+ {sidebarCollapsed ? ( + /* 收起态:紧凑竖排 tab 按钮 */ +
+ + + {/* 展开按钮 */} + +
+ ) : ( + <> + + + {/* 收起按钮 */} + + + )}
-
- {sidebarTab === 'topics' ? ( +
+ {sidebarCollapsed ? null : sidebarTab === 'topics' ? (