Space panel accessibility improvements (#9157)

* Move the UserMenu out of the SpacePanel ul list

* Apply aria-selected to the spacepanel treeview

* Fix typing
This commit is contained in:
Michael Telatynski 2022-08-10 13:14:54 +01:00 committed by GitHub
parent 350341d13d
commit 3d0982e9a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 44 additions and 39 deletions

View file

@ -130,7 +130,7 @@ export const AddExistingToSpace: React.FC<IAddExistingToSpaceProps> = ({
const cli = useContext(MatrixClientContext);
const visibleRooms = useMemo(() => cli.getVisibleRooms().filter(r => r.getMyMembership() === "join"), [cli]);
const scrollRef = useRef<AutoHideScrollbar>();
const scrollRef = useRef<AutoHideScrollbar<"div">>();
const [scrollState, setScrollState] = useState<IScrollState>({
// these are estimates which update as soon as it mounts
scrollTop: 0,

View file

@ -55,7 +55,7 @@ class EmojiPicker extends React.Component<IProps, IState> {
private readonly memoizedDataByCategory: Record<CategoryKey, IEmoji[]>;
private readonly categories: ICategory[];
private scrollRef = React.createRef<AutoHideScrollbar>();
private scrollRef = React.createRef<AutoHideScrollbar<"div">>();
constructor(props: IProps) {
super(props);

View file

@ -132,6 +132,7 @@ const MetaSpaceButton = ({ selected, isPanelCollapsed, ...props }: IMetaSpaceBut
"collapsed": isPanelCollapsed,
})}
role="treeitem"
aria-selected={selected}
>
<SpaceButton {...props} selected={selected} isNarrow={isPanelCollapsed} />
</li>;
@ -282,6 +283,9 @@ const InnerSpacePanel = React.memo<IInnerSpacePanelProps>(({
style={isDraggingOver ? {
pointerEvents: "none",
} : undefined}
element="ul"
role="tree"
aria-label={_t("Spaces")}
>
{ metaSpacesSection }
{ invites.map(s => (
@ -321,7 +325,7 @@ const InnerSpacePanel = React.memo<IInnerSpacePanelProps>(({
const SpacePanel = () => {
const [isPanelCollapsed, setPanelCollapsed] = useState(true);
const ref = useRef<HTMLUListElement>();
const ref = useRef<HTMLDivElement>();
useLayoutEffect(() => {
UIStore.instance.trackElementDimensions("SpacePanel", ref.current);
return () => UIStore.instance.stopTrackingElementDimensions("SpacePanel");
@ -340,11 +344,9 @@ const SpacePanel = () => {
}}>
<RovingTabIndexProvider handleHomeEnd handleUpDown>
{ ({ onKeyDownHandler }) => (
<ul
<div
className={classNames("mx_SpacePanel", { collapsed: isPanelCollapsed })}
onKeyDown={onKeyDownHandler}
role="tree"
aria-label={_t("Spaces")}
ref={ref}
>
<UserMenu isPanelCollapsed={isPanelCollapsed}>
@ -381,7 +383,7 @@ const SpacePanel = () => {
</Droppable>
<QuickSettingsButton isPanelCollapsed={isPanelCollapsed} />
</ul>
</div>
) }
</RovingTabIndexProvider>
</DragDropContext>

View file

@ -315,6 +315,7 @@ export class SpaceItem extends React.PureComponent<IItemProps, IItemState> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { tabIndex, ...restDragHandleProps } = dragHandleProps || {};
const selected = activeSpaces.includes(space.roomId);
return (
<li
@ -322,13 +323,14 @@ export class SpaceItem extends React.PureComponent<IItemProps, IItemState> {
className={itemClasses}
ref={innerRef}
aria-expanded={hasChildren ? !collapsed : undefined}
aria-selected={selected}
role="treeitem"
>
<SpaceButton
{...restDragHandleProps}
space={space}
className={isInvite ? "mx_SpaceButton_invite" : undefined}
selected={activeSpaces.includes(space.roomId)}
selected={selected}
label={this.state.name}
contextMenuTooltip={_t("Space options")}
notificationState={notificationState}