accessibility: make dropdowns accessible (#9475)

#### Motivation

Improve accessibility of dropdowns.

#### Before

Dropdowns are not accessible.

<img width="1219" alt="Screenshot 2025-01-09 at 10 00 36"
src="https://github.com/user-attachments/assets/060198f8-a42f-408c-a39a-b83da55e23c4"
/>

#### Ater

Dropdowns are accessible


![image](https://github.com/user-attachments/assets/e46d6292-913c-458b-acd4-37ed4e1a1e9b)
This commit is contained in:
Malo Marrec
2025-01-09 14:19:58 +01:00
committed by GitHub
parent e62079ab6d
commit 7126ec5ae7
7 changed files with 23 additions and 1 deletions

View File

@ -92,7 +92,11 @@ export const SingleRecordSelectMenuItemsWithSearch = ({
<DropdownMenuSeparator /> <DropdownMenuSeparator />
</> </>
)} )}
<DropdownMenuSearchInput onChange={handleSearchFilterChange} autoFocus /> <DropdownMenuSearchInput
onChange={handleSearchFilterChange}
autoFocus
role="combobox"
/>
{(dropdownPlacement?.includes('start') || {(dropdownPlacement?.includes('start') ||
isUndefinedOrNull(dropdownPlacement)) && ( isUndefinedOrNull(dropdownPlacement)) && (
<> <>

View File

@ -37,6 +37,7 @@ export const CurrencyPickerDropdownSelect = ({
value={searchFilter} value={searchFilter}
onChange={(event) => setSearchFilter(event.target.value)} onChange={(event) => setSearchFilter(event.target.value)}
autoFocus autoFocus
role="combobox"
/> />
<DropdownMenuSeparator /> <DropdownMenuSeparator />
<DropdownMenuItemsContainer hasMaxHeight> <DropdownMenuItemsContainer hasMaxHeight>

View File

@ -136,6 +136,10 @@ export const Dropdown = ({
<div <div
ref={refs.setReference} ref={refs.setReference}
onClick={handleClickableComponentClick} onClick={handleClickableComponentClick}
aria-controls={`${dropdownId}-options`}
aria-expanded={isDropdownOpen}
aria-haspopup={true}
role="button"
> >
{clickableComponent} {clickableComponent}
</div> </div>

View File

@ -122,6 +122,8 @@ export const DropdownContent = ({
<StyledDropdownContentContainer <StyledDropdownContentContainer
ref={floatingUiRefs.setFloating} ref={floatingUiRefs.setFloating}
style={dropdownMenuStyles} style={dropdownMenuStyles}
role="listbox"
id={`${dropdownId}-options`}
> >
<OverlayContainer> <OverlayContainer>
<DropdownMenu <DropdownMenu
@ -138,9 +140,12 @@ export const DropdownContent = ({
<StyledDropdownContentContainer <StyledDropdownContentContainer
ref={floatingUiRefs.setFloating} ref={floatingUiRefs.setFloating}
style={dropdownMenuStyles} style={dropdownMenuStyles}
role="listbox"
id={`${dropdownId}-options`}
> >
<OverlayContainer> <OverlayContainer>
<DropdownMenu <DropdownMenu
id={dropdownId}
className={className} className={className}
width={dropdownMenuWidth ?? dropdownWidth} width={dropdownMenuWidth ?? dropdownWidth}
data-select-disable data-select-disable

View File

@ -51,6 +51,7 @@ export const DropdownMenuItemsContainer = ({
<StyledDropdownMenuItemsExternalContainer <StyledDropdownMenuItemsExternalContainer
hasMaxHeight={hasMaxHeight} hasMaxHeight={hasMaxHeight}
className={className} className={className}
role="listbox"
> >
{hasMaxHeight ? ( {hasMaxHeight ? (
<StyledScrollWrapper <StyledScrollWrapper
@ -76,6 +77,7 @@ export const DropdownMenuItemsContainer = ({
<StyledDropdownMenuItemsExternalContainer <StyledDropdownMenuItemsExternalContainer
hasMaxHeight={hasMaxHeight} hasMaxHeight={hasMaxHeight}
className={className} className={className}
role="listbox"
> >
<StyledDropdownMenuItemsInternalContainer> <StyledDropdownMenuItemsInternalContainer>
{children} {children}

View File

@ -69,6 +69,9 @@ export const MenuItemSelect = ({
selected={selected} selected={selected}
disabled={disabled} disabled={disabled}
hovered={hovered} hovered={hovered}
role="option"
aria-selected={selected}
aria-disabled={disabled}
> >
<MenuItemLeftContent LeftIcon={LeftIcon} text={text} /> <MenuItemLeftContent LeftIcon={LeftIcon} text={text} />
{selected && needIconCheck && <IconCheck size={theme.icon.size.md} />} {selected && needIconCheck && <IconCheck size={theme.icon.size.md} />}

View File

@ -40,6 +40,9 @@ export const MenuItemSelectAvatar = ({
disabled={disabled} disabled={disabled}
hovered={hovered} hovered={hovered}
data-testid={testId} data-testid={testId}
role="option"
aria-selected={selected}
aria-disabled={disabled}
> >
<StyledMenuItemLeftContent> <StyledMenuItemLeftContent>
{avatar} {avatar}