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' ? (