feat(web): 生成器 ThinkingIndicator/空结果态/数量校验 + 文风页 PageHeader + Codex 分段控件 + RefineView role 修正

This commit is contained in:
Yaojia Wang
2026-06-30 08:56:23 +02:00
parent 68606b84dc
commit 9d67f237a2
7 changed files with 126 additions and 46 deletions

View File

@@ -1,10 +1,12 @@
"use client";
import { useCallback, useState } from "react";
import { Copy, Sparkles } from "lucide-react";
import { Copy, Globe2, RotateCcw, Sparkles } from "lucide-react";
import { useToast } from "@/components/Toast";
import { ThinkingIndicator } from "@/components/ThinkingIndicator";
import { Button } from "@/components/ui/Button";
import { EmptyState } from "@/components/ui/EmptyState";
import { Field } from "@/components/ui/Field";
import { SectionHeader } from "@/components/ui/SectionHeader";
import { StatusNote } from "@/components/ui/StatusNote";
@@ -72,6 +74,49 @@ export function WorldGenerator({ projectId }: WorldGeneratorProps) {
</Button>
</div>
{generating ? (
<div className="rounded border border-line bg-panel/50 p-4 text-cinnabar">
<ThinkingIndicator label="生成中" />
</div>
) : null}
{gen.status === "error" ? (
<StatusNote variant="danger">
<span className="flex flex-wrap items-center gap-3">
<span></span>
<Button
type="button"
variant="secondary"
size="sm"
onClick={() => void onGenerate()}
>
<RotateCcw className="h-4 w-4" aria-hidden="true" />
</Button>
</span>
</StatusNote>
) : null}
{gen.status === "done" && gen.entities.length === 0 ? (
<EmptyState
icon={Globe2}
title="本次未生成可用实体"
description="可换一个更具体的设定方向,或补充世界的硬规则与边界后再试。"
action={
<Button
type="button"
variant="primary"
size="sm"
onClick={() => void onGenerate()}
disabled={brief.trim().length === 0}
>
<Sparkles className="h-4 w-4" aria-hidden="true" />
</Button>
}
/>
) : null}
{gen.status === "done" && gen.entities.length > 0 ? (
<div className="flex flex-col gap-3">
<StatusNote variant="info">