AGC 资源工作台三处交互收口:侧栏关闭入口合并、删除折叠把手、播放左对齐 #361
Reference in New Issue
Block a user
Delete Branch "fix/agc-resource-workbench-chrome"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
AGC 客户端「资源管理」工作台这一轮把交互收口成五件事,都是验收人在真机上直接点出来的问题:任务侧栏两个关闭入口重复、左侧贴边把手常驻遮挡画布、顶部「播放」按钮居中悬浮与模式切换脱节、任务侧栏不会自己消失、以及**「定位到素材」点完依然见不到素材**。本 PR 一并处理。
问题与根因
1. 「生成任务」侧栏两个关闭入口 + 底部一条分割线
打开「生成任务」侧栏后,头部右上角是一枚
‹(ChevronLeft,aria-label="收起生成任务"),底部 footer 里还有一枚×(aria-label="关闭生成任务"),中间由 footer 的border-top分割线隔开。两者是同一个onToggleOpen,属于重复入口;头部那枚又是「返回」语义而不是「关闭」语义。红框标出的两处即本次要处理的对象:2. 左侧贴边竖排「生成任务」把手常驻遮挡
侧栏折叠后会在画布左侧留一条竖排文字把手(
game-resource-generation-tasks-handle):3. 顶部「播放」按钮居中悬浮
styles.css里播放按钮是position: absolute; left: 50%; transform: translateX(-50%),靠绝对定位居中悬浮,与它左边的「资源管理 / 运行」模式切换脱节:4. 侧栏不会自己消失
侧栏是常驻非模态浮层,点画布、点别的面板都不会收起,只能再去点那枚关闭按钮。
5. 「定位到素材」点完见不到素材
handleResourceSelect只改选中、不移动画布;而这张画布是 transform 平移的、资源卡不在任何滚动容器里——既有的card.scrollIntoView()碰不到滚动祖先。所以卡在视口外时,定位"成功了"(卡被选中、提示条收掉),但用户屏幕上什么都没有。解决方案
X并统一为aria-label="关闭生成任务",删掉底部 footer(关闭按钮 + 分割线)及其全部样式。头部标题里的「在途生成任务 N」徽标保留不动。open === false时组件直接return null;折叠态不再需要把手上那份在途计数角标,因为工具条入口按钮本身带生成任务 · N。.game-workbench-view-tabs作为左侧控件组(「资源管理 / 运行」分段 + 紧跟其后的「播放」),播放按钮改回position: static;删掉@media (max-width: 1000px)里为居中悬浮做的兜底。并把播放按钮并进按钮基础外观与:focus-visible规则列表——新位置不再命中.game-workbench-tabs/.game-workbench-view-actions的选择器,漏掉会掉成零圆角、零内边距、无边框、默认字号的裸按钮(颜色规则仍然生效,肉眼容易漏)。mode === 'resources'包住,而侧栏本体是无条件渲染的浮层、运行态一样可见——删除把手后,用户在运行态关掉侧栏就再也打不开。现改成两个页签都常驻。pointerdown捕获监听,点在侧栏内部与那枚开合按钮以外的地方即收起。排除开合按钮本身是必须的——它自己负责 toggle,若也被判成「点外部」就会先收起再被 toggle 打开,表现为按钮失灵。centerResourceCanvasOnResource——读该卡在当前布局位置表里的 x/y 与卡片尺寸,按canvasSize / 2 − 卡中心 × scale求视口平移量,缩放保持不变(定位不改用户的缩放预期,与ensureResourceBookContentVisible同口径)。scrollIntoView一并保留。…-enter),收起却是瞬间卸载,观感上"闪一下没了"。现在收起先播退场再卸载:open变 false 后进入leaving,根节点挂is-leaving播…-leave(与进场同向反向,160ms,pointer-events: none),播完才卸载;时长在组件与 CSS 两处各写一次(组件导出常量,用例钉住一致)。减动效偏好下 CSS 已关掉动画,组件同步按 0ms 处理、立即卸载。退场期间沿用收起前那一份列表(lastRenderedRef)——宿主会在同一帧里收起侧栏并把在途任务收口,直接吃新 props 会让退场动画里的内容跳一下;滚动区的空态分支也改读这份冻结快照(这是调试时用假时钟用例抓到的真问题)。改动清单
ResourceCanvasAssetGenerationTasksPanelView.tsx‹→X(aria-label统一);删 footer;折叠态return nullresourceCanvasAssetGenerationTasksSidebar.cssstyles.css.game-workbench-view-tabs;播放按钮改静态定位并并入基础外观与焦点环规则;删 1000px 兜底view/project-development/index.tsxtests/*viewportX + 卡中心 × scale = 画布中心docs/*验证
tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit通过。vitest run(appSurface 全量 441 条)通过;生成任务侧栏 9 条、侧栏样式 10 条、侧栏开合与入口位置 3 条、画布手动布局 9 条通过;退场动画另有「收起时先播完再卸载且内容不跳」与「is-leaving 挂动画、减动效关掉」两条断言。check-encoding、check-doc-index通过;改动文件prettier --list-different无新增命中。mode分支、关掉自动收起 effect、把入口挪回排列方式之后、摘掉定位后的居中、把 CSS 的 is-leaving 选择器写错,共 9 处。状态
标记 WIP,原因:
Native shell tests与部分 Rust 分片在 base 上就是红的(1877aea33的 master 运行同样Native shell testsfailure;日志里是error[E0425]: cannot find function normalize_windows_policy_path in this scope),与本批前端改动无关,需要单独处理。baa93f5e3ato9e709ce727