From 65abf4edc66b5772be5df7690fb4ed2642115a7b Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 08:55:13 +0000 Subject: [PATCH] fix: make settings sidebar accordion items keyboard accessible (#20663) * fix: make settings sidebar accordion items keyboard accessible Co-Authored-By: sean@cal.com * fix: ensure keyboard events properly toggle accordion content Co-Authored-By: sean@cal.com * fix: add toggle functionality to accordion buttons Co-Authored-By: sean@cal.com * fix: clean up accordion code and improve keyboard accessibility Co-Authored-By: sean@cal.com * fix: add keyboard event handlers for accordion toggle Co-Authored-By: sean@cal.com --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: sean@cal.com --- .../SettingsLayoutAppDirClient.tsx | 114 +++++++++++------- 1 file changed, 73 insertions(+), 41 deletions(-) diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx index 4e356debd4..3cf08edc37 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx @@ -314,27 +314,41 @@ const TeamListCollapsible = () => { className="cursor-pointer" key={team.id} open={teamMenuState[index].teamMenuOpen} - onOpenChange={() => - setTeamMenuState([ - ...teamMenuState, - (teamMenuState[index] = { - ...teamMenuState[index], - teamMenuOpen: !teamMenuState[index].teamMenuOpen, - }), - ]) - }> + onOpenChange={(open) => { + const newTeamMenuState = [...teamMenuState]; + newTeamMenuState[index] = { + ...newTeamMenuState[index], + teamMenuOpen: open, + }; + setTeamMenuState(newTeamMenuState); + }}> -
- setTeamMenuState([ - ...teamMenuState, - (teamMenuState[index] = { - ...teamMenuState[index], + aria-controls={`team-content-${team.id}`} + aria-expanded={teamMenuState[index].teamMenuOpen} + onClick={() => { + const newTeamMenuState = [...teamMenuState]; + newTeamMenuState[index] = { + ...newTeamMenuState[index], + teamMenuOpen: !teamMenuState[index].teamMenuOpen, + }; + setTeamMenuState(newTeamMenuState); + }} + onKeyDown={(e) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + const newTeamMenuState = [...teamMenuState]; + newTeamMenuState[index] = { + ...newTeamMenuState[index], teamMenuOpen: !teamMenuState[index].teamMenuOpen, - }), - ]) - }> + }; + setTeamMenuState(newTeamMenuState); + } + }} + aria-label={`${team.name} ${ + teamMenuState[index].teamMenuOpen ? t("collapse_menu") : t("expand_menu") + }`}>
{teamMenuState[index].teamMenuOpen ? ( @@ -355,9 +369,9 @@ const TeamListCollapsible = () => { Inv. )} -
+ - + {team.accepted && ( + aria-label={t("settings_navigation")}> <> {tabsWithPermissions.map((tab) => { @@ -600,27 +614,43 @@ const SettingsSidebarContainer = ({ className="cursor-pointer" key={otherTeam.id} open={otherTeamMenuState[index].teamMenuOpen} - onOpenChange={() => - setOtherTeamMenuState([ - ...otherTeamMenuState, - (otherTeamMenuState[index] = { - ...otherTeamMenuState[index], - teamMenuOpen: !otherTeamMenuState[index].teamMenuOpen, - }), - ]) - }> + onOpenChange={(open) => { + const newOtherTeamMenuState = [...otherTeamMenuState]; + newOtherTeamMenuState[index] = { + ...newOtherTeamMenuState[index], + teamMenuOpen: open, + }; + setOtherTeamMenuState(newOtherTeamMenuState); + }}> -
- setOtherTeamMenuState([ - ...otherTeamMenuState, - (otherTeamMenuState[index] = { - ...otherTeamMenuState[index], + aria-controls={`other-team-content-${otherTeam.id}`} + aria-expanded={otherTeamMenuState[index].teamMenuOpen} + onClick={() => { + const newOtherTeamMenuState = [...otherTeamMenuState]; + newOtherTeamMenuState[index] = { + ...newOtherTeamMenuState[index], + teamMenuOpen: !otherTeamMenuState[index].teamMenuOpen, + }; + setOtherTeamMenuState(newOtherTeamMenuState); + }} + onKeyDown={(e) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + const newOtherTeamMenuState = [...otherTeamMenuState]; + newOtherTeamMenuState[index] = { + ...newOtherTeamMenuState[index], teamMenuOpen: !otherTeamMenuState[index].teamMenuOpen, - }), - ]) - }> + }; + setOtherTeamMenuState(newOtherTeamMenuState); + } + }} + aria-label={`${otherTeam.name} ${ + otherTeamMenuState[index].teamMenuOpen + ? t("collapse_menu") + : t("expand_menu") + }`}>
{otherTeamMenuState[index].teamMenuOpen ? ( @@ -636,9 +666,11 @@ const SettingsSidebarContainer = ({ /> )}

{otherTeam.name}

-
+ - +