@patternfly/react-core 5.4.6 → 5.4.8

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 (172) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/Chip/package.json +1 -1
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  22. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/DragDrop/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/Text/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/Tile/package.json +1 -1
  76. package/dist/dynamic/components/TimePicker/package.json +1 -1
  77. package/dist/dynamic/components/Timestamp/package.json +1 -1
  78. package/dist/dynamic/components/Title/package.json +1 -1
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  80. package/dist/dynamic/components/Toolbar/package.json +1 -1
  81. package/dist/dynamic/components/Tooltip/package.json +1 -1
  82. package/dist/dynamic/components/TreeView/package.json +1 -1
  83. package/dist/dynamic/components/Truncate/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/favorites/package.json +1 -1
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  104. package/dist/dynamic/helpers/package.json +1 -1
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  110. package/dist/dynamic/helpers/util/package.json +1 -1
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  112. package/dist/dynamic/layouts/Flex/package.json +1 -1
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  114. package/dist/dynamic/layouts/Grid/package.json +1 -1
  115. package/dist/dynamic/layouts/Level/package.json +1 -1
  116. package/dist/dynamic/layouts/Split/package.json +1 -1
  117. package/dist/dynamic/layouts/Stack/package.json +1 -1
  118. package/dist/dynamic/next/components/DualListSelector/package.json +1 -1
  119. package/dist/dynamic/next/components/Modal/package.json +1 -1
  120. package/dist/dynamic/next/components/package.json +1 -1
  121. package/dist/dynamic/styles/package.json +1 -1
  122. package/dist/esm/components/Dropdown/Dropdown.d.ts +4 -0
  123. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  124. package/dist/esm/components/Dropdown/Dropdown.js +15 -5
  125. package/dist/esm/components/Dropdown/Dropdown.js.map +1 -1
  126. package/dist/esm/components/Menu/MenuContainer.d.ts +4 -0
  127. package/dist/esm/components/Menu/MenuContainer.d.ts.map +1 -1
  128. package/dist/esm/components/Menu/MenuContainer.js +4 -4
  129. package/dist/esm/components/Menu/MenuContainer.js.map +1 -1
  130. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts +4 -0
  131. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  132. package/dist/esm/components/Pagination/PaginationOptionsMenu.js +4 -4
  133. package/dist/esm/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  134. package/dist/esm/components/Select/Select.d.ts +4 -0
  135. package/dist/esm/components/Select/Select.d.ts.map +1 -1
  136. package/dist/esm/components/Select/Select.js +13 -4
  137. package/dist/esm/components/Select/Select.js.map +1 -1
  138. package/dist/esm/components/Tabs/OverflowTab.d.ts +4 -0
  139. package/dist/esm/components/Tabs/OverflowTab.d.ts.map +1 -1
  140. package/dist/esm/components/Tabs/OverflowTab.js +3 -3
  141. package/dist/esm/components/Tabs/OverflowTab.js.map +1 -1
  142. package/dist/js/components/Dropdown/Dropdown.d.ts +4 -0
  143. package/dist/js/components/Dropdown/Dropdown.d.ts.map +1 -1
  144. package/dist/js/components/Dropdown/Dropdown.js +15 -5
  145. package/dist/js/components/Dropdown/Dropdown.js.map +1 -1
  146. package/dist/js/components/Menu/MenuContainer.d.ts +4 -0
  147. package/dist/js/components/Menu/MenuContainer.d.ts.map +1 -1
  148. package/dist/js/components/Menu/MenuContainer.js +4 -4
  149. package/dist/js/components/Menu/MenuContainer.js.map +1 -1
  150. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts +4 -0
  151. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  152. package/dist/js/components/Pagination/PaginationOptionsMenu.js +4 -4
  153. package/dist/js/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  154. package/dist/js/components/Select/Select.d.ts +4 -0
  155. package/dist/js/components/Select/Select.d.ts.map +1 -1
  156. package/dist/js/components/Select/Select.js +13 -4
  157. package/dist/js/components/Select/Select.js.map +1 -1
  158. package/dist/js/components/Tabs/OverflowTab.d.ts +4 -0
  159. package/dist/js/components/Tabs/OverflowTab.d.ts.map +1 -1
  160. package/dist/js/components/Tabs/OverflowTab.js +3 -3
  161. package/dist/js/components/Tabs/OverflowTab.js.map +1 -1
  162. package/dist/umd/assets/{output-D9RYQCje.css → output-DNh7MEud.css} +9409 -9400
  163. package/dist/umd/react-core.min.js +3 -3
  164. package/helpers/package.json +1 -1
  165. package/layouts/package.json +1 -1
  166. package/next/package.json +1 -1
  167. package/package.json +6 -6
  168. package/src/components/Dropdown/Dropdown.tsx +19 -4
  169. package/src/components/Menu/MenuContainer.tsx +10 -4
  170. package/src/components/Pagination/PaginationOptionsMenu.tsx +10 -4
  171. package/src/components/Select/Select.tsx +18 -3
  172. package/src/components/Tabs/OverflowTab.tsx +8 -2
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"5.4.5","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"5.4.7","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"5.4.5","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"5.4.7","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"5.4.5","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"5.4.7","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "5.4.6",
3
+ "version": "5.4.8",
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",
@@ -46,15 +46,15 @@
46
46
  "clean:exports": "node scripts/cleanDistExports.js"
47
47
  },
48
48
  "dependencies": {
49
- "@patternfly/react-icons": "^5.4.1",
50
- "@patternfly/react-styles": "^5.4.0",
51
- "@patternfly/react-tokens": "^5.4.0",
49
+ "@patternfly/react-icons": "^5.4.2",
50
+ "@patternfly/react-styles": "^5.4.1",
51
+ "@patternfly/react-tokens": "^5.4.1",
52
52
  "focus-trap": "7.6.0",
53
53
  "react-dropzone": "^14.2.3",
54
54
  "tslib": "^2.7.0"
55
55
  },
56
56
  "devDependencies": {
57
- "@patternfly/patternfly": "5.4.0",
57
+ "@patternfly/patternfly": "5.4.2",
58
58
  "css": "^3.0.0",
59
59
  "fs-extra": "^11.2.0"
60
60
  },
@@ -62,5 +62,5 @@
62
62
  "react": "^17 || ^18",
63
63
  "react-dom": "^17 || ^18"
64
64
  },
65
- "gitHead": "11da2f2182d6ab1eec0c92e9f50e9282a6ae9009"
65
+ "gitHead": "5d59bea17733b6c2f89a10a28883fb44caf84295"
66
66
  }
@@ -71,6 +71,10 @@ export interface DropdownProps extends MenuProps, OUIAProps {
71
71
  maxMenuHeight?: string;
72
72
  /** @beta Flag indicating the first menu item should be focused after opening the dropdown. */
73
73
  shouldFocusFirstItemOnOpen?: boolean;
74
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
75
+ shouldPreventScrollOnItemFocus?: boolean;
76
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
77
+ focusTimeoutDelay?: number;
74
78
  }
75
79
 
76
80
  const DropdownBase: React.FunctionComponent<DropdownProps> = ({
@@ -92,6 +96,8 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
92
96
  menuHeight,
93
97
  maxMenuHeight,
94
98
  shouldFocusFirstItemOnOpen = false,
99
+ shouldPreventScrollOnItemFocus = true,
100
+ focusTimeoutDelay = 0,
95
101
  ...props
96
102
  }: DropdownProps) => {
97
103
  const localMenuRef = React.useRef<HTMLDivElement>();
@@ -126,8 +132,8 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
126
132
  const firstElement = menuRef?.current?.querySelector(
127
133
  'li button:not(:disabled),li input:not(:disabled),li a:not([aria-disabled="true"])'
128
134
  );
129
- firstElement && (firstElement as HTMLElement).focus();
130
- }, 10);
135
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
136
+ }, focusTimeoutDelay);
131
137
  }
132
138
 
133
139
  // If the event is not on the toggle and onOpenChange callback is provided, close the menu
@@ -145,7 +151,16 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
145
151
  window.removeEventListener('keydown', handleMenuKeys);
146
152
  window.removeEventListener('click', handleClick);
147
153
  };
148
- }, [isOpen, menuRef, toggleRef, onOpenChange, onOpenChangeKeys]);
154
+ }, [
155
+ isOpen,
156
+ menuRef,
157
+ toggleRef,
158
+ onOpenChange,
159
+ onOpenChangeKeys,
160
+ shouldPreventScrollOnItemFocus,
161
+ shouldFocusFirstItemOnOpen,
162
+ focusTimeoutDelay
163
+ ]);
149
164
 
150
165
  const scrollable = maxMenuHeight !== undefined || menuHeight !== undefined || isScrollable;
151
166
 
@@ -155,7 +170,7 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
155
170
  ref={menuRef}
156
171
  onSelect={(event, value) => {
157
172
  onSelect && onSelect(event, value);
158
- shouldFocusToggleOnSelect && toggleRef.current.focus();
173
+ shouldFocusToggleOnSelect && toggleRef.current?.focus();
159
174
  }}
160
175
  isPlain={isPlain}
161
176
  isScrollable={scrollable}
@@ -37,6 +37,10 @@ export interface MenuContainerProps {
37
37
  zIndex?: number;
38
38
  /** Additional properties to pass to the Popper */
39
39
  popperProps?: MenuPopperProps;
40
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
41
+ shouldPreventScrollOnItemFocus?: boolean;
42
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
43
+ focusTimeoutDelay?: number;
40
44
  }
41
45
 
42
46
  /**
@@ -52,7 +56,9 @@ export const MenuContainer: React.FunctionComponent<MenuContainerProps> = ({
52
56
  onOpenChange,
53
57
  zIndex = 9999,
54
58
  popperProps,
55
- onOpenChangeKeys = ['Escape', 'Tab']
59
+ onOpenChangeKeys = ['Escape', 'Tab'],
60
+ shouldPreventScrollOnItemFocus = true,
61
+ focusTimeoutDelay = 0
56
62
  }: MenuContainerProps) => {
57
63
  React.useEffect(() => {
58
64
  const handleMenuKeys = (event: KeyboardEvent) => {
@@ -75,8 +81,8 @@ export const MenuContainer: React.FunctionComponent<MenuContainerProps> = ({
75
81
  const firstElement = menuRef?.current?.querySelector(
76
82
  'li button:not(:disabled),li input:not(:disabled),li a:not([aria-disabled="true"])'
77
83
  );
78
- firstElement && (firstElement as HTMLElement).focus();
79
- }, 0);
84
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
85
+ }, focusTimeoutDelay);
80
86
  }
81
87
 
82
88
  // If the event is not on the toggle and onOpenChange callback is provided, close the menu
@@ -94,7 +100,7 @@ export const MenuContainer: React.FunctionComponent<MenuContainerProps> = ({
94
100
  window.removeEventListener('keydown', handleMenuKeys);
95
101
  window.removeEventListener('click', handleClick);
96
102
  };
97
- }, [isOpen, menuRef, onOpenChange, onOpenChangeKeys, toggleRef]);
103
+ }, [focusTimeoutDelay, isOpen, menuRef, onOpenChange, onOpenChangeKeys, shouldPreventScrollOnItemFocus, toggleRef]);
98
104
 
99
105
  return (
100
106
  <Popper
@@ -56,6 +56,10 @@ export interface PaginationOptionsMenuProps extends React.HTMLProps<HTMLDivEleme
56
56
  containerRef?: React.RefObject<HTMLDivElement>;
57
57
  /** @beta The container to append the pagination options menu to. Overrides the containerRef prop. */
58
58
  appendTo?: HTMLElement | (() => HTMLElement) | 'inline';
59
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
60
+ shouldPreventScrollOnItemFocus?: boolean;
61
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
62
+ focusTimeoutDelay?: number;
59
63
  }
60
64
 
61
65
  export const PaginationOptionsMenu: React.FunctionComponent<PaginationOptionsMenuProps> = ({
@@ -80,7 +84,9 @@ export const PaginationOptionsMenu: React.FunctionComponent<PaginationOptionsMen
80
84
  toggleTemplate,
81
85
  onPerPageSelect = () => null as any,
82
86
  containerRef,
83
- appendTo
87
+ appendTo,
88
+ shouldPreventScrollOnItemFocus = true,
89
+ focusTimeoutDelay = 0
84
90
  }: PaginationOptionsMenuProps) => {
85
91
  const [isOpen, setIsOpen] = React.useState(false);
86
92
  const toggleRef = React.useRef<HTMLButtonElement>(null);
@@ -133,8 +139,8 @@ export const PaginationOptionsMenu: React.FunctionComponent<PaginationOptionsMen
133
139
  if (isOpen && toggleRef.current?.contains(event.target as Node)) {
134
140
  setTimeout(() => {
135
141
  const firstElement = menuRef?.current?.querySelector('li button:not(:disabled)');
136
- firstElement && (firstElement as HTMLElement).focus();
137
- }, 0);
142
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
143
+ }, focusTimeoutDelay);
138
144
  }
139
145
 
140
146
  // If the event is not on the toggle, close the menu
@@ -154,7 +160,7 @@ export const PaginationOptionsMenu: React.FunctionComponent<PaginationOptionsMen
154
160
  window.removeEventListener('keydown', handleMenuKeys);
155
161
  window.removeEventListener('click', handleClick);
156
162
  };
157
- }, [isOpen, menuRef]);
163
+ }, [focusTimeoutDelay, isOpen, menuRef, shouldPreventScrollOnItemFocus]);
158
164
 
159
165
  const renderItems = () =>
160
166
  perPageOptions.map(({ value, title }) => (
@@ -78,6 +78,10 @@ export interface SelectProps extends MenuProps, OUIAProps {
78
78
  maxMenuHeight?: string;
79
79
  /** Indicates if the select menu should be scrollable */
80
80
  isScrollable?: boolean;
81
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
82
+ shouldPreventScrollOnItemFocus?: boolean;
83
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
84
+ focusTimeoutDelay?: number;
81
85
  }
82
86
 
83
87
  const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
@@ -99,6 +103,8 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
99
103
  menuHeight,
100
104
  maxMenuHeight,
101
105
  isScrollable,
106
+ shouldPreventScrollOnItemFocus = true,
107
+ focusTimeoutDelay = 0,
102
108
  ...props
103
109
  }: SelectProps & OUIAProps) => {
104
110
  const localMenuRef = React.useRef<HTMLDivElement>();
@@ -131,8 +137,8 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
131
137
  if (isOpen && shouldFocusFirstItemOnOpen && toggleRef.current?.contains(event.target as Node)) {
132
138
  setTimeout(() => {
133
139
  const firstElement = menuRef?.current?.querySelector('li button:not(:disabled),li input:not(:disabled)');
134
- firstElement && (firstElement as HTMLElement).focus();
135
- }, 10);
140
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
141
+ }, focusTimeoutDelay);
136
142
  }
137
143
 
138
144
  // If the event is not on the toggle and onOpenChange callback is provided, close the menu
@@ -150,7 +156,16 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
150
156
  window.removeEventListener('keydown', handleMenuKeys);
151
157
  window.removeEventListener('click', handleClick);
152
158
  };
153
- }, [isOpen, menuRef, toggleRef, onOpenChange, onOpenChangeKeys]);
159
+ }, [
160
+ isOpen,
161
+ menuRef,
162
+ toggleRef,
163
+ onOpenChange,
164
+ onOpenChangeKeys,
165
+ shouldPreventScrollOnItemFocus,
166
+ shouldFocusFirstItemOnOpen,
167
+ focusTimeoutDelay
168
+ ]);
154
169
 
155
170
  const menu = (
156
171
  <Menu
@@ -21,6 +21,10 @@ export interface OverflowTabProps extends React.HTMLProps<HTMLLIElement> {
21
21
  toggleAriaLabel?: string;
22
22
  /** z-index of the overflow tab */
23
23
  zIndex?: number;
24
+ /** Flag indicating if scroll on focus of the first menu item should occur. */
25
+ shouldPreventScrollOnItemFocus?: boolean;
26
+ /** Time in ms to wait before firing the toggles' focus event. Defaults to 0 */
27
+ focusTimeoutDelay?: number;
24
28
  }
25
29
 
26
30
  export const OverflowTab: React.FunctionComponent<OverflowTabProps> = ({
@@ -30,6 +34,8 @@ export const OverflowTab: React.FunctionComponent<OverflowTabProps> = ({
30
34
  defaultTitleText = 'More',
31
35
  toggleAriaLabel,
32
36
  zIndex = 9999,
37
+ shouldPreventScrollOnItemFocus = true,
38
+ focusTimeoutDelay = 0,
33
39
  ...props
34
40
  }: OverflowTabProps) => {
35
41
  const menuRef = React.useRef<HTMLDivElement>();
@@ -78,9 +84,9 @@ export const OverflowTab: React.FunctionComponent<OverflowTabProps> = ({
78
84
  setTimeout(() => {
79
85
  if (menuRef?.current) {
80
86
  const firstElement = menuRef.current.querySelector('li > button,input:not(:disabled)');
81
- firstElement && (firstElement as HTMLElement).focus();
87
+ firstElement && (firstElement as HTMLElement).focus({ preventScroll: shouldPreventScrollOnItemFocus });
82
88
  }
83
- }, 0);
89
+ }, focusTimeoutDelay);
84
90
  };
85
91
 
86
92
  const overflowTab = (