|
|
@@ -81,7 +81,10 @@ function mount({
|
|
|
}
|
|
|
|
|
|
function openPanel() {
|
|
|
- fireEvent.click(screen.getByRole('button', { name: 'Settings' }))
|
|
|
+ const trigger = screen.getByRole('button', { name: 'Settings' })
|
|
|
+ trigger.focus()
|
|
|
+ fireEvent.click(trigger)
|
|
|
+ return trigger
|
|
|
}
|
|
|
|
|
|
describe('SettingsRoot trigger', () => {
|
|
|
@@ -131,26 +134,29 @@ describe('SettingsPanel chrome seats', () => {
|
|
|
})
|
|
|
|
|
|
describe('SettingsPanel close paths', () => {
|
|
|
- it('closes via the header button', () => {
|
|
|
+ it('closes via the header button and restores trigger focus', async () => {
|
|
|
mount()
|
|
|
- openPanel()
|
|
|
+ const trigger = openPanel()
|
|
|
fireEvent.click(screen.getByRole('button', { name: 'Close' }))
|
|
|
expect(screen.queryByRole('dialog')).toBeNull()
|
|
|
+ await vi.waitFor(() => { expect(document.activeElement).toBe(trigger) })
|
|
|
})
|
|
|
|
|
|
- it('closes via a mask click', () => {
|
|
|
+ it('closes via a mask click and restores trigger focus', async () => {
|
|
|
mount()
|
|
|
- openPanel()
|
|
|
+ const trigger = openPanel()
|
|
|
const dialog = screen.getByRole('dialog')
|
|
|
fireEvent.click(dialog.parentElement!.firstElementChild!)
|
|
|
expect(screen.queryByRole('dialog')).toBeNull()
|
|
|
+ await vi.waitFor(() => { expect(document.activeElement).toBe(trigger) })
|
|
|
})
|
|
|
|
|
|
- it('closes via document-level Escape and unhooks the listener with the panel', () => {
|
|
|
+ it('closes via document-level Escape, restores trigger focus, and unhooks the listener', async () => {
|
|
|
mount()
|
|
|
- openPanel()
|
|
|
+ const trigger = openPanel()
|
|
|
fireEvent.keyDown(document, { key: 'Escape' })
|
|
|
expect(screen.queryByRole('dialog')).toBeNull()
|
|
|
+ await vi.waitFor(() => { expect(document.activeElement).toBe(trigger) })
|
|
|
// Ignored while closed (listener removed with the panel) and non-Escape
|
|
|
// keys are ignored while open.
|
|
|
fireEvent.keyDown(document, { key: 'Escape' })
|