fix(web): 链相位语义色/失败可重试 + 模板填入中文标签/删除可撤销/工具卡文案 + 模板库 PageHeader

This commit is contained in:
Yaojia Wang
2026-06-30 08:56:23 +02:00
parent 6bb3559e25
commit 164e98887e
10 changed files with 235 additions and 74 deletions

View File

@@ -9,15 +9,21 @@ import type { TemplateResponse } from "@/lib/api/types";
import { buttonClass } from "@/lib/ui/variants";
interface TemplateFillerProps {
// 可填入的目标输入字段名(如 brief / text空 → 不渲染(无可填字段)。
// 可填入的目标输入字段名(如 brief / text空 → 不渲染(无可填字段)。匹配/回写按此 name。
targetField: string | null;
// 目标字段的中文展示名(如「需求」「原文」);缺省回退到 name。仅用于展示不暴露英文 key。
targetLabel?: string | null;
// 选定模板 → 把其 body 填进目标字段(纯前端,不改生成器后端)。
onFill: (field: string, body: string) => void;
}
// 「从模板填入」F3纯前端进场懒加载模板库选一个把 body 填进生成器的 brief/原文输入。
// 与生成器后端解耦——只读 /templates 并回写本地表单值。无模板/无目标字段则不渲染。
export function TemplateFiller({ targetField, onFill }: TemplateFillerProps) {
export function TemplateFiller({
targetField,
targetLabel,
onFill,
}: TemplateFillerProps) {
const toast = useToast();
const [templates, setTemplates] = useState<TemplateResponse[] | null>(null);
const [open, setOpen] = useState(false);
@@ -43,6 +49,7 @@ export function TemplateFiller({ targetField, onFill }: TemplateFillerProps) {
if (!targetField) return null;
const field = targetField;
const fieldLabel = targetLabel ?? targetField;
if (!open) {
return (
@@ -63,7 +70,7 @@ export function TemplateFiller({ targetField, onFill }: TemplateFillerProps) {
aria-label="从模板填入"
>
<div className="flex items-center justify-between">
<span className="text-sm text-ink-soft">{field}</span>
<span className="text-sm text-ink-soft">{fieldLabel}</span>
<Button
variant="ghost"
size="sm"