diff --git a/apps/fronted/src/app/workbench/page.tsx b/apps/fronted/src/app/workbench/page.tsx
index 2706e1b..5f9f50e 100644
--- a/apps/fronted/src/app/workbench/page.tsx
+++ b/apps/fronted/src/app/workbench/page.tsx
@@ -1,8 +1,16 @@
"use client";
-import { useRef, useState } from "react";
+import { useRef, useState, useEffect } from "react";
import { motion, AnimatePresence } from "framer-motion";
-import { Eye, Edit2, Menu } from "lucide-react";
+import {
+ Eye,
+ Edit2,
+ Menu,
+ PanelLeft,
+ PanelRight,
+ Maximize2,
+ Minimize2
+} from "lucide-react";
import { useResumeStore } from "@/store/useResumeStore";
import { EditorHeader } from "@/components/editor/EditorHeader";
import { SidePanel } from "@/components/editor/SidePanel";
@@ -16,39 +24,228 @@ import {
ResizablePanelGroup
} from "@/components/ui/resizable";
import { cn } from "@/lib/utils";
-import CustomHandle from "./compoents/CustomHandle";
+import { Button } from "@/components/ui/button";
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger
+} from "@/components/ui/tooltip";
+
+const LAYOUT_CONFIG = {
+ DEFAULT: [20, 35, 45],
+ SIDE_COLLAPSED: [0, 50, 50],
+ EDIT_FOCUSED_WITH_SIDE: [0, 100, 0],
+ PREVIEW_FOCUSED_WITH_SIDE: [0, 0, 100],
+ EDIT_FOCUSED_NO_SIDE: [0, 100, 0],
+ PREVIEW_FOCUSED_NO_SIDE: [0, 0, 100]
+};
+
+// 创建自定义拖拽手柄组件
+const DragHandle = ({ show = true }) => {
+ const theme = useResumeStore((state) => state.theme);
+
+ if (!show) return null;
+
+ return (
+
+
+
+
+ );
+};
export default function Home() {
const theme = useResumeStore((state) => state.theme);
const previewRef = useRef
(null);
const themeConfig = getThemeConfig(theme === "dark");
- // 移动端状态管理
- const [showSidebar, setShowSidebar] = useState(false);
- const [isPreviewMode, setIsPreviewMode] = useState(false);
+ const [sidePanelCollapsed, setSidePanelCollapsed] = useState(false);
+ const [focusedPanel, setFocusedPanel] = useState(
+ null
+ );
+ const [showMobileSidebar, setShowMobileSidebar] = useState(false);
+ const [isMobilePreview, setIsMobilePreview] = useState(false);
+ const [panelSizes, setPanelSizes] = useState(LAYOUT_CONFIG.DEFAULT);
+ const [layoutKey, setLayoutKey] = useState(0);
useScrollbarTheme();
+ const updateLayout = (newSizes: number[]) => {
+ setPanelSizes(newSizes);
+ setLayoutKey((prev) => prev + 1);
+ };
- const [defaultLayout] = useState([15, 40, 50]);
+ useEffect(() => {
+ let newSizes;
+ if (sidePanelCollapsed) {
+ if (focusedPanel === "edit") {
+ newSizes = [...LAYOUT_CONFIG.EDIT_FOCUSED_NO_SIDE];
+ } else if (focusedPanel === "preview") {
+ newSizes = [...LAYOUT_CONFIG.PREVIEW_FOCUSED_NO_SIDE];
+ } else {
+ newSizes = [...LAYOUT_CONFIG.SIDE_COLLAPSED];
+ }
+ } else {
+ if (focusedPanel === "edit") {
+ newSizes = [...LAYOUT_CONFIG.EDIT_FOCUSED_WITH_SIDE];
+ } else if (focusedPanel === "preview") {
+ newSizes = [...LAYOUT_CONFIG.PREVIEW_FOCUSED_WITH_SIDE];
+ } else {
+ newSizes = [...LAYOUT_CONFIG.DEFAULT];
+ }
+ }
+ updateLayout([...newSizes]);
+ }, [sidePanelCollapsed, focusedPanel]);
- // 移动端切换按钮
- const MobileNav = () => (
-
+ const toggleSidePanel = () => {
+ setSidePanelCollapsed(!sidePanelCollapsed);
+ };
+
+ const togglePanelFocus = (panel: "edit" | "preview") => {
+ setFocusedPanel(focusedPanel === panel ? null : panel);
+ };
+
+ // 底部控制栏
+ const LayoutControls = () => (
+
+
+
+
+
+
+
+
+ {sidePanelCollapsed ? "展开侧边栏" : "收起侧边栏"}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {focusedPanel === "edit" ? "退出编辑模式" : "专注编辑"}
+
+
+
+
+
+
+
+
+
+
+
+
+ {focusedPanel === "preview" ? "退出预览模式" : "专注预览"}
+
+
+
+
+
+ );
+
+ // 移动端控制栏
+ const MobileControls = () => (
+
setShowSidebar(true)}
+ onClick={() => setShowMobileSidebar(true)}
>
-
+
setIsPreviewMode(!isPreviewMode)}
+ onClick={() => setIsMobilePreview(!isMobilePreview)}
>
- {isPreviewMode ? : }
+ {isMobilePreview ? (
+
+ ) : (
+
+ )}
);
@@ -56,23 +253,26 @@ export default function Home() {
// 移动端侧边栏
const MobileSidebar = () => (
- {showSidebar && (
+ {showMobileSidebar && (
<>
setShowSidebar(false)}
+ onClick={() => setShowMobileSidebar(false)}
/>
- setShowSidebar(false)} />
+ setShowMobileSidebar(false)} />
>
)}
@@ -81,47 +281,77 @@ export default function Home() {
return (
-
+
-
- {/* 桌面端布局 */}
+ {/* 桌面端布局 */}
+
+ {/* 侧边栏面板 */}
+ {!sidePanelCollapsed && (
+ <>
+
+
+
+
+
+
+ >
+ )}
+
+ {/* 编辑面板 */}
-
-
-
-
-
-
-
+
-
-
+
+
+ {/* 预览面板 */}
+
+
+
+
{/* 移动端布局 */}
-
+
- {isPreviewMode ? (
+ {isMobilePreview ? (
-
+
);
diff --git a/apps/fronted/src/components/editor/EditorHeader.tsx b/apps/fronted/src/components/editor/EditorHeader.tsx
index c906ca1..c03227c 100644
--- a/apps/fronted/src/components/editor/EditorHeader.tsx
+++ b/apps/fronted/src/components/editor/EditorHeader.tsx
@@ -30,11 +30,11 @@ export function EditorHeader({ previewRef, isMobile }: EditorHeaderProps) {
- Resume
+ Magic Resume
@@ -76,15 +76,6 @@ export function EditorHeader({ previewRef, isMobile }: EditorHeaderProps) {
{/* 在移动端隐藏这些按钮 */}
diff --git a/apps/fronted/src/components/editor/PreviewPanel.tsx b/apps/fronted/src/components/editor/PreviewPanel.tsx
index 60a4a2f..c4c9d6e 100644
--- a/apps/fronted/src/components/editor/PreviewPanel.tsx
+++ b/apps/fronted/src/components/editor/PreviewPanel.tsx
@@ -467,7 +467,7 @@ export function PreviewPanel() {
return (
diff --git a/apps/fronted/src/components/editor/SidePanel.tsx b/apps/fronted/src/components/editor/SidePanel.tsx
index df6f3d8..f945190 100644
--- a/apps/fronted/src/components/editor/SidePanel.tsx
+++ b/apps/fronted/src/components/editor/SidePanel.tsx
@@ -296,6 +296,7 @@ export function SidePanel() {
+ {/* 基础字号选择 */}
-
-
- updateGlobalSettings?.({ baseFontSize: value })
- }
+
+ {[12, 13, 14, 15, 16, 18, 20, 24].map((size) => (
+
+ {size}px
+
+ ))}
+
+