Skip to content

Commit 06e91ca

Browse files
committed
fix(list): ListItem no longer focusable by default when disabled
This better mimics the button behavior that it inherits, but can still be set to 0 or another tabIndex if needed. fix #997
1 parent 0bc495d commit 06e91ca

2 files changed

Lines changed: 23 additions & 3 deletions

File tree

packages/list/src/ListItem.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,12 @@ export const ListItem = forwardRef<HTMLLIElement, ListItemProps>(
4848
rippleClassName,
4949
rippleContainerClassName,
5050
role = "button",
51-
tabIndex = 0,
51+
disabled = false,
52+
tabIndex = disabled ? -1 : 0,
5253
...props
5354
},
5455
ref
5556
) {
56-
const { disabled } = props;
57-
5857
const { ripples, className, handlers } = useInteractionStates({
5958
className: propClassName,
6059
handlers: props,
@@ -84,6 +83,7 @@ export const ListItem = forwardRef<HTMLLIElement, ListItemProps>(
8483
{...handlers}
8584
ref={ref}
8685
tabIndex={tabIndex}
86+
disabled={disabled}
8787
role={role}
8888
className={className}
8989
clickable

packages/list/src/__tests__/ListItem.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable jsx-a11y/tabindex-no-positive */
12
import React from "react";
23
import { render, fireEvent } from "@testing-library/react";
34

@@ -29,4 +30,23 @@ describe("ListItem", () => {
2930
fireEvent.click(item);
3031
expect(onClick).not.toBeCalled();
3132
});
33+
34+
it("should default the tabIndex to 0 when not disabled and to -1 when disabled", () => {
35+
const props = { children: "Content" };
36+
const { rerender, getByRole } = render(<ListItem {...props} />);
37+
const item = getByRole("button");
38+
expect(item.tabIndex).toBe(0);
39+
40+
rerender(<ListItem {...props} disabled />);
41+
expect(item.tabIndex).toBe(-1);
42+
43+
rerender(<ListItem {...props} tabIndex={1} />);
44+
expect(item.tabIndex).toBe(1);
45+
46+
rerender(<ListItem {...props} tabIndex={1} disabled />);
47+
expect(item.tabIndex).toBe(1);
48+
49+
rerender(<ListItem {...props} tabIndex={0} disabled />);
50+
expect(item.tabIndex).toBe(0);
51+
});
3252
});

0 commit comments

Comments
 (0)