Dialogs are not dialogs: focus is not moved in, kept in, or given back #306
Reference in New Issue
Block a user
Delete Branch "%!s()"
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?
Every dialog goes through
openModal()(web/src/dialogs.ts:3), which fills<div id="modal">(web/index.html:81) and shows it. Nothing marks it as a dialog or manages focus. Checked in Playwright on all eight (Add a feed, Settings, a feed's Settings, Download latest, Unsubscribe, OPML, Keyboard shortcuts, New signal):role="dialog",aria-modalor label on any of them, so a screen reader is not told a dialog opened, or what it is.#shellis not inert).web/src/player.ts:220), but focus then goes to<body>or to wherever Tab had wandered, not back to the button that opened it.Found in an interface review (2026-10-19). WCAG 2.4.3, 4.1.2, 1.3.1.
Fix: make
#modala<dialog>and open it withshowModal(). That makes the page behind it inert, keeps Tab inside, handles Escape, and gives focus back to the opener when it closes. Label it with its heading (aria-labelledbyon the<h3>), and focus the first field, or the dialog itself, when it opens.Fixed in
: its top layer would have covered the toasts and their Dismiss. A browser test checks Tab never reaches the page behind and Escape gives focus back. Deployed in ipx-web (1.2.1-dev).6ec2c35: the dialog card is role=dialog aria-modal, labelled by its heading, and takes focus as it opens; the rest of the page is inert until it closes, when focus goes back to what opened it. Not a