diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx index 31b1b75a2..9c2645cf3 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx @@ -6204,7 +6204,7 @@ export default function ProjectDevelopmentView({ } onClick={() => dispatchResourceReferenceInsert({ @@ -6225,7 +6225,7 @@ export default function ProjectDevelopmentView({ }) } > - @引用 + 引用 ) : null} {selectedResource ? ( diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index 20705f960..3e802d5f7 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -3154,8 +3154,11 @@ export function registerProjectWorkbenchFoundationTests() { expect(extraActions).toContain( 'label={`引用资源 ${selectedResource.label}`}', ); - expect(extraActions).toContain('title="@引用"'); - expect(extraActions).toContain('@引用'); + // 可见文案不再自带 `@`:图标本身就是 `@`(`AtSign`),文案再写一次会渲染成「@ @引用」。 + // 无障碍名(`label`)保留完整说法,读屏仍能读出「引用资源 <素材名>」。 + expect(extraActions).toContain('title="引用"'); + expect(extraActions).toContain('引用'); + expect(extraActions).not.toContain('@引用'); expect(extraActions).toMatch( / { + it('工具条里的「引用」用键盘也能插进聊天输入框', async () => { const manifest = createGameCreationAppManifest( 'workbench-resource-reference', '引用入口测试', @@ -3247,10 +3250,20 @@ export function registerProjectWorkbenchFoundationTests() { const referenceButton = within(toolbar).getByRole('button', { name: '引用资源 hero.png', }); - // 原生按钮 = 天生进 Tab 序;标题沿用「@引用」,与卡片入口时期的说法一致。 + // 原生按钮 = 天生进 Tab 序;标题与可见文案一致,且都不再自带 `@` + // —— 那个 `@` 由 `AtSign` 图标承担,文案里重复写会渲染成「@ @引用」。 expect(referenceButton.tagName).toBe('BUTTON'); expect(referenceButton.getAttribute('type')).toBe('button'); - expect(referenceButton.getAttribute('title')).toBe('@引用'); + expect(referenceButton.getAttribute('title')).toBe('引用'); + expect( + referenceButton.querySelector( + '.genarrative-image-canvas__chrome-button-label', + )?.textContent, + ).toBe('引用'); + // 无障碍名保留完整说法:图标不带语义,读屏只能靠它知道引用的是哪张素材。 + expect(referenceButton.getAttribute('aria-label')).toBe( + '引用资源 hero.png', + ); const inserted: unknown[] = []; const onInsert = (event: Event) => { @@ -3396,7 +3409,7 @@ export function registerProjectWorkbenchFoundationTests() { .getAllByRole('button') .map((button) => button.getAttribute('aria-label') ?? ''); const infoButton = within(toolbar).getByRole('button', { name: '信息' }); - // 位置固定在「@引用」之后、「编辑标签」之前:工具条上的顺序即功能顺序。 + // 位置固定在「引用」之后、「编辑标签」之前:工具条上的顺序即功能顺序。 expect(toolbarLabels.indexOf('信息')).toBeGreaterThan( toolbarLabels.indexOf('引用资源 hero.png'), ); @@ -3648,7 +3661,7 @@ export function registerProjectWorkbenchFoundationTests() { ), ).toBe(false); // 音频资源的选中工具条复用美术画布的音频分支(aria-label「素材工具栏」), - // 并且只渲染宿主编排层真实接通的动作:「@引用」(从卡片挪进工具条的引用入口, + // 并且只渲染宿主编排层真实接通的动作:「引用」(从卡片挪进工具条的引用入口, // 资源卡上的圆钮已删除)「信息」(只读信息浮层)「编辑标签」(面板只编辑 manifest // `assets[].tags`,分类不再有手动入口)「重命名」已接面板,「下载按钮」复用资源 // 面板同一条落盘链路,「改造」在宿主编排层仍是空回调,不能再渲染成点了没反应的按钮。