From 1335b64d6bd2ec93f71c3781d1e9ad0a12a1b383 Mon Sep 17 00:00:00 2001 From: Linghong Date: Sun, 23 Aug 2026 14:47:01 +0000 Subject: [PATCH] =?UTF-8?q?=E7=AD=96=E5=88=92=E5=8C=BA=E5=90=88=E6=88=90?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E9=9D=A2=EF=BC=9A=E9=98=B6=E6=AE=B5=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E5=BD=93=E6=A0=87=E9=A2=98=E6=A0=8F=EF=BC=8C=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E5=8D=A1=E5=A4=B4=E5=8E=BB=E6=8E=89=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E7=8A=B6=E6=80=81=E4=B8=8E=E6=8C=87=E7=BA=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 阶段进度条和审批卡原本各带一圈边框叠在一起。「立项策划 / 待审批」在进度条和卡头 各画一遍,「v1」在进度条、卡片 meta 行和批准按钮上出现三次,卡头还露一截 12 位的 指纹——那是开发者核对用的,用户不需要。 新增 PlanGddSurface 做外壳:边框和圆角只画在它上面,进度条成为标题栏,审批卡成为 正文,卡头只剩游戏标题和一句话。meta 行整行删掉:版本在标题栏和按钮上都有,决定 数就是下面那张清单本身,指纹整条搬进「查看 GDD 正文」弹层底部做追溯。两个挂载点 改成只挂这一个组件,可见性判据抽成两个小函数供外壳和两块子件共用,不再各自拼装。 做游戏工作台原先给卡片设的高度上限和内部滚动挪到外壳为 flex 子件、卡片为可滚行, 行为不变。 新增一条 appSurface 用例(A/B:换回旧卡片即红):状态与版本只在标题栏;卡内没有 「立项策划」「待审批」「版本 v1」「指纹」;弹层底部有完整版本与指纹。 styles.css 在基线就不符合 prettier,本次只改相关规则,不整文件重排。 Co-Authored-By: Claude Opus 5 --- .../project-workspace/GddApprovalCard.tsx | 83 ++++++++++++++----- .../ProjectSupervisorView.tsx | 7 +- .../ProjectWorkspaceChatPane.tsx | 7 +- apps/ai-game-creator-shell/src/styles.css | 62 +++++++------- .../tests/appSurface/plan-gdd.suite.ts | 32 +++++++ 5 files changed, 130 insertions(+), 61 deletions(-) diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/GddApprovalCard.tsx b/apps/ai-game-creator-shell/src/features/project-workspace/GddApprovalCard.tsx index 12c298131..ceda1bf76 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/GddApprovalCard.tsx +++ b/apps/ai-game-creator-shell/src/features/project-workspace/GddApprovalCard.tsx @@ -25,6 +25,60 @@ const stateLabels: Record = { rejected: '已退回', }; +function stageProgressVisible( + state: PlanGddStateViewV1 | null, + active: boolean, +) { + return Boolean(state && (active || state.state !== 'not_started')); +} + +function approvalCardVisible(state: PlanGddStateViewV1 | null) { + return Boolean( + state?.displayGdd && (state.pendingApproval || state.recoveryPending), + ); +} + +/** + * 策划区的外壳:阶段进度是它的标题栏,审批卡是它的正文。 + * + * 两者原本各画一个带边框的盒子,叠在一起时「立项策划 / 状态」在标题栏和卡头各出现 + * 一次。合成一个面之后卡头只剩游戏标题和一句话,状态与版本只在标题栏画一遍。两个 + * 挂载点都从这里进,不再各自拼装。 + */ +export function PlanGddSurface({ + state, + active = false, + busy, + error, + onRefresh, + onDecision, +}: GddApprovalCardProps & { active?: boolean }) { + const showProgress = stageProgressVisible(state, active); + const showCard = approvalCardVisible(state); + if (!showProgress && !showCard) { + return null; + } + return ( +
+ {showProgress ? ( + + ) : null} + {showCard ? ( + + ) : null} +
+ ); +} + export function PlanGddStageProgress({ state, active = false, @@ -32,7 +86,7 @@ export function PlanGddStageProgress({ state: PlanGddStateViewV1 | null; active?: boolean; }) { - if (!state || (!active && state.state === 'not_started')) { + if (!state || !stageProgressVisible(state, active)) { return null; } const latestVersion = @@ -156,10 +210,7 @@ export function GddApprovalCard({ const [comment, setComment] = useState(''); const [gddDetailsOpen, setGddDetailsOpen] = useState(false); - if ( - !state?.displayGdd || - (!state.pendingApproval && !state.recoveryPending) - ) { + if (!state?.displayGdd || !approvalCardVisible(state)) { return null; } @@ -187,22 +238,10 @@ export function GddApprovalCard({ return (
-
- 立项策划 -

{gdd.game.title || `Fast GDD v${gdd.version}`}

-

{gdd.game.oneLiner}

-
- - {stateLabels[state.state]} - +

{gdd.game.title || `Fast GDD v${gdd.version}`}

+

{gdd.game.oneLiner}

-
- {`版本 v${gdd.version}`} - {`指纹 ${gdd.fingerprint.slice(0, 12)}…`} - {`${gdd.decisions.length} 项决定`} -
- {gdd.decisions.length > 0 ? (
{gdd.decisions.map((decision) => ( @@ -349,6 +388,12 @@ export function GddApprovalCard({

{section.content}

))} + + {`Fast GDD v${gdd.version} · ${gdd.fingerprint}`} +