diff --git a/frontend-web/src/components/page-sidebar.tsx b/frontend-web/src/components/page-sidebar.tsx new file mode 100644 index 00000000..963715d0 --- /dev/null +++ b/frontend-web/src/components/page-sidebar.tsx @@ -0,0 +1,116 @@ +import { NavLink, useLocation } from "react-router-dom"; +import { + ChevronLeft, + ChevronRight, + FileText, + LayoutDashboard, +} from "lucide-react"; + +const navItems = [ + { + label: "Workspace", + to: "/page/workspace", + match: "/page/workspace", + icon: LayoutDashboard, + }, +]; + +type PageSidebarProps = { + collapsed: boolean; + onToggleCollapsed: () => void; +}; + +export function PageSidebar({ + collapsed, + onToggleCollapsed, +}: PageSidebarProps) { + const location = useLocation(); + + const iconButtonClass = + "rounded-lg p-2 text-gray-500 transition-all duration-200 hover:bg-red-50 hover:text-red-600"; + + return ( + + ); +} diff --git a/frontend-web/src/pages/PageRoutes.tsx b/frontend-web/src/pages/PageRoutes.tsx index 30f53d58..93eb74f2 100644 --- a/frontend-web/src/pages/PageRoutes.tsx +++ b/frontend-web/src/pages/PageRoutes.tsx @@ -1,20 +1,40 @@ +import { useState } from "react"; import { Navigate, Route, Routes } from "react-router-dom"; +import { PageSidebar } from "@/components/page-sidebar"; + import WorkspaceRoutes from "./WorkspaceRoutes"; -// 根路由容器,统一承接 /page/* 下的所有子系统路由 +function PageLayout() { + const [collapsed, setCollapsed] = useState(false); + + return ( +
+ setCollapsed((prev) => !prev)} + /> +
+ + } /> + } + /> + +
+
+ ); +} + export default function PageRoutes() { return ( - } /> - - {/* 现有系统:DeerFlow Workspace */} - } /> - - {/* TODO: 引入外部系统路由 - import AnotherSystemRoutes from "外部系统路径"; - } /> - */} + } /> ); } diff --git a/frontend-web/src/pages/WorkspaceRoutes.tsx b/frontend-web/src/pages/WorkspaceRoutes.tsx index c75ac94f..15b7eb1e 100644 --- a/frontend-web/src/pages/WorkspaceRoutes.tsx +++ b/frontend-web/src/pages/WorkspaceRoutes.tsx @@ -1,3 +1,4 @@ +import type { CSSProperties, ReactNode } from "react"; import { Navigate, Route, Routes } from "react-router-dom"; import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar"; @@ -16,9 +17,26 @@ import NewAgentPage from "./NewAgentPage"; import ScheduledTaskRunDetailPage from "./ScheduledTaskRunDetailPage"; import ScheduledTasksPage from "./ScheduledTasksPage"; -function WorkspaceLayout({ children }: { children: React.ReactNode }) { +function WorkspaceLayout({ + children, + pageSidebarCollapsed, +}: { + children: ReactNode; + pageSidebarCollapsed: boolean; +}) { return ( - + {children} @@ -27,7 +45,7 @@ function WorkspaceLayout({ children }: { children: React.ReactNode }) { ); } -function ChatRuntime({ children }: { children: React.ReactNode }) { +function ChatRuntime({ children }: { children: ReactNode }) { return ( @@ -37,18 +55,26 @@ function ChatRuntime({ children }: { children: React.ReactNode }) { ); } -export default function WorkspaceRoutes() { +export default function WorkspaceRoutes({ + pageSidebarCollapsed = false, +}: { + pageSidebarCollapsed?: boolean; +}) { return ( } /> } + element={ + + + + } /> + @@ -57,11 +83,19 @@ export default function WorkspaceRoutes() { /> } + element={ + + + + } /> } + element={ + + + + } /> + @@ -83,11 +117,19 @@ export default function WorkspaceRoutes() { /> } + element={ + + + + } /> } + element={ + + + + } /> );