From 053722a92a81661852fd62fd9da831962c85791d Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 6 Aug 2026 09:10:51 -0400 Subject: [PATCH 1/3] fix(web): make sidebar project actions reachable by keyboard and screen reader The per-project actions button in the 'Filter threads by project' menu was nested inside a menuitemradio, where ARIA menus cannot focus it: arrow keys move between items, Enter activates the radio, and screen readers flatten the button's label into the item's accessible name. Project settings (remove, rename, grouping) were mouse-only. Open project actions from a contextmenu event on the menu item itself, so Shift+F10 and the Context Menu key work the same way they already do on thread rows. The ellipsis button stays as a mouse-only affordance, hidden from assistive tech so item names announce cleanly. Fixes the remaining half of #1399. --- apps/web/src/components/SidebarV2.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/SidebarV2.tsx b/apps/web/src/components/SidebarV2.tsx index 1444d72e60c..b278686eadd 100644 --- a/apps/web/src/components/SidebarV2.tsx +++ b/apps/web/src/components/SidebarV2.tsx @@ -1587,7 +1587,7 @@ export default function SidebarV2() { ); const handleProjectActions = useCallback( - (event: ReactMouseEvent, projectGroup: SidebarProjectSnapshot) => { + (event: ReactMouseEvent, projectGroup: SidebarProjectSnapshot) => { event.preventDefault(); event.stopPropagation(); setProjectScopeMenuOpen(false); @@ -2829,6 +2829,9 @@ export default function SidebarV2() { value={scopeKey} closeOnClick className="h-8 min-h-8 px-1 py-0 text-sm font-medium [&>span:last-child]:flex [&>span:last-child]:min-w-0 [&>span:last-child]:items-center [&>span:last-child]:gap-2" + onContextMenu={(event) => { + void handleProjectActions(event, project); + }} > {project.displayName} + {/* Mouse-only affordance: hidden from AT because interactive children + are invalid inside menuitemradio and pollute its accessible name. + Keyboard/AT path is Shift+F10 (contextmenu) on the item itself. */}