-
Notifications
You must be signed in to change notification settings - Fork 186
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(ActionSheet)Make ActionSheet accessible (#6955)
- Избавляемся от логики FocusTrap связянную с фокусом на первом интерактивном элементе внутри FocusTrap при условии что элемент был открыт с клавиатуры. Эта логика опирается на хук useKeyboardInputTracker, который слушает события document и устанавливает флаг keyboardInput если поймано событие нажатия клавиатуры, или сбрасывает флаг keyboardInput, если событие было от мышки. Без этой логики мы всегда будем фокусировать на элементе внутри FocusTrap, но это ничего не ломает. Визуально это не видно. Стоит заметить, что когда FocusTrap опирался на флаг keyboardInput, флаг учитывался только при монтировании компонента, и фокус попадал только если FocusTrap появился от нажатия с клавиатуры, в то же время независимо от keyboardInput при закрытии FocusTrap фокус всегда возвращался на элемент имевший фокус до открытия FocusTrap. - Убираем логику сбрасывающую фокус с активного элемента в PopoutRoot при открытии ActionSheet, так как это ломает фокус после закрытия ActionSheet, фокус не возвращается на элемент, который был активный до открытия ActionSheet. Оказалось, что фокус FocusTrap в ActionSheet не работает из NVDA, потому что NVDA вместо keydown события при нажатии Enter генерирует mousedown, а события нажатия стрелочек вообще не долетают до document, что ломает FocusTrap. В итоге получается, что если пользователь полностью полагается на NVDA, и ни разу не нажал TAB с самой загрузки страницы и пользовался лишь виртуальным буфером скринридера, то фокус в FocusTrap не попадёт и пользователь не сможет взаимодействовать с контентом внутри FocusTrap. Это касается всех компонентов, которые используют FocusTrap: Popover, Alert, ActionSheet, ... Модалки в то же время работают, потому что у них, не смотря на FocusTrap, своя логика фокуса при появлении и исчезновении. В задаче указан пример где не доступен список опций. Оказалось, что он реализован не с помощью ActionSheet, а с помощью Popover, где внутрь переданы компоненты типа CellButton. Не смотря на это данный PR также сделает его доступнее, потому что FocusTrap также используется в Popover и имеет такие же проблемы как и ActionSheet. Но, кроме этого, в реализации ActionSheet на основе Popover необходимо добавить role="dialog". Просто на Popover повесить role="dialog" в рамках библиотеки мы не можем. Хотя почему не можем. Можем, это всегда может сбросить конечный пользователь, если это требуется или перебить другим значением role, а по умолчанию пусть будет role=dialog, скринридерами он лучше всего поддерживается и наличие FocusTrap подразумевает, что пользователь скринридера должен удобно с контентом Popover взаимодействовать. Изменения Требования доступности ActionSheet Необходимо, чтобы у кнопки, открывающей ActionSheet был аттрибут aria-expanded, а у ActionSheet role="dialog" и aria-modal="true". role="dialog" нужен, чтобы не дать виртуальному буферу скринридера выйти за пределы ActionSheet. Без этого легко потерятся, особенно если ActionSheet и кнопка по которой он открывается находятся в разных частях DOM дерева. aria-modal="true" говорит, что нельзя взаимодействовать с другими частями страницы пока не закрыт ActionSheet. role="dialog" и aria-modal="true" мы выставляем сами, их легко перебить, если нужно, а aria-expanded неободимо выставлять пользователю библиотеки. Popover Если Popover по какой-то причине рендерится в портале, далеко в DOM дереве от кнопки по которой он был вызван, и имеет интерактивные элементы, то стоит ему также добавить role="dialog". aria-expanded мы выставляем самостоятельна на элементе, который открыл Popover.
- Loading branch information
Showing
18 changed files
with
138 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.