"use client"; import { useCallback, useState } from "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"; import { TextArea } from "@/components/ui/TextArea"; import { worldEntityRules } from "@/lib/generation/cards"; import type { WorldEntityCardView } from "@/lib/api/types"; import { useWorldGen } from "@/lib/generation/useWorldGen"; import { cardClass } from "@/lib/ui/variants"; interface WorldGeneratorProps { projectId: string; } // 世界观设计器(UX §6.5):一句话需求 → 预览实体卡(type/name/rules)。 // 本期世界观入库端点未建(仅预览);预览结果供作者参考/复制。 // 复制文案:名称 + 硬规则正文(供作者粘贴到「规则」或「设定库」)。 function entityClipboardText(entity: WorldEntityCardView): string { const rules = worldEntityRules(entity); const body = rules.length > 0 ? rules.join("\n") : "(无显式硬规则)"; return `${entity.name}(${entity.type})\n${body}`; } export function WorldGenerator({ projectId }: WorldGeneratorProps) { const gen = useWorldGen(); const toast = useToast(); const [brief, setBrief] = useState(""); const onGenerate = useCallback(async () => { await gen.generate(projectId, brief); }, [gen, projectId, brief]); const onCopy = useCallback( async (entity: WorldEntityCardView): Promise => { try { await navigator.clipboard.writeText(entityClipboardText(entity)); toast("已复制到剪贴板。", "success"); } catch { toast("复制失败,请手动选择文本。", "error"); } }, [toast], ); const generating = gen.status === "generating"; return (