From f0f925b195acec899edbb200de3e67575a84b225 Mon Sep 17 00:00:00 2001 From: Yaojia Wang Date: Tue, 30 Jun 2026 08:56:23 +0200 Subject: [PATCH] =?UTF-8?q?fix(web):=20=E5=AE=A1=E7=A8=BF=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=8E=BB=E9=87=8D=E6=A0=87=E9=A2=98/=E5=8E=BB?= =?UTF-8?q?=E8=8B=B1=E6=96=87=20slug=20+=20=E4=BC=8F=E7=AC=94=E5=BE=85?= =?UTF-8?q?=E7=99=BB=E8=AE=B0=E6=95=B0=E5=AE=9E=E6=97=B6=E9=80=92=E5=87=8F?= =?UTF-8?q?=20+=20=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=86=B3=E7=AD=96=E6=A0=8F?= =?UTF-8?q?=20+=20=E5=AF=B9=E6=AF=94=E5=BA=A6=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/components/review/AcceptPanel.tsx | 2 +- apps/web/components/review/AnnotatedText.tsx | 42 ++++++++--- apps/web/components/review/BeatMap.tsx | 2 +- .../review/ForeshadowSuggestions.tsx | 22 ++++-- apps/web/components/review/PacePanel.tsx | 11 +-- apps/web/components/review/ReviewReport.tsx | 75 +++++++++++++++---- 6 files changed, 114 insertions(+), 40 deletions(-) diff --git a/apps/web/components/review/AcceptPanel.tsx b/apps/web/components/review/AcceptPanel.tsx index a16b332..b728bbb 100644 --- a/apps/web/components/review/AcceptPanel.tsx +++ b/apps/web/components/review/AcceptPanel.tsx @@ -142,7 +142,7 @@ export function AcceptPanel({ ))} -

+

以上为预期,最终以验收回执为准。

diff --git a/apps/web/components/review/AnnotatedText.tsx b/apps/web/components/review/AnnotatedText.tsx index 7d70417..2d5d85d 100644 --- a/apps/web/components/review/AnnotatedText.tsx +++ b/apps/web/components/review/AnnotatedText.tsx @@ -1,8 +1,12 @@ "use client"; import { useRef, type ReactNode, type RefObject } from "react"; +import Link from "next/link"; +import { PenLine } from "lucide-react"; +import { EmptyState } from "@/components/ui/EmptyState"; import { locateInDraft } from "@/lib/review/locate"; +import { buttonClass, proseBody } from "@/lib/ui/variants"; import type { ReviewConflict } from "@/lib/review/sse"; interface AnnotatedTextProps { @@ -12,14 +16,16 @@ interface AnnotatedTextProps { // 当前聚焦的冲突下标(来自报告卡「跳转」/锚点),用于锚点高亮联动。 focusedIndex: number | null; onAnchorClick: (index: number) => void; + // 空待审正文时,引导回写作页起草本章。 + projectId: string; + chapterNo: number; // 转发给可编辑 textarea,供父组件 setSelectionRange 定位/高亮问题区域。 editorRef?: RefObject; } // 高亮叠层编辑器:背景层渲染带 高亮的正文,前景透明 textarea 负责编辑。 -// 两层必须共享同一盒模型/排版常量,否则高亮与文字像素错位。 -const TYPO = - "box-border w-full font-serif text-[17px] leading-[1.9] tracking-normal whitespace-pre-wrap break-words"; +// 两层必须共享同一盒模型/排版常量,否则高亮与文字像素错位;正文排版与写作页 Editor 一致(proseBody)。 +const TYPO = `box-border w-full whitespace-pre-wrap break-words ${proseBody}`; // 把终稿按已定位的冲突区间切成 [纯文本 | | …]; 带 id 供父组件滚动定位。 // 区间按 start 排序,重叠区间保留先到者(跳过后者),避免标签嵌套。 @@ -61,6 +67,8 @@ export function AnnotatedText({ conflicts, focusedIndex, onAnchorClick, + projectId, + chapterNo, editorRef, }: AnnotatedTextProps) { const backdropRef = useRef(null); @@ -69,6 +77,26 @@ export function AnnotatedText({ const anchorable = conflicts .map((c, i) => ({ c, i })) .filter(({ c }) => locateInDraft(value, c) !== null); + + // 空待审正文:不渲染高亮叠层,直接引导回写作页起草本章(避免对着空编辑器发懵)。 + if (!value) { + return ( + +