@patternfly/react-core 5.0.0-alpha.97 → 5.0.0-alpha.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/esm/components/AboutModal/package.json +1 -1
  3. package/dist/esm/components/Accordion/package.json +1 -1
  4. package/dist/esm/components/ActionList/package.json +1 -1
  5. package/dist/esm/components/Alert/package.json +1 -1
  6. package/dist/esm/components/Avatar/package.json +1 -1
  7. package/dist/esm/components/BackToTop/package.json +1 -1
  8. package/dist/esm/components/Backdrop/package.json +1 -1
  9. package/dist/esm/components/BackgroundImage/package.json +1 -1
  10. package/dist/esm/components/Badge/package.json +1 -1
  11. package/dist/esm/components/Banner/package.json +1 -1
  12. package/dist/esm/components/Brand/package.json +1 -1
  13. package/dist/esm/components/Breadcrumb/package.json +1 -1
  14. package/dist/esm/components/Button/package.json +1 -1
  15. package/dist/esm/components/CalendarMonth/package.json +1 -1
  16. package/dist/esm/components/Card/package.json +1 -1
  17. package/dist/esm/components/Checkbox/package.json +1 -1
  18. package/dist/esm/components/Chip/package.json +1 -1
  19. package/dist/esm/components/ClipboardCopy/package.json +1 -1
  20. package/dist/esm/components/CodeBlock/package.json +1 -1
  21. package/dist/esm/components/DataList/package.json +1 -1
  22. package/dist/esm/components/DatePicker/package.json +1 -1
  23. package/dist/esm/components/DescriptionList/package.json +1 -1
  24. package/dist/esm/components/Divider/package.json +1 -1
  25. package/dist/esm/components/DragDrop/package.json +1 -1
  26. package/dist/esm/components/Drawer/package.json +1 -1
  27. package/dist/esm/components/Dropdown/DropdownItem.d.ts +1 -1
  28. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -1
  29. package/dist/esm/components/Dropdown/DropdownItem.js +1 -1
  30. package/dist/esm/components/Dropdown/DropdownItem.js.map +1 -1
  31. package/dist/esm/components/Dropdown/package.json +1 -1
  32. package/dist/esm/components/DualListSelector/package.json +1 -1
  33. package/dist/esm/components/EmptyState/package.json +1 -1
  34. package/dist/esm/components/ExpandableSection/package.json +1 -1
  35. package/dist/esm/components/FileUpload/package.json +1 -1
  36. package/dist/esm/components/Form/package.json +1 -1
  37. package/dist/esm/components/FormSelect/package.json +1 -1
  38. package/dist/esm/components/HelperText/package.json +1 -1
  39. package/dist/esm/components/Hint/package.json +1 -1
  40. package/dist/esm/components/Icon/package.json +1 -1
  41. package/dist/esm/components/InputGroup/package.json +1 -1
  42. package/dist/esm/components/JumpLinks/package.json +1 -1
  43. package/dist/esm/components/Label/Label.d.ts.map +1 -1
  44. package/dist/esm/components/Label/Label.js +8 -6
  45. package/dist/esm/components/Label/Label.js.map +1 -1
  46. package/dist/esm/components/Label/package.json +1 -1
  47. package/dist/esm/components/List/package.json +1 -1
  48. package/dist/esm/components/LoginPage/package.json +1 -1
  49. package/dist/esm/components/Masthead/package.json +1 -1
  50. package/dist/esm/components/Menu/package.json +1 -1
  51. package/dist/esm/components/MenuToggle/package.json +1 -1
  52. package/dist/esm/components/Modal/package.json +1 -1
  53. package/dist/esm/components/MultipleFileUpload/package.json +1 -1
  54. package/dist/esm/components/Nav/package.json +1 -1
  55. package/dist/esm/components/NotificationBadge/package.json +1 -1
  56. package/dist/esm/components/NotificationDrawer/package.json +1 -1
  57. package/dist/esm/components/NumberInput/package.json +1 -1
  58. package/dist/esm/components/OverflowMenu/package.json +1 -1
  59. package/dist/esm/components/Page/package.json +1 -1
  60. package/dist/esm/components/Pagination/package.json +1 -1
  61. package/dist/esm/components/Panel/package.json +1 -1
  62. package/dist/esm/components/Popover/package.json +1 -1
  63. package/dist/esm/components/Progress/package.json +1 -1
  64. package/dist/esm/components/ProgressStepper/package.json +1 -1
  65. package/dist/esm/components/Radio/package.json +1 -1
  66. package/dist/esm/components/SearchInput/package.json +1 -1
  67. package/dist/esm/components/Select/package.json +1 -1
  68. package/dist/esm/components/Sidebar/package.json +1 -1
  69. package/dist/esm/components/SimpleList/package.json +1 -1
  70. package/dist/esm/components/Skeleton/package.json +1 -1
  71. package/dist/esm/components/SkipToContent/package.json +1 -1
  72. package/dist/esm/components/Slider/package.json +1 -1
  73. package/dist/esm/components/Spinner/package.json +1 -1
  74. package/dist/esm/components/Switch/package.json +1 -1
  75. package/dist/esm/components/Tabs/package.json +1 -1
  76. package/dist/esm/components/Text/package.json +1 -1
  77. package/dist/esm/components/TextArea/package.json +1 -1
  78. package/dist/esm/components/TextInput/package.json +1 -1
  79. package/dist/esm/components/TextInputGroup/package.json +1 -1
  80. package/dist/esm/components/Tile/package.json +1 -1
  81. package/dist/esm/components/TimePicker/package.json +1 -1
  82. package/dist/esm/components/Timestamp/package.json +1 -1
  83. package/dist/esm/components/Title/package.json +1 -1
  84. package/dist/esm/components/ToggleGroup/package.json +1 -1
  85. package/dist/esm/components/Toolbar/package.json +1 -1
  86. package/dist/esm/components/Tooltip/package.json +1 -1
  87. package/dist/esm/components/TreeView/package.json +1 -1
  88. package/dist/esm/components/Truncate/package.json +1 -1
  89. package/dist/esm/components/Wizard/hooks/package.json +1 -1
  90. package/dist/esm/components/Wizard/package.json +1 -1
  91. package/dist/esm/components/package.json +1 -1
  92. package/dist/esm/deprecated/components/ApplicationLauncher/package.json +1 -1
  93. package/dist/esm/deprecated/components/ContextSelector/package.json +1 -1
  94. package/dist/esm/deprecated/components/Dropdown/package.json +1 -1
  95. package/dist/esm/deprecated/components/OptionsMenu/package.json +1 -1
  96. package/dist/esm/deprecated/components/PageHeader/package.json +1 -1
  97. package/dist/esm/deprecated/components/Select/package.json +1 -1
  98. package/dist/esm/deprecated/components/Wizard/package.json +1 -1
  99. package/dist/esm/deprecated/components/package.json +1 -1
  100. package/dist/esm/deprecated/package.json +1 -1
  101. package/dist/esm/helpers/Popper/thirdparty/popper-core/package.json +1 -1
  102. package/dist/esm/helpers/package.json +1 -1
  103. package/dist/esm/layouts/Bullseye/package.json +1 -1
  104. package/dist/esm/layouts/Flex/package.json +1 -1
  105. package/dist/esm/layouts/Gallery/package.json +1 -1
  106. package/dist/esm/layouts/Grid/package.json +1 -1
  107. package/dist/esm/layouts/Level/package.json +1 -1
  108. package/dist/esm/layouts/Split/package.json +1 -1
  109. package/dist/esm/layouts/Stack/package.json +1 -1
  110. package/dist/esm/layouts/package.json +1 -1
  111. package/dist/esm/next/components/package.json +1 -1
  112. package/dist/esm/next/package.json +1 -1
  113. package/dist/esm/package.json +1 -1
  114. package/dist/js/components/AboutModal/package.json +1 -1
  115. package/dist/js/components/Accordion/package.json +1 -1
  116. package/dist/js/components/ActionList/package.json +1 -1
  117. package/dist/js/components/Alert/package.json +1 -1
  118. package/dist/js/components/Avatar/package.json +1 -1
  119. package/dist/js/components/BackToTop/package.json +1 -1
  120. package/dist/js/components/Backdrop/package.json +1 -1
  121. package/dist/js/components/BackgroundImage/package.json +1 -1
  122. package/dist/js/components/Badge/package.json +1 -1
  123. package/dist/js/components/Banner/package.json +1 -1
  124. package/dist/js/components/Brand/package.json +1 -1
  125. package/dist/js/components/Breadcrumb/package.json +1 -1
  126. package/dist/js/components/Button/package.json +1 -1
  127. package/dist/js/components/CalendarMonth/package.json +1 -1
  128. package/dist/js/components/Card/package.json +1 -1
  129. package/dist/js/components/Checkbox/package.json +1 -1
  130. package/dist/js/components/Chip/package.json +1 -1
  131. package/dist/js/components/ClipboardCopy/package.json +1 -1
  132. package/dist/js/components/CodeBlock/package.json +1 -1
  133. package/dist/js/components/DataList/package.json +1 -1
  134. package/dist/js/components/DatePicker/package.json +1 -1
  135. package/dist/js/components/DescriptionList/package.json +1 -1
  136. package/dist/js/components/Divider/package.json +1 -1
  137. package/dist/js/components/DragDrop/package.json +1 -1
  138. package/dist/js/components/Drawer/package.json +1 -1
  139. package/dist/js/components/Dropdown/DropdownItem.d.ts +1 -1
  140. package/dist/js/components/Dropdown/DropdownItem.d.ts.map +1 -1
  141. package/dist/js/components/Dropdown/DropdownItem.js +1 -1
  142. package/dist/js/components/Dropdown/DropdownItem.js.map +1 -1
  143. package/dist/js/components/Dropdown/package.json +1 -1
  144. package/dist/js/components/DualListSelector/package.json +1 -1
  145. package/dist/js/components/EmptyState/package.json +1 -1
  146. package/dist/js/components/ExpandableSection/package.json +1 -1
  147. package/dist/js/components/FileUpload/package.json +1 -1
  148. package/dist/js/components/Form/package.json +1 -1
  149. package/dist/js/components/FormSelect/package.json +1 -1
  150. package/dist/js/components/HelperText/package.json +1 -1
  151. package/dist/js/components/Hint/package.json +1 -1
  152. package/dist/js/components/Icon/package.json +1 -1
  153. package/dist/js/components/InputGroup/package.json +1 -1
  154. package/dist/js/components/JumpLinks/package.json +1 -1
  155. package/dist/js/components/Label/Label.d.ts.map +1 -1
  156. package/dist/js/components/Label/Label.js +8 -6
  157. package/dist/js/components/Label/Label.js.map +1 -1
  158. package/dist/js/components/Label/package.json +1 -1
  159. package/dist/js/components/List/package.json +1 -1
  160. package/dist/js/components/LoginPage/package.json +1 -1
  161. package/dist/js/components/Masthead/package.json +1 -1
  162. package/dist/js/components/Menu/package.json +1 -1
  163. package/dist/js/components/MenuToggle/package.json +1 -1
  164. package/dist/js/components/Modal/package.json +1 -1
  165. package/dist/js/components/MultipleFileUpload/package.json +1 -1
  166. package/dist/js/components/Nav/package.json +1 -1
  167. package/dist/js/components/NotificationBadge/package.json +1 -1
  168. package/dist/js/components/NotificationDrawer/package.json +1 -1
  169. package/dist/js/components/NumberInput/package.json +1 -1
  170. package/dist/js/components/OverflowMenu/package.json +1 -1
  171. package/dist/js/components/Page/package.json +1 -1
  172. package/dist/js/components/Pagination/package.json +1 -1
  173. package/dist/js/components/Panel/package.json +1 -1
  174. package/dist/js/components/Popover/package.json +1 -1
  175. package/dist/js/components/Progress/package.json +1 -1
  176. package/dist/js/components/ProgressStepper/package.json +1 -1
  177. package/dist/js/components/Radio/package.json +1 -1
  178. package/dist/js/components/SearchInput/package.json +1 -1
  179. package/dist/js/components/Select/package.json +1 -1
  180. package/dist/js/components/Sidebar/package.json +1 -1
  181. package/dist/js/components/SimpleList/package.json +1 -1
  182. package/dist/js/components/Skeleton/package.json +1 -1
  183. package/dist/js/components/SkipToContent/package.json +1 -1
  184. package/dist/js/components/Slider/package.json +1 -1
  185. package/dist/js/components/Spinner/package.json +1 -1
  186. package/dist/js/components/Switch/package.json +1 -1
  187. package/dist/js/components/Tabs/package.json +1 -1
  188. package/dist/js/components/Text/package.json +1 -1
  189. package/dist/js/components/TextArea/package.json +1 -1
  190. package/dist/js/components/TextInput/package.json +1 -1
  191. package/dist/js/components/TextInputGroup/package.json +1 -1
  192. package/dist/js/components/Tile/package.json +1 -1
  193. package/dist/js/components/TimePicker/package.json +1 -1
  194. package/dist/js/components/Timestamp/package.json +1 -1
  195. package/dist/js/components/Title/package.json +1 -1
  196. package/dist/js/components/ToggleGroup/package.json +1 -1
  197. package/dist/js/components/Toolbar/package.json +1 -1
  198. package/dist/js/components/Tooltip/package.json +1 -1
  199. package/dist/js/components/TreeView/package.json +1 -1
  200. package/dist/js/components/Truncate/package.json +1 -1
  201. package/dist/js/components/Wizard/hooks/package.json +1 -1
  202. package/dist/js/components/Wizard/package.json +1 -1
  203. package/dist/js/components/package.json +1 -1
  204. package/dist/js/deprecated/components/ApplicationLauncher/package.json +1 -1
  205. package/dist/js/deprecated/components/ContextSelector/package.json +1 -1
  206. package/dist/js/deprecated/components/Dropdown/package.json +1 -1
  207. package/dist/js/deprecated/components/OptionsMenu/package.json +1 -1
  208. package/dist/js/deprecated/components/PageHeader/package.json +1 -1
  209. package/dist/js/deprecated/components/Select/package.json +1 -1
  210. package/dist/js/deprecated/components/Wizard/package.json +1 -1
  211. package/dist/js/deprecated/components/package.json +1 -1
  212. package/dist/js/deprecated/package.json +1 -1
  213. package/dist/js/helpers/Popper/thirdparty/popper-core/package.json +1 -1
  214. package/dist/js/helpers/package.json +1 -1
  215. package/dist/js/layouts/Bullseye/package.json +1 -1
  216. package/dist/js/layouts/Flex/package.json +1 -1
  217. package/dist/js/layouts/Gallery/package.json +1 -1
  218. package/dist/js/layouts/Grid/package.json +1 -1
  219. package/dist/js/layouts/Level/package.json +1 -1
  220. package/dist/js/layouts/Split/package.json +1 -1
  221. package/dist/js/layouts/Stack/package.json +1 -1
  222. package/dist/js/layouts/package.json +1 -1
  223. package/dist/js/next/components/package.json +1 -1
  224. package/dist/js/next/package.json +1 -1
  225. package/dist/js/package.json +1 -1
  226. package/dist/umd/react-core.min.js +3 -3
  227. package/package.json +3 -3
  228. package/src/components/Dropdown/DropdownItem.tsx +4 -3
  229. package/src/components/Label/Label.tsx +21 -20
  230. package/src/components/Popover/examples/Popover.md +11 -0
  231. package/src/components/Popover/examples/PopoverAlert.tsx +1 -0
  232. package/src/components/Popover/examples/PopoverWidthAuto.tsx +1 -0
  233. package/src/components/Popover/examples/PopoverWithIconInTheTitle.tsx +1 -0
  234. package/src/components/Wizard/hooks/__tests__/useWizardFooter.test.tsx +1 -1
  235. package/src/demos/examples/DashboardWrapper.js +1 -1
  236. package/src/demos/examples/Tabs/TabsAndTable.tsx +38 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "5.0.0-alpha.97",
3
+ "version": "5.0.0-alpha.99",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -49,7 +49,7 @@
49
49
  "@patternfly/react-icons": "^5.0.0-alpha.14",
50
50
  "@patternfly/react-styles": "^5.0.0-alpha.10",
51
51
  "@patternfly/react-tokens": "^5.0.0-alpha.9",
52
- "focus-trap": "7.4.0",
52
+ "focus-trap": "7.4.1",
53
53
  "react-dropzone": "^14.2.3",
54
54
  "tslib": "^2.5.0"
55
55
  },
@@ -71,5 +71,5 @@
71
71
  "react": "^17 || ^18",
72
72
  "react-dom": "^17 || ^18"
73
73
  },
74
- "gitHead": "2f2eb377c744647e34d557e1550ae7a01f87f5a6"
74
+ "gitHead": "00f77395c5d7d3e1fb8fc44c337cfdb63ab31638"
75
75
  }
@@ -27,7 +27,7 @@ export interface DropdownItemProps extends Omit<MenuItemProps, 'ref'>, OUIAProps
27
27
  ouiaSafe?: boolean;
28
28
  }
29
29
 
30
- const DropdownItemBase: React.FunctionComponent<MenuItemProps> = ({
30
+ const DropdownItemBase: React.FunctionComponent<DropdownItemProps> = ({
31
31
  children,
32
32
  className,
33
33
  description,
@@ -42,12 +42,12 @@ const DropdownItemBase: React.FunctionComponent<MenuItemProps> = ({
42
42
  const ouiaProps = useOUIAProps(DropdownItem.displayName, ouiaId, ouiaSafe);
43
43
  return (
44
44
  <MenuItem
45
- ref={innerRef}
46
45
  className={css(className)}
47
46
  description={description}
48
47
  isDisabled={isDisabled}
49
48
  itemId={itemId}
50
49
  onClick={onClick}
50
+ ref={innerRef}
51
51
  {...ouiaProps}
52
52
  {...props}
53
53
  >
@@ -55,7 +55,8 @@ const DropdownItemBase: React.FunctionComponent<MenuItemProps> = ({
55
55
  </MenuItem>
56
56
  );
57
57
  };
58
- export const DropdownItem = React.forwardRef((props: DropdownItemProps, ref: React.Ref<any>) => (
58
+
59
+ export const DropdownItem = React.forwardRef((props: DropdownItemProps, ref: React.Ref<HTMLAnchorElement | HTMLButtonElement>) => (
59
60
  <DropdownItemBase {...props} innerRef={ref} />
60
61
  ));
61
62
 
@@ -232,30 +232,31 @@ export const Label: React.FunctionComponent<LabelProps> = ({
232
232
  setCurrValue(editableInputRef.current.value);
233
233
  };
234
234
 
235
- let labelComponentChild = <span className={css(styles.labelContent)}>{content}</span>;
236
-
235
+ let LabelComponentChildElement = 'span';
237
236
  if (href) {
238
- labelComponentChild = (
239
- <a className={css(styles.labelContent)} href={href}>
240
- {content}
241
- </a>
242
- );
237
+ LabelComponentChildElement = 'a';
243
238
  } else if (isEditable) {
244
- labelComponentChild = (
245
- <button
246
- ref={editableButtonRef}
247
- className={css(styles.labelContent)}
248
- onClick={(e: React.MouseEvent) => {
249
- setIsEditableActive(true);
250
- e.stopPropagation();
251
- }}
252
- {...editableProps}
253
- >
254
- {content}
255
- </button>
256
- );
239
+ LabelComponentChildElement = 'button';
257
240
  }
258
241
 
242
+ const labelComponentChildProps = {
243
+ className: css(styles.labelContent),
244
+ ...(isTooltipVisible && { tabIndex: 0 }),
245
+ ...(href && { href }),
246
+ ...(isEditable && {
247
+ ref: editableButtonRef,
248
+ onClick: (e: React.MouseEvent) => {
249
+ setIsEditableActive(true);
250
+ e.stopPropagation();
251
+ },
252
+ ...editableProps
253
+ })
254
+ };
255
+
256
+ let labelComponentChild = (
257
+ <LabelComponentChildElement {...labelComponentChildProps}>{content}</LabelComponentChildElement>
258
+ );
259
+
259
260
  if (render) {
260
261
  labelComponentChild = (
261
262
  <React.Fragment>
@@ -14,6 +14,11 @@ import BullhornIcon from '@patternfly/react-icons/dist/esm/icons/bullhorn-icon';
14
14
 
15
15
  ## Examples
16
16
 
17
+ By default, the `appendTo` prop of the popover will append it to the parent element. However, in some cases, the popover might be too big for the parent and not fully visible. To solve this issue, users have two options:
18
+
19
+ 1. Add the prop `appendTo={() => document.body}` to append the popover to the document body instead of the parent element.
20
+ 2. Increase the z-index of the parent element to be higher than the z-index of the element that is hiding the popover.
21
+
17
22
  ### Basic
18
23
 
19
24
  ```ts file="./PopoverBasic.tsx"
@@ -38,6 +43,8 @@ Note: If you use the isVisible prop, either refer to the example above or if you
38
43
 
39
44
  ### Width auto
40
45
 
46
+ Here the popover goes over the navigation, so the prop `appendTo` is set to the documents body.
47
+
41
48
  ```ts file="./PopoverWidthAuto.tsx"
42
49
  ```
43
50
 
@@ -58,10 +65,14 @@ Note: If you use the isVisible prop, either refer to the example above or if you
58
65
 
59
66
  ### Popover with icon in the title
60
67
 
68
+ Here the popover goes over the navigation, so the prop `appendTo` is set to the documents body.
69
+
61
70
  ```ts file="./PopoverWithIconInTheTitle.tsx"
62
71
  ```
63
72
 
64
73
  ### Alert popover
65
74
 
75
+ Here the popover goes over the navigation, so the prop `appendTo` is set to the documents body.
76
+
66
77
  ```ts file="./PopoverAlert.tsx"
67
78
  ```
@@ -38,6 +38,7 @@ export const AlertPopover: React.FunctionComponent = () => {
38
38
  headerComponent="h1"
39
39
  bodyContent={<div>Popovers are triggered by click rather than hover.</div>}
40
40
  footerContent="Popover footer"
41
+ appendTo={() => document.body}
41
42
  >
42
43
  <Button>Toggle popover</Button>
43
44
  </Popover>
@@ -7,6 +7,7 @@ export const PopoverWidthAuto: React.FunctionComponent = () => (
7
7
  aria-label="Popover with auto-width"
8
8
  hasAutoWidth
9
9
  bodyContent={() => <div>Removes fixed-width and allows width to be defined by contents</div>}
10
+ appendTo={() => document.body}
10
11
  >
11
12
  <Button>Toggle popover</Button>
12
13
  </Popover>
@@ -10,6 +10,7 @@ export const PopoverWithIconInTheTitle: React.FunctionComponent = () => (
10
10
  headerIcon={<BullhornIcon />}
11
11
  bodyContent={<div>Popovers are triggered by click rather than hover.</div>}
12
12
  footerContent="Popover footer"
13
+ appendTo={() => document.body}
13
14
  >
14
15
  <Button>Toggle popover</Button>
15
16
  </Popover>
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
 
3
- import { renderHook } from '@testing-library/react-hooks';
3
+ import { renderHook } from '@testing-library/react';
4
4
 
5
5
  import { useWizardFooter } from '../useWizardFooter';
6
6
  import * as WizardContext from '../../WizardContext';
@@ -58,7 +58,7 @@ export default class DashboardWrapper extends React.Component {
58
58
  header,
59
59
  sidebar,
60
60
  sidebarNavOpen,
61
- onPageResize,
61
+ onPageResize = () => {},
62
62
  hasNoBreadcrumb,
63
63
  notificationDrawer,
64
64
  isNotificationDrawerExpanded,
@@ -56,6 +56,7 @@ import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-i
56
56
  import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
57
57
  import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';
58
58
  import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon';
59
+ import { KeyTypes } from '../../../helpers';
59
60
 
60
61
  interface Repository {
61
62
  name: string;
@@ -135,15 +136,47 @@ export const TablesAndTabs = () => {
135
136
  }
136
137
  ];
137
138
 
139
+ const firstActionRef = React.useRef<HTMLButtonElement>(null);
140
+
141
+ /** Handles when the user clicks on the custom action toggle, stops propagation to prevent the drawer from opening */
142
+ const handleActionsToggleClick = (event: React.MouseEvent, ActionsToggleProps: CustomActionsToggleProps) => {
143
+ const { onToggle } = ActionsToggleProps;
144
+
145
+ onToggle(event);
146
+ event.stopPropagation();
147
+ };
148
+
149
+ /** Enables keyboard navigation of the custom actions toggle */
150
+ const handleActionsToggleKeyDown = (event: React.KeyboardEvent, ActionsToggleProps: CustomActionsToggleProps) => {
151
+ const { onToggle } = ActionsToggleProps;
152
+ const { Enter, Space, Escape, ArrowDown, ArrowUp } = KeyTypes;
153
+
154
+ const shouldToggle = [Enter, Space, Escape].includes(event.key);
155
+ const shouldFocus = [ArrowDown, ArrowUp, Enter, Space].includes(event.key);
156
+
157
+ if (shouldToggle) {
158
+ event.preventDefault();
159
+ event.stopPropagation();
160
+ onToggle(event);
161
+ }
162
+
163
+ if (shouldFocus) {
164
+ setTimeout(() => {
165
+ firstActionRef.current?.focus();
166
+ }, 0);
167
+ }
168
+ };
169
+
138
170
  const customActionsToggle = (props: CustomActionsToggleProps, toggleName: string) => (
139
171
  <MenuToggle
140
172
  isDisabled={props.isDisabled}
141
- onClick={(event: any) => {
142
- props.onToggle(event);
143
- event.stopPropagation();
144
- }}
173
+ onClick={(event: React.MouseEvent) => handleActionsToggleClick(event, props)}
174
+ onKeyDown={(event: React.KeyboardEvent) => handleActionsToggleKeyDown(event, props)}
145
175
  variant="plain"
146
176
  aria-label={`${toggleName} actions`}
177
+ aria-haspopup="menu"
178
+ isExpanded={props.isOpen}
179
+ ref={props.toggleRef}
147
180
  >
148
181
  <EllipsisVIcon />
149
182
  </MenuToggle>
@@ -270,6 +303,7 @@ export const TablesAndTabs = () => {
270
303
  <ActionsColumn
271
304
  items={defaultActions}
272
305
  actionsToggle={(props: CustomActionsToggleProps) => customActionsToggle(props, repo.name)}
306
+ firstActionItemRef={firstActionRef}
273
307
  />
274
308
  </Td>
275
309
  </Tr>