From 6c1954b7635387efddc31c983980ef36d60a593c Mon Sep 17 00:00:00 2001 From: JOYCEQL <1449239013@qq.com> Date: Thu, 12 Feb 2026 00:07:01 +0800 Subject: [PATCH] feat: Implement a dedicated mobile workbench with tabbed navigation and enhance overall workbench responsiveness --- src/app/app/workbench/[id]/page.tsx | 42 ++++-- src/app/app/workbench/layout.tsx | 2 +- src/components/mobile/MobileWorkbench.tsx | 148 ++++++++++++++++++++++ 3 files changed, 177 insertions(+), 15 deletions(-) create mode 100644 src/components/mobile/MobileWorkbench.tsx diff --git a/src/app/app/workbench/[id]/page.tsx b/src/app/app/workbench/[id]/page.tsx index 7e8b57f..a697a19 100644 --- a/src/app/app/workbench/[id]/page.tsx +++ b/src/app/app/workbench/[id]/page.tsx @@ -7,6 +7,7 @@ import { EditorHeader } from "@/components/editor/EditorHeader"; import { SidePanel } from "@/components/editor/SidePanel"; import { EditPanel } from "@/components/editor/EditPanel"; import PreviewPanel from "@/components/preview"; +import { MobileWorkbench } from "@/components/mobile/MobileWorkbench"; import { ResizableHandle, ResizablePanel, @@ -178,6 +179,25 @@ export default function Home() { setPanelSizes(sizes); }; + useEffect(() => { + // 初始化检查屏幕宽度 + if (window.innerWidth < 1920) { + setSidePanelCollapsed(true); + } + + // 监听 resize + const handleResize = () => { + if (window.innerWidth < 1920) { + setSidePanelCollapsed(true); + } else { + setSidePanelCollapsed(false); + } + }; + + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, []); + useEffect(() => { let newSizes = []; @@ -189,7 +209,7 @@ export default function Home() { newSizes.push(0); } else { if (sidePanelCollapsed) { - newSizes.push(50); + newSizes.push(36); } else { if (previewPanelCollapsed) { newSizes.push(80); @@ -209,7 +229,12 @@ export default function Home() { if (editPanelCollapsed) { newSizes.push(80); } else { - newSizes.push(48); + // 如果侧边栏收起且编辑区展开,预览区占64,编辑区占36 + if (sidePanelCollapsed) { + newSizes.push(64); + } else { + newSizes.push(48); + } } } } @@ -256,7 +281,6 @@ export default function Home() { id="side-panel" order={1} defaultSize={panelSizes?.[0]} - minSize={20} className={cn( "bg-background border-r border-border" )} @@ -275,7 +299,6 @@ export default function Home() {
@@ -314,15 +336,7 @@ export default function Home() { {/* 移动端布局 */}
-
- -
+
); diff --git a/src/app/app/workbench/layout.tsx b/src/app/app/workbench/layout.tsx index 32d1687..e5ba168 100644 --- a/src/app/app/workbench/layout.tsx +++ b/src/app/app/workbench/layout.tsx @@ -30,7 +30,7 @@ export default async function LocaleLayout({ children }: Props) { return ( {children} diff --git a/src/components/mobile/MobileWorkbench.tsx b/src/components/mobile/MobileWorkbench.tsx new file mode 100644 index 0000000..778ff0f --- /dev/null +++ b/src/components/mobile/MobileWorkbench.tsx @@ -0,0 +1,148 @@ +"use client"; + +import { useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { FileText, Palette, Eye } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { useResumeStore } from "@/store/useResumeStore"; +import { EditPanel } from "@/components/editor/EditPanel"; +import { SidePanel } from "@/components/editor/SidePanel"; +import PreviewPanel from "@/components/preview"; +import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; + +type TabType = "content" | "style" | "preview"; + +export function MobileWorkbench() { + const [activeTab, setActiveTab] = useState("content"); + const { activeResume, setActiveSection } = useResumeStore(); + const { activeSection, menuSections } = activeResume || {}; + + // 渲染底部导航项 + const renderNavItem = (tab: TabType, icon: React.ReactNode, label: string) => ( + + ); + + return ( +
+ {/* 主要内容区域 */} +
+ + {activeTab === "content" && ( + + {/* 顶部模块选择器 */} +
+ +
+ {/* 基础信息 */} + + + {/* 其他模块 */} + {menuSections + ?.filter((s) => s.id !== "basic" && s.enabled) + .map((section) => ( + + ))} +
+ +
+
+ + {/* 编辑区域 */} +
+ +
+
+ )} + + {activeTab === "style" && ( + + + + )} + + {activeTab === "preview" && ( + + {}} + toggleEditPanel={() => {}} + /> + + )} +
+
+ + {/* 底部导航栏 */} +
+ {renderNavItem("content", , "内容")} + {renderNavItem("style", , "样式")} + {renderNavItem("preview", , "预览")} +
+
+ ); +}