Skip to content

Commit b7b817d

Browse files
[Discover] Tabs - a11y improvements
1 parent 4fc8027 commit b7b817d

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

src/platform/packages/shared/kbn-unified-tabs/src/components/tab/tab.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ export const Tab: React.FC<TabProps> = (props) => {
264264
item={item}
265265
getTabMenuItems={getTabMenuItems}
266266
isPopoverOpen={isActionPopoverOpen}
267+
isSelected={isSelected}
267268
setPopover={onToggleActionsMenu}
268269
onEnterRenaming={onEnterRenaming}
269270
/>
@@ -273,14 +274,14 @@ export const Tab: React.FC<TabProps> = (props) => {
273274
)}
274275
{!disableCloseButton && !!onClose && (
275276
<EuiFlexItem grow={false} className="unifiedTabs__closeTabBtn">
276-
<EuiToolTip content={closeButtonLabel}>
277+
<EuiToolTip content={closeButtonLabel} disableScreenReaderOutput>
277278
<EuiButtonIcon
278-
// semantically role="tablist" does not allow other buttons in tabs
279-
aria-hidden={true}
279+
aria-label={closeButtonLabel}
280280
color="text"
281281
data-test-subj={`unifiedTabs_closeTabBtn_${item.id}`}
282282
iconType="cross"
283283
onClick={onCloseEvent}
284+
tabIndex={isSelected ? 0 : -1}
284285
/>
285286
</EuiToolTip>
286287
</EuiFlexItem>

src/platform/packages/shared/kbn-unified-tabs/src/components/tab_menu/tab_menu.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export interface TabMenuProps {
2525
item: TabItem;
2626
getTabMenuItems: GetTabMenuItems;
2727
isPopoverOpen: boolean;
28+
isSelected: boolean;
2829
setPopover: (isOpen: boolean) => void;
2930
onEnterRenaming: () => void;
3031
}
@@ -33,6 +34,7 @@ export const TabMenu: React.FC<TabMenuProps> = ({
3334
item,
3435
getTabMenuItems,
3536
isPopoverOpen,
37+
isSelected,
3638
setPopover,
3739
onEnterRenaming,
3840
}) => {
@@ -92,11 +94,10 @@ export const TabMenu: React.FC<TabMenuProps> = ({
9294
anchorPosition="downLeft"
9395
closePopover={closePopover}
9496
button={
95-
<EuiToolTip content={menuButtonLabel}>
97+
<EuiToolTip content={menuButtonLabel} disableScreenReaderOutput>
9698
<EuiButtonIcon
97-
// semantically role="tablist" does not allow other buttons in tabs
98-
aria-hidden={true}
99-
tabIndex={-1}
99+
aria-label={menuButtonLabel}
100+
tabIndex={isSelected ? 0 : -1}
100101
color="text"
101102
data-test-subj={`unifiedTabs_tabMenuBtn_${item.id}`}
102103
iconType="boxesVertical"

src/platform/packages/shared/kbn-unified-tabs/src/components/tabs_bar/tabs_bar.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type { KeyboardEvent } from 'react';
1111
import React, {
1212
useCallback,
1313
useEffect,
14+
useMemo,
1415
useRef,
1516
useState,
1617
forwardRef,
@@ -264,6 +265,11 @@ export const TabsBar = forwardRef<TabsBarApi, TabsBarProps>(
264265
[items, selectedItem, selectAndMoveFocusToItemIndex, onClose, emitOnKeyUsedEvent]
265266
);
266267

268+
const ariaOwnsValue = useMemo(
269+
() => items.map((item) => getTabIdAttribute(item)).join(' '),
270+
[items]
271+
);
272+
267273
const mainTabsBarContent = (
268274
<EuiFlexGroup
269275
responsive={false}
@@ -276,7 +282,13 @@ export const TabsBar = forwardRef<TabsBarApi, TabsBarProps>(
276282
<EuiFlexItem ref={setTabsContainerWithPlusElement} grow css={growingFlexItemCss}>
277283
<EuiFlexGroup direction="row" gutterSize="s" alignItems="center" responsive={false}>
278284
<EuiFlexItem grow={false} css={growingFlexItemCss}>
279-
<div ref={setTabsContainerElement} role="tablist" css={tabsContainerCss}>
285+
<div
286+
aria-orientation="horizontal"
287+
aria-owns={ariaOwnsValue}
288+
ref={setTabsContainerElement}
289+
role="tablist"
290+
css={tabsContainerCss}
291+
>
280292
{/*
281293
OptionalDroppable provides the drag-drop context wrapper.
282294
When disableDragAndDrop=false, it sets up EuiDragDropContext and EuiDroppable.

0 commit comments

Comments
 (0)