今天完成封面、口播、成片检查与发布准备。
Artifact Split Preview一个把对话过程和生成成果分栏展示的 AI 工作区模块。
把发布计划整理成一页执行稿。
已生成右侧成果,可直接继续修改。
今天完成封面、口播、成片检查与发布准备。
"use client";
export type ArtifactMessage = {
author: "user" | "assistant";
id: string;
text: string;
};
export type ArtifactVersion = {
content: string;
id: string;
label: string;
status?: "generating" | "ready" | "failed";
};
export type ArtifactSplitPreviewProps = {
activeVersionId: string;
messages: ArtifactMessage[];
onVersionChange?: (versionId: string) => void;
versions: ArtifactVersion[];
};
export function selectArtifactVersion(id: string, versions: ArtifactVersion[]) {
return versions.find((version) => version.id === id);
}
export function ArtifactSplitPreview({
activeVersionId,
messages,
onVersionChange,
versions,
}: ArtifactSplitPreviewProps) {
const active = selectArtifactVersion(activeVersionId, versions);
return (
<section aria-label="成果双栏预览" className="artifact-split-block">
<div className="artifact-chat-pane">
<span className="artifact-pane-label">对话</span>
{messages.map((message) => (
<p data-author={message.author} key={message.id}>{message.text}</p>
))}
</div>
<div className="artifact-preview-pane">
<div className="artifact-version-bar">
<span className="artifact-pane-label">成果预览</span>
<div aria-label="成果版本">
{versions.map((version) => (
<button
aria-pressed={version.id === activeVersionId}
key={version.id}
onClick={() => onVersionChange?.(version.id)}
type="button"
>
{version.label}
</button>
))}
</div>
</div>
{active ? (
<article aria-live="polite" data-status={active.status ?? "ready"}>
<span>{active.status === "generating" ? "正在更新" : active.status === "failed" ? "更新失败" : "已完成"}</span>
<p>{active.content}</p>
</article>
) : (
<p>请选择一个版本。</p>
)}
</div>
</section>
);
}
长内容生成时,对话和最终成果混在同一条消息流中,修改、比较和继续迭代都很费力。
操作上方真实 Demo,确认状态和交互符合产品需要。
只有真实存在的源码、Prompt 和参数文件才会出现在代码面板。
保留许可证,并根据自己的设计系统调整参数和样式。