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={
+
+
+
+ }
/>
);