发布版本文案去诱导:卡面角标只写最新,面板写明发布固定取最新内部版本

- resourceProjectionModel.ts:publicationTag 注释改为「值是内部版本序数(versions.length),也就是发布时会提交的那个标签」,并注明卡面只渲染中性的「最新」角标,不再写「发布标签 v{N}」
- GameDistributionPublishPanel.tsx:「项目版本」说明注释写明发布提交的标签是 versions.length(最新内部版本序数),不读任何「选中版本」;画布上的选中/「当前版本」只影响当前版本素材与运行播放哪一版
- index.tsx / styles.css:版本卡角标由「最新 · 发布标签 v{N}」改为中性的「最新」,并换用卡面既有的中性 pill 样式
- gameDistributionPublishPanel.test.tsx:同步旧的角标/文案断言
This commit is contained in:
2026-10-04 17:58:50 +08:00
parent aa4d178956
commit 2e74092743
5 changed files with 27 additions and 22 deletions
@@ -283,14 +283,17 @@ export function GameDistributionPublishPanel({
[manifest],
);
/**
* 「项目版本」这一格的说明。标签只有一个来源(`versions[]` 条数),平台线上版本号是
* 另一套事实:两句都要说清,且不在这里做第二份口径派生。
* 「项目版本」这一格的说明。
*
* 口径必须与取数一致:发布提交的标签是 `versions.length`(最新内部版本序数),
* **不读**任何"选中版本";资源画布上的选中/「当前版本」只影响「当前版本素材」与运行用哪版播放。
* 所以这里直说"发布用最新",并写明暂不能指定版本,不用「发布标签」去暗示用户可以挑卡。
*/
const projectVersionHint = useMemo(() => {
const internalCount = manifest.versions?.length ?? 0;
const label =
internalCount > 0
? `本次发布标签 = 最新内部版本 v${projectVersion};agent 再改进一次后,下一次发布将是 v${projectVersion + 1}。`
? `发布将使用最新内部版本 v${projectVersion}(标签 = 内部版本条数,暂不能指定其它版本);agent 再改进一次后,下一次是 v${projectVersion + 1}。`
: `这个项目还没有内部版本,本次发布按首版 v${projectVersion}。`;
const platform =
latestVersionNumber > 0
+7 -6
View File
@@ -8169,15 +8169,16 @@ iframe.preview-frame {
}
/*
* 最新内部版本卡的发布标签角标。只出现在 `versions[]` 最后一条上:它就是发布面板
* 「项目版本」取的那一张(标签 = 内部版本序数 = 版本条数),卡面直接写出 `v{N}`。
* 最新内部版本卡的中性角标。只出现在 `versions[]` 最后一条上:不写「发布标签」,
* 因为发布固定取最新内部版本、不需要用户在卡上挑;选中态另有一套「当前版本素材」口径。
* 形制沿用卡面既有的中性 pill(与 `.game-resource-card-engine-label` 同族)。
*/
.game-resource-card-version-publication-tag {
.game-resource-card-version-latest-tag {
padding: 1px 7px;
border: 1px solid rgb(201 111 68 / 38%);
border: 1px solid rgb(139 91 69 / 28%);
border-radius: 999px;
background: rgb(201 111 68 / 14%);
color: #a8492a;
background: rgb(255 255 255 / 72%);
color: #8b5b45;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.02em;
@@ -1291,16 +1291,14 @@ const ResourceCard = memo(function ResourceCard({
);
}
if (kind === 'version') {
// 最新内部版本卡带上发布标签角标:它就是发布面板「项目版本」取的那一张,
// 卡面直接写出 `v{N}`,用户不必再靠位置或 `版本 N` 反推。
const publicationTag = resource.version?.publicationTag;
// 角标只写「最新」:发布固定取最新内部版本,卡面不写「发布标签」;
// 否则用户会以为"挑中哪张卡就发哪张",而选中态只影响「当前版本素材」与运行用哪版播放。
const isLatestVersion = resource.version?.publicationTag !== undefined;
return (
<span className="game-resource-card-version-visual">
<Gamepad2 size={34} aria-hidden="true" />
{publicationTag ? (
<span className="game-resource-card-version-publication-tag">
{`最新 · 发布标签 v${publicationTag}`}
</span>
{isLatestVersion ? (
<span className="game-resource-card-version-latest-tag">最新</span>
) : null}
<span className="game-resource-card-version-relations">
{resource.version?.childVersionIds.length
@@ -33,9 +33,12 @@ export type ProjectVersionResourceSummary = GameIterationVersion & {
label: string;
childVersionIds: string[];
/**
* 只有**最新内部版本**(`manifest.versions` 最后一条)带它,值就是这次发布的标签
* (= 内部版本序数 = `versions.length`,与发布面板的 `resolveGameCreationAppProjectVersion`
* 取的是同一个数)。卡面据此渲染「最新 · 发布标签 v{N}」角标;其余版本不渲染。
* 只有**最新内部版本**(`manifest.versions` 最后一条)带它,值是内部版本序数
* (= `versions.length`,也就是发布时会提交的那个标签,与发布面板的
* `resolveGameCreationAppProjectVersion` 同源)。
*
* 卡面据此只渲染**中性**的「最新」角标:发布固定取最新内部版本,卡面不把它写成
* 「发布标签」,免得诱导用户以为要挑一张卡才能发。
*/
publicationTag?: number;
};
@@ -528,8 +531,8 @@ export function projectResourcesFromReadModels(
label: `版本 ${index + 1}`,
childVersionIds:
childVersionIdsByParent.get(manifestVersion.versionId) ?? [],
// 最新内部版本 = 数组最后一条 = 发布面板取的标签(`versions.length`)。
// 只有它带 `publicationTag`:卡面据此渲染「最新 · 发布标签 v{N}」角标。
// 最新内部版本 = 数组最后一条 = 发布时会提交的标签(`versions.length`)。
// 只有它带 `publicationTag`:卡面据此只渲染中性的「最新」角标。
...(index === manifestVersions.length - 1
? { publicationTag: index + 1 }
: {}),
@@ -841,7 +841,7 @@ describe('GameDistributionPublishPanel', () => {
expect(screen.getByText('v4')).not.toBeNull();
expect(
screen.getByText(
/本次发布标签 = 最新内部版本 v4;agent 再改进一次后,下一次发布将是 v5。/u,
/发布将使用最新内部版本 v4(标签 = 内部版本条数,暂不能指定其它版本);agent 再改进一次后,下一次是 v5。/u,
),
).not.toBeNull();
expect(screen.getByText(/线上最近提交 v5 · 已公开/u)).not.toBeNull();