From 56741587079691c97cc631f694cd452680b52a45 Mon Sep 17 00:00:00 2001 From: Yaojia Wang Date: Sat, 11 Jul 2026 08:04:56 +0200 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E5=B7=A5=E4=BD=9C=E5=8F=B0?= =?UTF-8?q?=E7=B2=BE=E4=BF=AE=20+=20=E6=8B=86=E5=88=86=EF=BC=88P3-3..7?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Workbench.tsx 937→467 行,抽出 AiToolbar/WorkbenchToolbar/MobileContextBar - P3-3 AI 工具条分组留白 + 眉题 + 主 CTA 凸显 - P3-4 专注写作模式(useFocusMode hook+vitest,隐藏侧栏加宽正文)+ 左双栏面色区分 - P3-5 右栏本章参考小标题去衬线(font-sans) + 空态引导(无标题保 h2→h3 大纲) - P3-6 底栏信息/操作/状态三区 + TOC 当前章高亮;TOC 状态点因无每章状态数据跳过 - P3-7 展示层流式跟随滚动(不触碰 SSE 逻辑,尊重 reduced-motion) - AppShell 加可选 hideNav(加法式,默认 false) --- apps/web/components/AppShell.tsx | 6 +- apps/web/components/workbench/AiToolbar.tsx | 309 ++++++++++ .../components/workbench/ChapterAssistant.tsx | 90 ++- apps/web/components/workbench/ChapterList.tsx | 14 +- .../components/workbench/MobileContextBar.tsx | 49 ++ apps/web/components/workbench/Workbench.tsx | 552 ++---------------- .../components/workbench/WorkbenchToolbar.tsx | 209 +++++++ apps/web/lib/workbench/useFocusMode.test.ts | 61 ++ apps/web/lib/workbench/useFocusMode.ts | 46 ++ 9 files changed, 787 insertions(+), 549 deletions(-) create mode 100644 apps/web/components/workbench/AiToolbar.tsx create mode 100644 apps/web/components/workbench/MobileContextBar.tsx create mode 100644 apps/web/components/workbench/WorkbenchToolbar.tsx create mode 100644 apps/web/lib/workbench/useFocusMode.test.ts create mode 100644 apps/web/lib/workbench/useFocusMode.ts diff --git a/apps/web/components/AppShell.tsx b/apps/web/components/AppShell.tsx index c7e6f80..b6fa456 100644 --- a/apps/web/components/AppShell.tsx +++ b/apps/web/components/AppShell.tsx @@ -18,6 +18,9 @@ interface AppShellProps { projectId?: string; // 当前激活的项目级入口键(用于高亮)。 activeNav?: ActiveNav; + // 专注写作模式(P3-4):隐藏桌面左侧图标导航以加宽正文;顶栏汉堡/命令面板仍可达导航。 + // 缺省 false → 其余页面外观不变(加法式可选项)。 + hideNav?: boolean; } // 全局外壳:顶栏(64px) + 左导航 + 主区(UX §5.1)。 @@ -27,6 +30,7 @@ export function AppShell({ subtitle, projectId, activeNav, + hideNav = false, }: AppShellProps) { return (
- + {hideNav ? null : }
void; + presetIds: readonly string[]; + onTogglePreset: (id: string) => void; + // 空章默认展开(新手最需要看到输入框的时机);满章默认收起以让出编辑视野。 + defaultOpen: boolean; + // 发送键 = 写本章:把已选文风/剧情 + 自定义要求组装后逐字流式写进正文(不改成聊天气泡)。 + streaming: boolean; + onWrite: () => void; + onStop: () => void; +} + +// 本章写作指令面板(P0-2 / P3-3 提升):正文正上方常驻的「和 AI 说话」输入条。 +// 眉题「和 AI 说话」+ 主标题「告诉 AI 这章想怎么写」+ HITL 微文案 +「?这是什么」常驻可见; +// 主 CTA「写本章」突出(md 尺寸、独占右侧),空章默认展开露出输入框。 +// 发送键即「写本章」,沿用 composeDirective + 文风/剧情 chips + 流式打字机写进正文。 +export function DirectivePanel({ + directive, + onDirectiveChange, + presetIds, + onTogglePreset, + defaultOpen, + streaming, + onWrite, + onStop, +}: DirectivePanelProps) { + const panelId = useId(); + const [open, setOpen] = useState(defaultOpen); + const activeCount = presetIds.length + (directive.trim().length > 0 ? 1 : 0); + return ( +
+
+
+ 和 AI 说话 + +
+
+ {activeCount > 0 ? ( + + {activeCount} 项指令 + + ) : null} + {/* 常驻主 CTA = 写本章:始终可见(折叠时也在),md 尺寸凸显为本条主动作,逐字流式写进正文。 */} + {streaming ? ( + + ) : ( + + )} + +
+
+

+ AI 给草稿,你决定采不采用,原文永远你说了算。 +

+ {open ? ( +
+ + + +