diff --git a/frontend/src/lib/components/document/FileSwitcherStrip.svelte b/frontend/src/lib/components/document/FileSwitcherStrip.svelte index 5598fd42..d70241bc 100644 --- a/frontend/src/lib/components/document/FileSwitcherStrip.svelte +++ b/frontend/src/lib/components/document/FileSwitcherStrip.svelte @@ -103,6 +103,7 @@ $effect(() => { > {entry.title} {#if entry.status === 'error'} + {m.bulk_file_error_chip_label()} {/if} diff --git a/frontend/src/lib/components/document/FileSwitcherStrip.svelte.spec.ts b/frontend/src/lib/components/document/FileSwitcherStrip.svelte.spec.ts index bb069e86..6a6ccc83 100644 --- a/frontend/src/lib/components/document/FileSwitcherStrip.svelte.spec.ts +++ b/frontend/src/lib/components/document/FileSwitcherStrip.svelte.spec.ts @@ -78,6 +78,27 @@ describe('FileSwitcherStrip', () => { expect(errBtn).not.toBeNull(); }); + it('error chip contains a screen-reader-only error label', async () => { + const files: FileEntry[] = [ + { + id: 'e1', + file: new File([''], 'bad.pdf'), + title: 'Bad file', + status: 'error', + previewUrl: '' + } + ]; + const { container } = render(FileSwitcherStrip, { + files, + activeId: 'e1', + onSelect: vi.fn(), + onRemove: vi.fn() + }); + const errBtn = container.querySelector('[data-status="error"]'); + const srOnly = errBtn?.querySelector('.sr-only'); + expect(srOnly).not.toBeNull(); + }); + it('ArrowRight moves focus to next chip without leaving strip', async () => { const files = makeFiles(3); const { container } = render(FileSwitcherStrip, {