diff --git a/web/src/logos/logo-picker.test.ts b/web/src/logos/logo-picker.test.ts index 4dcc5cc..5d5fc14 100644 --- a/web/src/logos/logo-picker.test.ts +++ b/web/src/logos/logo-picker.test.ts @@ -534,7 +534,7 @@ describe('Mehr laden', () => { expect(document.activeElement).toBe(retryButton()); }); - it('„Nochmal versuchen“ verschwindet beim Klick: der Fokus geht sofort auf die Überschrift, nicht ins Leere', async () => { + it('„Nochmal versuchen” verschwindet beim Klick: der Fokus geht sofort auf die Überschrift, nicht ins Leere', async () => { fx.listLogos.mockRejectedValueOnce(new Error('offline')); await mount(); expect(retryButton().hidden).toBe(false); @@ -542,9 +542,11 @@ describe('Mehr laden', () => { expect(document.activeElement).toBe(retryButton()); const slow = deferred<{ logos: CommunityLogo[]; nextCursor: string | null }>(); fx.listLogos.mockReturnValue(slow.promise); + const focusSpy = vi.spyOn(heading(), 'focus'); retryButton().click(); expect(retryButton().hidden).toBe(true); expect(document.activeElement).toBe(heading()); + expect(focusSpy).toHaveBeenCalledWith({ preventScroll: true }); slow.resolve({ logos: [logo('a')], nextCursor: null }); await flush(); expect(names()).toEqual(['Kein Logo', 'Logo A']); diff --git a/web/src/logos/logo-picker.ts b/web/src/logos/logo-picker.ts index 7d5a35e..a953ab1 100644 --- a/web/src/logos/logo-picker.ts +++ b/web/src/logos/logo-picker.ts @@ -351,7 +351,13 @@ export function createLogoPicker(handlers: LogoPickerHandlers, deps: LogoPickerD // Platz einnimmt („Nochmal versuchen“ nach einem Fehler), sonst an die erste neue Kachel, sonst an die Überschrift. if ((focused === moreButton && moreButton.hidden) || (focused === retryButton && retryButton.hidden)) { const successor = [moreButton, retryButton].find((button) => !button.hidden && !button.disabled); - (successor ?? (firstNew?.isConnected ? firstNew : heading)).focus(); + if (successor) { + successor.focus(); + } else if (firstNew?.isConnected) { + firstNew.focus(); + } else { + heading.focus({ preventScroll: true }); + } } }